@bemoje/cli 0.0.4 → 0.0.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.
Files changed (698) hide show
  1. package/.eslintrc.json +5 -0
  2. package/.swcrc +32 -0
  3. package/dist/cjs/_example/bFindIn.js +189 -0
  4. package/dist/cjs/_example/bFindIn.js.map +1 -0
  5. package/dist/cjs/arg/ArgumentBuilder.js +45 -0
  6. package/dist/cjs/arg/ArgumentBuilder.js.map +1 -0
  7. package/dist/cjs/arg/ArgumentParserSelector.js +15 -0
  8. package/dist/cjs/arg/ArgumentParserSelector.js.map +1 -0
  9. package/dist/cjs/arg/ArgumentReader.js +38 -0
  10. package/dist/cjs/arg/ArgumentReader.js.map +1 -0
  11. package/dist/cjs/arg/ArgumentValidatorSelector.js +16 -0
  12. package/dist/cjs/arg/ArgumentValidatorSelector.js.map +1 -0
  13. package/dist/cjs/cmd/CommandBuilder.js +1080 -0
  14. package/dist/cjs/cmd/CommandBuilder.js.map +1 -0
  15. package/dist/cjs/cmd/CommandBuilderMetaData.js +44 -0
  16. package/dist/cjs/cmd/CommandBuilderMetaData.js.map +1 -0
  17. package/dist/cjs/cmd/CommandFeatureSelector.js +112 -0
  18. package/dist/cjs/cmd/CommandFeatureSelector.js.map +1 -0
  19. package/dist/cjs/cmd/DefaultHelpConfig.js +141 -0
  20. package/dist/cjs/cmd/DefaultHelpConfig.js.map +1 -0
  21. package/dist/cjs/cmd/asdas.js +27 -0
  22. package/dist/cjs/cmd/asdas.js.map +1 -0
  23. package/dist/cjs/core/OutputManager.js +99 -0
  24. package/dist/cjs/core/OutputManager.js.map +1 -0
  25. package/dist/cjs/core/ParserSelector.js +36 -0
  26. package/dist/cjs/core/ParserSelector.js.map +1 -0
  27. package/dist/cjs/core/ValidatorSelector.js +36 -0
  28. package/dist/cjs/core/ValidatorSelector.js.map +1 -0
  29. package/dist/cjs/core/splitCombinedArgvShorts.js +15 -0
  30. package/dist/cjs/core/splitCombinedArgvShorts.js.map +1 -0
  31. package/dist/cjs/db/AbstractJsonFileSection.js +190 -0
  32. package/dist/cjs/db/AbstractJsonFileSection.js.map +1 -0
  33. package/dist/cjs/db/AppDataSection.js +48 -0
  34. package/dist/cjs/db/AppDataSection.js.map +1 -0
  35. package/dist/cjs/db/ConfigSection.js +71 -0
  36. package/dist/cjs/db/ConfigSection.js.map +1 -0
  37. package/dist/cjs/db/JsonFile.js +55 -0
  38. package/dist/cjs/db/JsonFile.js.map +1 -0
  39. package/dist/cjs/db/PresetsSection.js +92 -0
  40. package/dist/cjs/db/PresetsSection.js.map +1 -0
  41. package/dist/cjs/index.js +119 -0
  42. package/dist/cjs/index.js.map +1 -0
  43. package/dist/cjs/opt/OptionArgumentParserSelector.js +16 -0
  44. package/dist/cjs/opt/OptionArgumentParserSelector.js.map +1 -0
  45. package/dist/cjs/opt/OptionArgumentValidatorSelector.js +19 -0
  46. package/dist/cjs/opt/OptionArgumentValidatorSelector.js.map +1 -0
  47. package/dist/cjs/opt/OptionBuilder.js +88 -0
  48. package/dist/cjs/opt/OptionBuilder.js.map +1 -0
  49. package/dist/cjs/opt/OptionHelpers.js +57 -0
  50. package/dist/cjs/opt/OptionHelpers.js.map +1 -0
  51. package/dist/cjs/opt/OptionReader.js +66 -0
  52. package/dist/cjs/opt/OptionReader.js.map +1 -0
  53. package/dist/cjs/types/IConfig.js +3 -0
  54. package/dist/cjs/types/IConfig.js.map +1 -0
  55. package/dist/cjs/types/IPreset.js +3 -0
  56. package/dist/cjs/types/IPreset.js.map +1 -0
  57. package/dist/cjs/util/array/arrLast.js +21 -0
  58. package/dist/cjs/util/array/arrLast.js.map +1 -0
  59. package/dist/cjs/util/array/arrSome.js +26 -0
  60. package/dist/cjs/util/array/arrSome.js.map +1 -0
  61. package/dist/cjs/util/array/types/ArrayPredicate.js +3 -0
  62. package/dist/cjs/util/array/types/ArrayPredicate.js.map +1 -0
  63. package/dist/cjs/util/db/JsonDB.js +145 -0
  64. package/dist/cjs/util/db/JsonDB.js.map +1 -0
  65. package/dist/cjs/util/errors/ErrorParser.js +164 -0
  66. package/dist/cjs/util/errors/ErrorParser.js.map +1 -0
  67. package/dist/cjs/util/fs/promptUserEditInTextEditor/IGetUserInputFromEditorOptions.js +3 -0
  68. package/dist/cjs/util/fs/promptUserEditInTextEditor/IGetUserInputFromEditorOptions.js.map +1 -0
  69. package/dist/cjs/util/fs/promptUserEditInTextEditor/promptUserEditInTextEditorSync.js +32 -0
  70. package/dist/cjs/util/fs/promptUserEditInTextEditor/promptUserEditInTextEditorSync.js.map +1 -0
  71. package/dist/cjs/util/fs/promptUserEditInTextEditor/promptUserEditJsonInTextEditorSync.js +25 -0
  72. package/dist/cjs/util/fs/promptUserEditInTextEditor/promptUserEditJsonInTextEditorSync.js.map +1 -0
  73. package/dist/cjs/util/fs/readFile/readFileSafeSync.js +28 -0
  74. package/dist/cjs/util/fs/readFile/readFileSafeSync.js.map +1 -0
  75. package/dist/cjs/util/fs/readFile/readFileSync.js +20 -0
  76. package/dist/cjs/util/fs/readFile/readFileSync.js.map +1 -0
  77. package/dist/cjs/util/fs/readJsonFile/readJsonFileSafeSync.js +24 -0
  78. package/dist/cjs/util/fs/readJsonFile/readJsonFileSafeSync.js.map +1 -0
  79. package/dist/cjs/util/fs/removeFile/removeFile.js +6 -0
  80. package/dist/cjs/util/fs/removeFile/removeFile.js.map +1 -0
  81. package/dist/cjs/util/fs/tempFile/tempFileSync.js +28 -0
  82. package/dist/cjs/util/fs/tempFile/tempFileSync.js.map +1 -0
  83. package/dist/cjs/util/fs/types/IReadJsonFileOptions.js +3 -0
  84. package/dist/cjs/util/fs/types/IReadJsonFileOptions.js.map +1 -0
  85. package/dist/cjs/util/fs/writeFile/writeFileSafeSync.js +6 -0
  86. package/dist/cjs/util/fs/writeFile/writeFileSafeSync.js.map +1 -0
  87. package/dist/cjs/util/fs/writeFile/writeFileSync.js +6 -0
  88. package/dist/cjs/util/fs/writeFile/writeFileSync.js.map +1 -0
  89. package/dist/cjs/util/fs/writeJsonFile/writeJsonFileSafe.js +6 -0
  90. package/dist/cjs/util/fs/writeJsonFile/writeJsonFileSafe.js.map +1 -0
  91. package/dist/cjs/util/function/MethodDisabler.js +94 -0
  92. package/dist/cjs/util/function/MethodDisabler.js.map +1 -0
  93. package/dist/cjs/util/function/funSetName.js +21 -0
  94. package/dist/cjs/util/function/funSetName.js.map +1 -0
  95. package/dist/cjs/util/node/execInherit.js +19 -0
  96. package/dist/cjs/util/node/execInherit.js.map +1 -0
  97. package/dist/cjs/util/node/formatTableForTerminal.js +21 -0
  98. package/dist/cjs/util/node/formatTableForTerminal.js.map +1 -0
  99. package/dist/cjs/util/object/arrAssign.js +6 -0
  100. package/dist/cjs/util/object/arrAssign.js.map +1 -0
  101. package/dist/cjs/util/object/createArrayMerger.js +20 -0
  102. package/dist/cjs/util/object/createArrayMerger.js.map +1 -0
  103. package/dist/cjs/util/object/createObjectMerger.js +20 -0
  104. package/dist/cjs/util/object/createObjectMerger.js.map +1 -0
  105. package/dist/cjs/util/object/objAssign.js +6 -0
  106. package/dist/cjs/util/object/objAssign.js.map +1 -0
  107. package/dist/cjs/util/object/objUpdatePropertyDescriptors.js +28 -0
  108. package/dist/cjs/util/object/objUpdatePropertyDescriptors.js.map +1 -0
  109. package/dist/cjs/util/object/realizeLazyProperty.js +14 -0
  110. package/dist/cjs/util/object/realizeLazyProperty.js.map +1 -0
  111. package/dist/cjs/util/object/setNonEnumerable.js +25 -0
  112. package/dist/cjs/util/object/setNonEnumerable.js.map +1 -0
  113. package/dist/cjs/util/os/defaultOpenInEditorCommand.js +18 -0
  114. package/dist/cjs/util/os/defaultOpenInEditorCommand.js.map +1 -0
  115. package/dist/cjs/util/os/isOSX.js +13 -0
  116. package/dist/cjs/util/os/isOSX.js.map +1 -0
  117. package/dist/cjs/util/os/isVsCodeInstalled.js +19 -0
  118. package/dist/cjs/util/os/isVsCodeInstalled.js.map +1 -0
  119. package/dist/cjs/util/os/isWindows.js +16 -0
  120. package/dist/cjs/util/os/isWindows.js.map +1 -0
  121. package/dist/cjs/util/path/getTempDataPath.js +20 -0
  122. package/dist/cjs/util/path/getTempDataPath.js.map +1 -0
  123. package/dist/cjs/util/regex/regexEscapeString.js +18 -0
  124. package/dist/cjs/util/regex/regexEscapeString.js.map +1 -0
  125. package/dist/cjs/util/string/strEnsureStartsWith.js +19 -0
  126. package/dist/cjs/util/string/strEnsureStartsWith.js.map +1 -0
  127. package/dist/cjs/util/string/strFirstCharToUpperCase.js +16 -0
  128. package/dist/cjs/util/string/strFirstCharToUpperCase.js.map +1 -0
  129. package/dist/cjs/util/string/strIsLowerCase.js +18 -0
  130. package/dist/cjs/util/string/strIsLowerCase.js.map +1 -0
  131. package/dist/cjs/util/string/strIsUpperCase.js +18 -0
  132. package/dist/cjs/util/string/strIsUpperCase.js.map +1 -0
  133. package/dist/cjs/util/string/strSplitCamelCase.js +55 -0
  134. package/dist/cjs/util/string/strSplitCamelCase.js.map +1 -0
  135. package/dist/cjs/util/string-parsers/createBooleanParser.js +21 -0
  136. package/dist/cjs/util/string-parsers/createBooleanParser.js.map +1 -0
  137. package/dist/cjs/util/string-parsers/createTypedListParser.js +22 -0
  138. package/dist/cjs/util/string-parsers/createTypedListParser.js.map +1 -0
  139. package/dist/cjs/util/string-parsers/parseBoolean.js +15 -0
  140. package/dist/cjs/util/string-parsers/parseBoolean.js.map +1 -0
  141. package/dist/cjs/util/string-parsers/parseInteger.js +17 -0
  142. package/dist/cjs/util/string-parsers/parseInteger.js.map +1 -0
  143. package/dist/cjs/util/string-parsers/parseNumber.js +13 -0
  144. package/dist/cjs/util/string-parsers/parseNumber.js.map +1 -0
  145. package/dist/cjs/util/string-parsers/parseString.js +8 -0
  146. package/dist/cjs/util/string-parsers/parseString.js.map +1 -0
  147. package/dist/cjs/util/types/Any.js +3 -0
  148. package/dist/cjs/util/types/Any.js.map +1 -0
  149. package/dist/cjs/util/types/DeepArray.js +3 -0
  150. package/dist/cjs/util/types/DeepArray.js.map +1 -0
  151. package/dist/cjs/util/types/DeepObject.js +3 -0
  152. package/dist/cjs/util/types/DeepObject.js.map +1 -0
  153. package/dist/cjs/util/types/JsonArray.js +3 -0
  154. package/dist/cjs/util/types/JsonArray.js.map +1 -0
  155. package/dist/cjs/util/types/JsonDefinedPrimitive.js +6 -0
  156. package/dist/cjs/util/types/JsonDefinedPrimitive.js.map +1 -0
  157. package/dist/cjs/util/types/JsonObject.js +3 -0
  158. package/dist/cjs/util/types/JsonObject.js.map +1 -0
  159. package/dist/cjs/util/types/JsonRawPrimitive.js +3 -0
  160. package/dist/cjs/util/types/JsonRawPrimitive.js.map +1 -0
  161. package/dist/cjs/util/types/JsonValue.js +3 -0
  162. package/dist/cjs/util/types/JsonValue.js.map +1 -0
  163. package/dist/cjs/util/types/ObjectKey.js +3 -0
  164. package/dist/cjs/util/types/ObjectKey.js.map +1 -0
  165. package/dist/cjs/util/types/TConstructor.js +3 -0
  166. package/dist/cjs/util/types/TConstructor.js.map +1 -0
  167. package/dist/cjs/util/types/TFunction.js +3 -0
  168. package/dist/cjs/util/types/TFunction.js.map +1 -0
  169. package/dist/cjs/util/types/TFunctionNoNew.js +3 -0
  170. package/dist/cjs/util/types/TFunctionNoNew.js.map +1 -0
  171. package/dist/cjs/util/types/TPlainObject.js +3 -0
  172. package/dist/cjs/util/types/TPlainObject.js.map +1 -0
  173. package/dist/cjs/util/types/TPrimitive.js +3 -0
  174. package/dist/cjs/util/types/TPrimitive.js.map +1 -0
  175. package/dist/cjs/util/types/TStringParser.js +3 -0
  176. package/dist/cjs/util/types/TStringParser.js.map +1 -0
  177. package/dist/cjs/util/types/TValidator.js +3 -0
  178. package/dist/cjs/util/types/TValidator.js.map +1 -0
  179. package/dist/cjs/util/validation/createTypedArrayValidator.js +26 -0
  180. package/dist/cjs/util/validation/createTypedArrayValidator.js.map +1 -0
  181. package/dist/cjs/util/validation/ensureThat.js +12 -0
  182. package/dist/cjs/util/validation/ensureThat.js.map +1 -0
  183. package/dist/cjs/util/validation/isArray.js +5 -0
  184. package/dist/cjs/util/validation/isArray.js.map +1 -0
  185. package/dist/cjs/util/validation/isBoolean.js +8 -0
  186. package/dist/cjs/util/validation/isBoolean.js.map +1 -0
  187. package/dist/cjs/util/validation/isFunction.js +17 -0
  188. package/dist/cjs/util/validation/isFunction.js.map +1 -0
  189. package/dist/cjs/util/validation/isNamedFunction.js +11 -0
  190. package/dist/cjs/util/validation/isNamedFunction.js.map +1 -0
  191. package/dist/cjs/util/validation/isNamedFunctionArray.js +9 -0
  192. package/dist/cjs/util/validation/isNamedFunctionArray.js.map +1 -0
  193. package/dist/cjs/util/validation/isObject.js +22 -0
  194. package/dist/cjs/util/validation/isObject.js.map +1 -0
  195. package/dist/cjs/util/validation/isPlainObject.js +19 -0
  196. package/dist/cjs/util/validation/isPlainObject.js.map +1 -0
  197. package/dist/cjs/util/validation/isPrimitive.js +18 -0
  198. package/dist/cjs/util/validation/isPrimitive.js.map +1 -0
  199. package/dist/cjs/util/validation/isString.js +8 -0
  200. package/dist/cjs/util/validation/isString.js.map +1 -0
  201. package/dist/cjs/util/validation/isStringArray.js +12 -0
  202. package/dist/cjs/util/validation/isStringArray.js.map +1 -0
  203. package/dist/cjs/util/validation/isStringWithNoSpacesOrDashes.js +9 -0
  204. package/dist/cjs/util/validation/isStringWithNoSpacesOrDashes.js.map +1 -0
  205. package/dist/cjs/util/validation/numbers/isInteger.js +17 -0
  206. package/dist/cjs/util/validation/numbers/isInteger.js.map +1 -0
  207. package/dist/cjs/util/validation/numbers/isValidNumber.js +22 -0
  208. package/dist/cjs/util/validation/numbers/isValidNumber.js.map +1 -0
  209. package/dist/esm/_example/bFindIn.js +187 -0
  210. package/dist/esm/_example/bFindIn.js.map +1 -0
  211. package/dist/esm/arg/ArgumentBuilder.js +41 -0
  212. package/dist/esm/arg/ArgumentBuilder.js.map +1 -0
  213. package/dist/esm/arg/ArgumentParserSelector.js +11 -0
  214. package/dist/esm/arg/ArgumentParserSelector.js.map +1 -0
  215. package/dist/esm/arg/ArgumentReader.js +34 -0
  216. package/dist/esm/arg/ArgumentReader.js.map +1 -0
  217. package/dist/esm/arg/ArgumentValidatorSelector.js +12 -0
  218. package/dist/esm/arg/ArgumentValidatorSelector.js.map +1 -0
  219. package/dist/esm/cmd/CommandBuilder.js +1073 -0
  220. package/dist/esm/cmd/CommandBuilder.js.map +1 -0
  221. package/dist/esm/cmd/CommandBuilderMetaData.js +40 -0
  222. package/dist/esm/cmd/CommandBuilderMetaData.js.map +1 -0
  223. package/dist/esm/cmd/CommandFeatureSelector.js +108 -0
  224. package/dist/esm/cmd/CommandFeatureSelector.js.map +1 -0
  225. package/dist/esm/cmd/DefaultHelpConfig.js +135 -0
  226. package/dist/esm/cmd/DefaultHelpConfig.js.map +1 -0
  227. package/dist/esm/cmd/asdas.js +25 -0
  228. package/dist/esm/cmd/asdas.js.map +1 -0
  229. package/dist/esm/core/OutputManager.js +92 -0
  230. package/dist/esm/core/OutputManager.js.map +1 -0
  231. package/dist/esm/core/ParserSelector.js +32 -0
  232. package/dist/esm/core/ParserSelector.js.map +1 -0
  233. package/dist/esm/core/ValidatorSelector.js +32 -0
  234. package/dist/esm/core/ValidatorSelector.js.map +1 -0
  235. package/dist/esm/core/splitCombinedArgvShorts.js +11 -0
  236. package/dist/esm/core/splitCombinedArgvShorts.js.map +1 -0
  237. package/dist/esm/db/AbstractJsonFileSection.js +186 -0
  238. package/dist/esm/db/AbstractJsonFileSection.js.map +1 -0
  239. package/dist/esm/db/AppDataSection.js +44 -0
  240. package/dist/esm/db/AppDataSection.js.map +1 -0
  241. package/dist/esm/db/ConfigSection.js +67 -0
  242. package/dist/esm/db/ConfigSection.js.map +1 -0
  243. package/dist/esm/db/JsonFile.js +51 -0
  244. package/dist/esm/db/JsonFile.js.map +1 -0
  245. package/dist/esm/db/PresetsSection.js +88 -0
  246. package/dist/esm/db/PresetsSection.js.map +1 -0
  247. package/dist/esm/index.js +103 -0
  248. package/dist/esm/index.js.map +1 -0
  249. package/dist/esm/opt/OptionArgumentParserSelector.js +12 -0
  250. package/dist/esm/opt/OptionArgumentParserSelector.js.map +1 -0
  251. package/dist/esm/opt/OptionArgumentValidatorSelector.js +15 -0
  252. package/dist/esm/opt/OptionArgumentValidatorSelector.js.map +1 -0
  253. package/dist/esm/opt/OptionBuilder.js +84 -0
  254. package/dist/esm/opt/OptionBuilder.js.map +1 -0
  255. package/dist/esm/opt/OptionHelpers.js +54 -0
  256. package/dist/esm/opt/OptionHelpers.js.map +1 -0
  257. package/dist/esm/opt/OptionReader.js +62 -0
  258. package/dist/esm/opt/OptionReader.js.map +1 -0
  259. package/dist/esm/types/IConfig.js +2 -0
  260. package/dist/esm/types/IConfig.js.map +1 -0
  261. package/dist/esm/types/IPreset.js +2 -0
  262. package/dist/esm/types/IPreset.js.map +1 -0
  263. package/dist/esm/util/array/arrLast.js +17 -0
  264. package/dist/esm/util/array/arrLast.js.map +1 -0
  265. package/dist/esm/util/array/arrSome.js +22 -0
  266. package/dist/esm/util/array/arrSome.js.map +1 -0
  267. package/dist/esm/util/array/types/ArrayPredicate.js +2 -0
  268. package/dist/esm/util/array/types/ArrayPredicate.js.map +1 -0
  269. package/dist/esm/util/db/JsonDB.js +141 -0
  270. package/dist/esm/util/db/JsonDB.js.map +1 -0
  271. package/dist/esm/util/errors/ErrorParser.js +154 -0
  272. package/dist/esm/util/errors/ErrorParser.js.map +1 -0
  273. package/dist/esm/util/fs/promptUserEditInTextEditor/IGetUserInputFromEditorOptions.js +2 -0
  274. package/dist/esm/util/fs/promptUserEditInTextEditor/IGetUserInputFromEditorOptions.js.map +1 -0
  275. package/dist/esm/util/fs/promptUserEditInTextEditor/promptUserEditInTextEditorSync.js +28 -0
  276. package/dist/esm/util/fs/promptUserEditInTextEditor/promptUserEditInTextEditorSync.js.map +1 -0
  277. package/dist/esm/util/fs/promptUserEditInTextEditor/promptUserEditJsonInTextEditorSync.js +21 -0
  278. package/dist/esm/util/fs/promptUserEditInTextEditor/promptUserEditJsonInTextEditorSync.js.map +1 -0
  279. package/dist/esm/util/fs/readFile/readFileSafeSync.js +21 -0
  280. package/dist/esm/util/fs/readFile/readFileSafeSync.js.map +1 -0
  281. package/dist/esm/util/fs/readFile/readFileSync.js +13 -0
  282. package/dist/esm/util/fs/readFile/readFileSync.js.map +1 -0
  283. package/dist/esm/util/fs/readJsonFile/readJsonFileSafeSync.js +17 -0
  284. package/dist/esm/util/fs/readJsonFile/readJsonFileSafeSync.js.map +1 -0
  285. package/dist/esm/util/fs/removeFile/removeFile.js +2 -0
  286. package/dist/esm/util/fs/removeFile/removeFile.js.map +1 -0
  287. package/dist/esm/util/fs/tempFile/tempFileSync.js +21 -0
  288. package/dist/esm/util/fs/tempFile/tempFileSync.js.map +1 -0
  289. package/dist/esm/util/fs/types/IReadJsonFileOptions.js +2 -0
  290. package/dist/esm/util/fs/types/IReadJsonFileOptions.js.map +1 -0
  291. package/dist/esm/util/fs/writeFile/writeFileSafeSync.js +2 -0
  292. package/dist/esm/util/fs/writeFile/writeFileSafeSync.js.map +1 -0
  293. package/dist/esm/util/fs/writeFile/writeFileSync.js +2 -0
  294. package/dist/esm/util/fs/writeFile/writeFileSync.js.map +1 -0
  295. package/dist/esm/util/fs/writeJsonFile/writeJsonFileSafe.js +2 -0
  296. package/dist/esm/util/fs/writeJsonFile/writeJsonFileSafe.js.map +1 -0
  297. package/dist/esm/util/function/MethodDisabler.js +90 -0
  298. package/dist/esm/util/function/MethodDisabler.js.map +1 -0
  299. package/dist/esm/util/function/funSetName.js +17 -0
  300. package/dist/esm/util/function/funSetName.js.map +1 -0
  301. package/dist/esm/util/node/execInherit.js +15 -0
  302. package/dist/esm/util/node/execInherit.js.map +1 -0
  303. package/dist/esm/util/node/formatTableForTerminal.js +14 -0
  304. package/dist/esm/util/node/formatTableForTerminal.js.map +1 -0
  305. package/dist/esm/util/object/arrAssign.js +3 -0
  306. package/dist/esm/util/object/arrAssign.js.map +1 -0
  307. package/dist/esm/util/object/createArrayMerger.js +16 -0
  308. package/dist/esm/util/object/createArrayMerger.js.map +1 -0
  309. package/dist/esm/util/object/createObjectMerger.js +16 -0
  310. package/dist/esm/util/object/createObjectMerger.js.map +1 -0
  311. package/dist/esm/util/object/objAssign.js +3 -0
  312. package/dist/esm/util/object/objAssign.js.map +1 -0
  313. package/dist/esm/util/object/objUpdatePropertyDescriptors.js +24 -0
  314. package/dist/esm/util/object/objUpdatePropertyDescriptors.js.map +1 -0
  315. package/dist/esm/util/object/realizeLazyProperty.js +10 -0
  316. package/dist/esm/util/object/realizeLazyProperty.js.map +1 -0
  317. package/dist/esm/util/object/setNonEnumerable.js +21 -0
  318. package/dist/esm/util/object/setNonEnumerable.js.map +1 -0
  319. package/dist/esm/util/os/defaultOpenInEditorCommand.js +14 -0
  320. package/dist/esm/util/os/defaultOpenInEditorCommand.js.map +1 -0
  321. package/dist/esm/util/os/isOSX.js +9 -0
  322. package/dist/esm/util/os/isOSX.js.map +1 -0
  323. package/dist/esm/util/os/isVsCodeInstalled.js +15 -0
  324. package/dist/esm/util/os/isVsCodeInstalled.js.map +1 -0
  325. package/dist/esm/util/os/isWindows.js +12 -0
  326. package/dist/esm/util/os/isWindows.js.map +1 -0
  327. package/dist/esm/util/path/getTempDataPath.js +13 -0
  328. package/dist/esm/util/path/getTempDataPath.js.map +1 -0
  329. package/dist/esm/util/regex/regexEscapeString.js +14 -0
  330. package/dist/esm/util/regex/regexEscapeString.js.map +1 -0
  331. package/dist/esm/util/string/strEnsureStartsWith.js +15 -0
  332. package/dist/esm/util/string/strEnsureStartsWith.js.map +1 -0
  333. package/dist/esm/util/string/strFirstCharToUpperCase.js +12 -0
  334. package/dist/esm/util/string/strFirstCharToUpperCase.js.map +1 -0
  335. package/dist/esm/util/string/strIsLowerCase.js +14 -0
  336. package/dist/esm/util/string/strIsLowerCase.js.map +1 -0
  337. package/dist/esm/util/string/strIsUpperCase.js +14 -0
  338. package/dist/esm/util/string/strIsUpperCase.js.map +1 -0
  339. package/dist/esm/util/string/strSplitCamelCase.js +51 -0
  340. package/dist/esm/util/string/strSplitCamelCase.js.map +1 -0
  341. package/dist/esm/util/string-parsers/createBooleanParser.js +17 -0
  342. package/dist/esm/util/string-parsers/createBooleanParser.js.map +1 -0
  343. package/dist/esm/util/string-parsers/createTypedListParser.js +18 -0
  344. package/dist/esm/util/string-parsers/createTypedListParser.js.map +1 -0
  345. package/dist/esm/util/string-parsers/parseBoolean.js +12 -0
  346. package/dist/esm/util/string-parsers/parseBoolean.js.map +1 -0
  347. package/dist/esm/util/string-parsers/parseInteger.js +13 -0
  348. package/dist/esm/util/string-parsers/parseInteger.js.map +1 -0
  349. package/dist/esm/util/string-parsers/parseNumber.js +9 -0
  350. package/dist/esm/util/string-parsers/parseNumber.js.map +1 -0
  351. package/dist/esm/util/string-parsers/parseString.js +4 -0
  352. package/dist/esm/util/string-parsers/parseString.js.map +1 -0
  353. package/dist/esm/util/types/Any.js +2 -0
  354. package/dist/esm/util/types/Any.js.map +1 -0
  355. package/dist/esm/util/types/DeepArray.js +2 -0
  356. package/dist/esm/util/types/DeepArray.js.map +1 -0
  357. package/dist/esm/util/types/DeepObject.js +2 -0
  358. package/dist/esm/util/types/DeepObject.js.map +1 -0
  359. package/dist/esm/util/types/JsonArray.js +2 -0
  360. package/dist/esm/util/types/JsonArray.js.map +1 -0
  361. package/dist/esm/util/types/JsonDefinedPrimitive.js +5 -0
  362. package/dist/esm/util/types/JsonDefinedPrimitive.js.map +1 -0
  363. package/dist/esm/util/types/JsonObject.js +2 -0
  364. package/dist/esm/util/types/JsonObject.js.map +1 -0
  365. package/dist/esm/util/types/JsonRawPrimitive.js +2 -0
  366. package/dist/esm/util/types/JsonRawPrimitive.js.map +1 -0
  367. package/dist/esm/util/types/JsonValue.js +2 -0
  368. package/dist/esm/util/types/JsonValue.js.map +1 -0
  369. package/dist/esm/util/types/ObjectKey.js +2 -0
  370. package/dist/esm/util/types/ObjectKey.js.map +1 -0
  371. package/dist/esm/util/types/TConstructor.js +2 -0
  372. package/dist/esm/util/types/TConstructor.js.map +1 -0
  373. package/dist/esm/util/types/TFunction.js +2 -0
  374. package/dist/esm/util/types/TFunction.js.map +1 -0
  375. package/dist/esm/util/types/TFunctionNoNew.js +2 -0
  376. package/dist/esm/util/types/TFunctionNoNew.js.map +1 -0
  377. package/dist/esm/util/types/TPlainObject.js +2 -0
  378. package/dist/esm/util/types/TPlainObject.js.map +1 -0
  379. package/dist/esm/util/types/TPrimitive.js +2 -0
  380. package/dist/esm/util/types/TPrimitive.js.map +1 -0
  381. package/dist/esm/util/types/TStringParser.js +2 -0
  382. package/dist/esm/util/types/TStringParser.js.map +1 -0
  383. package/dist/esm/util/types/TValidator.js +2 -0
  384. package/dist/esm/util/types/TValidator.js.map +1 -0
  385. package/dist/esm/util/validation/createTypedArrayValidator.js +22 -0
  386. package/dist/esm/util/validation/createTypedArrayValidator.js.map +1 -0
  387. package/dist/esm/util/validation/ensureThat.js +8 -0
  388. package/dist/esm/util/validation/ensureThat.js.map +1 -0
  389. package/dist/esm/util/validation/isArray.js +2 -0
  390. package/dist/esm/util/validation/isArray.js.map +1 -0
  391. package/dist/esm/util/validation/isBoolean.js +4 -0
  392. package/dist/esm/util/validation/isBoolean.js.map +1 -0
  393. package/dist/esm/util/validation/isFunction.js +13 -0
  394. package/dist/esm/util/validation/isFunction.js.map +1 -0
  395. package/dist/esm/util/validation/isNamedFunction.js +7 -0
  396. package/dist/esm/util/validation/isNamedFunction.js.map +1 -0
  397. package/dist/esm/util/validation/isNamedFunctionArray.js +5 -0
  398. package/dist/esm/util/validation/isNamedFunctionArray.js.map +1 -0
  399. package/dist/esm/util/validation/isObject.js +18 -0
  400. package/dist/esm/util/validation/isObject.js.map +1 -0
  401. package/dist/esm/util/validation/isPlainObject.js +15 -0
  402. package/dist/esm/util/validation/isPlainObject.js.map +1 -0
  403. package/dist/esm/util/validation/isPrimitive.js +14 -0
  404. package/dist/esm/util/validation/isPrimitive.js.map +1 -0
  405. package/dist/esm/util/validation/isString.js +4 -0
  406. package/dist/esm/util/validation/isString.js.map +1 -0
  407. package/dist/esm/util/validation/isStringArray.js +8 -0
  408. package/dist/esm/util/validation/isStringArray.js.map +1 -0
  409. package/dist/esm/util/validation/isStringWithNoSpacesOrDashes.js +5 -0
  410. package/dist/esm/util/validation/isStringWithNoSpacesOrDashes.js.map +1 -0
  411. package/dist/esm/util/validation/numbers/isInteger.js +14 -0
  412. package/dist/esm/util/validation/numbers/isInteger.js.map +1 -0
  413. package/dist/esm/util/validation/numbers/isValidNumber.js +18 -0
  414. package/dist/esm/util/validation/numbers/isValidNumber.js.map +1 -0
  415. package/dist/types/_example/bFindIn.d.ts +1 -0
  416. package/{src → dist/types}/arg/ArgumentBuilder.d.ts +1 -1
  417. package/{src → dist/types}/arg/ArgumentParserSelector.d.ts +2 -2
  418. package/{src → dist/types}/arg/ArgumentReader.d.ts +3 -3
  419. package/{src → dist/types}/arg/ArgumentValidatorSelector.d.ts +2 -2
  420. package/{src → dist/types}/cmd/CommandBuilder.d.ts +32 -28
  421. package/{src → dist/types}/cmd/CommandBuilderMetaData.d.ts +8 -7
  422. package/{src → dist/types}/cmd/CommandFeatureSelector.d.ts +1 -1
  423. package/dist/types/cmd/DefaultHelpConfig.d.ts +28 -0
  424. package/dist/types/cmd/asdas.d.ts +6 -0
  425. package/{src → dist/types}/core/OutputManager.d.ts +1 -1
  426. package/{src → dist/types}/core/ParserSelector.d.ts +3 -3
  427. package/{src → dist/types}/core/ValidatorSelector.d.ts +2 -2
  428. package/{src → dist/types}/db/AbstractJsonFileSection.d.ts +3 -3
  429. package/{src → dist/types}/db/AppDataSection.d.ts +1 -1
  430. package/{src → dist/types}/db/ConfigSection.d.ts +4 -4
  431. package/{src → dist/types}/db/PresetsSection.d.ts +2 -2
  432. package/{src → dist/types}/index.d.ts +2 -2
  433. package/{src → dist/types}/opt/OptionArgumentParserSelector.d.ts +1 -1
  434. package/{src → dist/types}/opt/OptionArgumentValidatorSelector.d.ts +2 -2
  435. package/{src → dist/types}/opt/OptionBuilder.d.ts +2 -1
  436. package/{src → dist/types}/opt/OptionHelpers.d.ts +2 -2
  437. package/{src → dist/types}/opt/OptionReader.d.ts +7 -7
  438. package/{src → dist/types}/types/IConfig.d.ts +3 -3
  439. package/{src → dist/types}/types/IPreset.d.ts +4 -3
  440. package/{src → dist/types}/util/db/JsonDB.d.ts +2 -2
  441. package/{src → dist/types}/util/fs/promptUserEditInTextEditor/promptUserEditInTextEditorSync.d.ts +1 -1
  442. package/{src → dist/types}/util/fs/promptUserEditInTextEditor/promptUserEditJsonInTextEditorSync.d.ts +1 -1
  443. package/{src → dist/types}/util/fs/readJsonFile/readJsonFileSafeSync.d.ts +1 -1
  444. package/{src → dist/types}/util/fs/tempFile/tempFileSync.d.ts +1 -1
  445. package/{src → dist/types}/util/function/MethodDisabler.d.ts +3 -3
  446. package/{src → dist/types}/util/object/createObjectMerger.d.ts +1 -1
  447. package/{src → dist/types}/util/object/objUpdatePropertyDescriptors.d.ts +1 -1
  448. package/{src → dist/types}/util/object/setNonEnumerable.d.ts +1 -1
  449. package/{src → dist/types}/util/string-parsers/createTypedListParser.d.ts +1 -1
  450. package/{src → dist/types}/util/types/DeepArray.d.ts +2 -2
  451. package/{src → dist/types}/util/types/DeepObject.d.ts +2 -2
  452. package/{src → dist/types}/util/types/JsonArray.d.ts +2 -2
  453. package/{src → dist/types}/util/types/JsonObject.d.ts +2 -2
  454. package/{src → dist/types}/util/types/JsonRawPrimitive.d.ts +1 -1
  455. package/{src → dist/types}/util/types/JsonValue.d.ts +3 -3
  456. package/{src → dist/types}/util/types/TConstructor.d.ts +1 -1
  457. package/dist/types/util/types/TFunction.d.ts +4 -0
  458. package/{src → dist/types}/util/types/TFunctionNoNew.d.ts +1 -1
  459. package/{src → dist/types}/util/types/TPlainObject.d.ts +1 -1
  460. package/dist/types/util/types/TValidator.d.ts +2 -0
  461. package/{src → dist/types}/util/validation/ensureThat.d.ts +2 -2
  462. package/{src → dist/types}/util/validation/isFunction.d.ts +1 -1
  463. package/{src → dist/types}/util/validation/isNamedFunction.d.ts +1 -1
  464. package/{src → dist/types}/util/validation/isPlainObject.d.ts +2 -2
  465. package/{src → dist/types}/util/validation/isPrimitive.d.ts +1 -1
  466. package/jest.config.ts +11 -0
  467. package/notes/tsc.md +1 -0
  468. package/package.json +13 -6
  469. package/project.json +44 -0
  470. package/scripts/currentBemojeUtils.txt +41 -0
  471. package/scripts/rollupUtils.ts +184 -0
  472. package/src/_example/CommandBuilder.example.ts +92 -0
  473. package/src/_example/CommandBuilder.example2.ts +30 -0
  474. package/src/_example/bFindIn.ts +200 -0
  475. package/src/arg/ArgumentBuilder.test.ts +102 -0
  476. package/src/arg/ArgumentBuilder.ts +47 -0
  477. package/src/arg/ArgumentParserSelector.test.ts +53 -0
  478. package/src/arg/ArgumentParserSelector.ts +14 -0
  479. package/src/arg/ArgumentReader.test.ts +60 -0
  480. package/src/arg/ArgumentReader.ts +33 -0
  481. package/src/arg/ArgumentValidatorSelector.test.ts +80 -0
  482. package/src/arg/ArgumentValidatorSelector.ts +14 -0
  483. package/src/cmd/CommandBuilder.test.ts +611 -0
  484. package/src/cmd/CommandBuilder.ts +1164 -0
  485. package/src/cmd/CommandBuilderMetaData.test.ts +54 -0
  486. package/src/cmd/CommandBuilderMetaData.ts +45 -0
  487. package/src/cmd/CommandFeatureSelector.test.ts +185 -0
  488. package/src/cmd/CommandFeatureSelector.ts +113 -0
  489. package/src/cmd/DefaultHelpConfig.test.ts +22 -0
  490. package/src/cmd/DefaultHelpConfig.ts +141 -0
  491. package/src/cmd/asdas.ts +40 -0
  492. package/src/core/OutputManager.test.ts +129 -0
  493. package/src/core/OutputManager.ts +103 -0
  494. package/src/core/ParserSelector.test.ts +7 -0
  495. package/src/core/ParserSelector.ts +38 -0
  496. package/src/core/ValidatorSelector.test.ts +7 -0
  497. package/src/core/ValidatorSelector.ts +38 -0
  498. package/src/core/splitCombinedArgvShorts.test.ts +9 -0
  499. package/src/core/splitCombinedArgvShorts.ts +10 -0
  500. package/src/db/AbstractJsonFileSection.test.ts +274 -0
  501. package/src/db/AbstractJsonFileSection.ts +218 -0
  502. package/src/db/AppDataSection.test.ts +69 -0
  503. package/src/db/AppDataSection.ts +46 -0
  504. package/src/db/ConfigSection.test.ts +95 -0
  505. package/src/db/ConfigSection.ts +74 -0
  506. package/src/db/JsonFile.test.ts +56 -0
  507. package/src/db/JsonFile.ts +52 -0
  508. package/src/db/PresetsSection.test.ts +130 -0
  509. package/src/db/PresetsSection.ts +92 -0
  510. package/src/index.ts +102 -0
  511. package/src/opt/OptionArgumentParserSelector.test.ts +55 -0
  512. package/src/opt/OptionArgumentParserSelector.ts +14 -0
  513. package/src/opt/OptionArgumentValidatorSelector.test.ts +89 -0
  514. package/src/opt/OptionArgumentValidatorSelector.ts +16 -0
  515. package/src/opt/OptionBuilder.test.ts +229 -0
  516. package/src/opt/OptionBuilder.ts +85 -0
  517. package/src/opt/OptionHelpers.test.ts +229 -0
  518. package/src/opt/OptionHelpers.ts +57 -0
  519. package/src/opt/OptionReader.test.ts +106 -0
  520. package/src/opt/OptionReader.ts +61 -0
  521. package/src/types/IConfig.ts +25 -0
  522. package/src/types/IPreset.ts +16 -0
  523. package/src/util/array/arrLast.test.ts +25 -0
  524. package/src/util/array/arrLast.ts +15 -0
  525. package/src/util/array/arrSome.test.ts +78 -0
  526. package/src/util/array/arrSome.ts +23 -0
  527. package/src/util/array/types/ArrayPredicate.ts +10 -0
  528. package/src/util/db/JsonDB.test.ts +214 -0
  529. package/src/util/db/JsonDB.ts +138 -0
  530. package/src/util/errors/ErrorParser.ts +165 -0
  531. package/src/util/fs/promptUserEditInTextEditor/IGetUserInputFromEditorOptions.ts +15 -0
  532. package/src/util/fs/promptUserEditInTextEditor/promptUserEditInTextEditorSync.ts +30 -0
  533. package/src/util/fs/promptUserEditInTextEditor/promptUserEditJsonInTextEditorSync.ts +25 -0
  534. package/src/util/fs/readFile/readFileSafeSync.ts +20 -0
  535. package/src/util/fs/readFile/readFileSync.ts +13 -0
  536. package/src/util/fs/readJsonFile/readJsonFileSafeSync.ts +17 -0
  537. package/src/util/fs/removeFile/removeFile.ts +1 -0
  538. package/src/util/fs/tempFile/tempFileSync.ts +21 -0
  539. package/src/util/fs/types/IReadJsonFileOptions.ts +1 -0
  540. package/src/util/fs/writeFile/writeFileSafeSync.ts +1 -0
  541. package/src/util/fs/writeFile/writeFileSync.ts +1 -0
  542. package/src/util/fs/writeJsonFile/writeJsonFileSafe.ts +1 -0
  543. package/src/util/function/MethodDisabler.test.ts +112 -0
  544. package/src/util/function/MethodDisabler.ts +94 -0
  545. package/src/util/function/funSetName.test.ts +12 -0
  546. package/src/util/function/funSetName.ts +16 -0
  547. package/src/util/node/execInherit.ts +14 -0
  548. package/src/util/node/formatTableForTerminal.ts +12 -0
  549. package/src/util/object/arrAssign.ts +3 -0
  550. package/src/util/object/createArrayMerger.test.ts +11 -0
  551. package/src/util/object/createArrayMerger.ts +15 -0
  552. package/src/util/object/createObjectMerger.test.ts +11 -0
  553. package/src/util/object/createObjectMerger.ts +17 -0
  554. package/src/util/object/objAssign.ts +3 -0
  555. package/src/util/object/objUpdatePropertyDescriptors.test.ts +40 -0
  556. package/src/util/object/objUpdatePropertyDescriptors.ts +29 -0
  557. package/src/util/object/realizeLazyProperty.ts +9 -0
  558. package/src/util/object/setNonEnumerable.test.ts +63 -0
  559. package/src/util/object/setNonEnumerable.ts +22 -0
  560. package/src/util/os/defaultOpenInEditorCommand.ts +14 -0
  561. package/src/util/os/isOSX.ts +9 -0
  562. package/src/util/os/isVsCodeInstalled.test.ts +7 -0
  563. package/src/util/os/isVsCodeInstalled.ts +14 -0
  564. package/src/util/os/isWindows.ts +12 -0
  565. package/src/util/path/getTempDataPath.test.ts +9 -0
  566. package/src/util/path/getTempDataPath.ts +14 -0
  567. package/src/util/regex/regexEscapeString.test.ts +35 -0
  568. package/src/util/regex/regexEscapeString.ts +13 -0
  569. package/src/util/string/strEnsureStartsWith.test.ts +13 -0
  570. package/src/util/string/strEnsureStartsWith.ts +14 -0
  571. package/src/util/string/strFirstCharToUpperCase.test.ts +33 -0
  572. package/src/util/string/strFirstCharToUpperCase.ts +11 -0
  573. package/src/util/string/strIsLowerCase.test.ts +42 -0
  574. package/src/util/string/strIsLowerCase.ts +13 -0
  575. package/src/util/string/strIsUpperCase.test.ts +48 -0
  576. package/src/util/string/strIsUpperCase.ts +13 -0
  577. package/src/util/string/strSplitCamelCase.test.ts +54 -0
  578. package/src/util/string/strSplitCamelCase.ts +51 -0
  579. package/src/util/string-parsers/createBooleanParser.test.ts +58 -0
  580. package/src/util/string-parsers/createBooleanParser.ts +21 -0
  581. package/src/util/string-parsers/createTypedListParser.test.ts +19 -0
  582. package/src/util/string-parsers/createTypedListParser.ts +19 -0
  583. package/src/util/string-parsers/parseBoolean.test.ts +30 -0
  584. package/src/util/string-parsers/parseBoolean.ts +12 -0
  585. package/src/util/string-parsers/parseInteger.test.ts +52 -0
  586. package/src/util/string-parsers/parseInteger.ts +9 -0
  587. package/src/util/string-parsers/parseNumber.test.ts +53 -0
  588. package/src/util/string-parsers/parseNumber.ts +6 -0
  589. package/src/util/string-parsers/parseString.test.ts +7 -0
  590. package/src/util/string-parsers/parseString.ts +3 -0
  591. package/src/util/types/Any.ts +2 -0
  592. package/src/util/types/DeepArray.ts +12 -0
  593. package/src/util/types/DeepObject.ts +16 -0
  594. package/src/util/types/JsonArray.ts +8 -0
  595. package/src/util/types/JsonDefinedPrimitive.ts +5 -0
  596. package/src/util/types/JsonObject.ts +8 -0
  597. package/src/util/types/JsonRawPrimitive.ts +7 -0
  598. package/src/util/types/JsonValue.ts +14 -0
  599. package/src/util/types/ObjectKey.ts +1 -0
  600. package/src/util/types/TConstructor.ts +6 -0
  601. package/src/util/types/TFunction.ts +5 -0
  602. package/src/util/types/TFunctionNoNew.ts +3 -0
  603. package/src/util/types/TPlainObject.ts +4 -0
  604. package/src/util/types/TPrimitive.ts +1 -0
  605. package/src/util/types/TStringParser.ts +1 -0
  606. package/src/util/types/TValidator.ts +3 -0
  607. package/src/util/validation/createTypedArrayValidator.test.ts +34 -0
  608. package/src/util/validation/createTypedArrayValidator.ts +25 -0
  609. package/src/util/validation/ensureThat.test.ts +37 -0
  610. package/src/util/validation/ensureThat.ts +14 -0
  611. package/src/util/validation/isArray.test.ts +7 -0
  612. package/src/util/validation/isArray.ts +1 -0
  613. package/src/util/validation/isBoolean.test.ts +31 -0
  614. package/src/util/validation/isBoolean.ts +3 -0
  615. package/src/util/validation/isFunction.test.ts +54 -0
  616. package/src/util/validation/isFunction.ts +14 -0
  617. package/src/util/validation/isNamedFunction.test.ts +28 -0
  618. package/src/util/validation/isNamedFunction.ts +8 -0
  619. package/src/util/validation/isNamedFunctionArray.test.ts +14 -0
  620. package/src/util/validation/isNamedFunctionArray.ts +5 -0
  621. package/src/util/validation/isObject.test.ts +57 -0
  622. package/src/util/validation/isObject.ts +17 -0
  623. package/src/util/validation/isPlainObject.test.ts +21 -0
  624. package/src/util/validation/isPlainObject.ts +14 -0
  625. package/src/util/validation/isPrimitive.ts +15 -0
  626. package/src/util/validation/isString.test.ts +23 -0
  627. package/src/util/validation/isString.ts +3 -0
  628. package/src/util/validation/isStringArray.test.ts +24 -0
  629. package/src/util/validation/isStringArray.ts +8 -0
  630. package/src/util/validation/isStringWithNoSpacesOrDashes.test.ts +28 -0
  631. package/src/util/validation/isStringWithNoSpacesOrDashes.ts +5 -0
  632. package/src/util/validation/numbers/isInteger.test.ts +25 -0
  633. package/src/util/validation/numbers/isInteger.ts +13 -0
  634. package/src/util/validation/numbers/isValidNumber.test.ts +20 -0
  635. package/src/util/validation/numbers/isValidNumber.ts +17 -0
  636. package/tsconfig.json +32 -0
  637. package/tsconfig.lib.json +18 -0
  638. package/tsconfig.spec.json +10 -0
  639. package/index.cjs.d.ts +0 -1
  640. package/index.cjs.js +0 -3231
  641. package/index.esm.js +0 -3119
  642. package/src/cmd/CLI.d.ts +0 -2
  643. package/src/cmd/DefaultHelpConfig.d.ts +0 -2
  644. package/src/proto/overrideCommanderPrototype.d.ts +0 -8
  645. package/src/util/types/TFunction.d.ts +0 -4
  646. package/src/util/types/TValidator.d.ts +0 -1
  647. /package/{src → dist/types}/core/splitCombinedArgvShorts.d.ts +0 -0
  648. /package/{src → dist/types}/db/JsonFile.d.ts +0 -0
  649. /package/{src → dist/types}/util/array/arrLast.d.ts +0 -0
  650. /package/{src → dist/types}/util/array/arrSome.d.ts +0 -0
  651. /package/{src → dist/types}/util/array/types/ArrayPredicate.d.ts +0 -0
  652. /package/{src → dist/types}/util/errors/ErrorParser.d.ts +0 -0
  653. /package/{src → dist/types}/util/fs/promptUserEditInTextEditor/IGetUserInputFromEditorOptions.d.ts +0 -0
  654. /package/{src → dist/types}/util/fs/readFile/readFileSafeSync.d.ts +0 -0
  655. /package/{src → dist/types}/util/fs/readFile/readFileSync.d.ts +0 -0
  656. /package/{src → dist/types}/util/fs/removeFile/removeFile.d.ts +0 -0
  657. /package/{src → dist/types}/util/fs/types/IReadJsonFileOptions.d.ts +0 -0
  658. /package/{src → dist/types}/util/fs/writeFile/writeFileSafeSync.d.ts +0 -0
  659. /package/{src → dist/types}/util/fs/writeFile/writeFileSync.d.ts +0 -0
  660. /package/{src → dist/types}/util/fs/writeJsonFile/writeJsonFileSafe.d.ts +0 -0
  661. /package/{src → dist/types}/util/function/funSetName.d.ts +0 -0
  662. /package/{src → dist/types}/util/node/execInherit.d.ts +0 -0
  663. /package/{src → dist/types}/util/node/formatTableForTerminal.d.ts +0 -0
  664. /package/{src → dist/types}/util/object/arrAssign.d.ts +0 -0
  665. /package/{src → dist/types}/util/object/createArrayMerger.d.ts +0 -0
  666. /package/{src → dist/types}/util/object/objAssign.d.ts +0 -0
  667. /package/{src → dist/types}/util/object/realizeLazyProperty.d.ts +0 -0
  668. /package/{src → dist/types}/util/os/defaultOpenInEditorCommand.d.ts +0 -0
  669. /package/{src → dist/types}/util/os/isOSX.d.ts +0 -0
  670. /package/{src → dist/types}/util/os/isVsCodeInstalled.d.ts +0 -0
  671. /package/{src → dist/types}/util/os/isWindows.d.ts +0 -0
  672. /package/{src → dist/types}/util/path/getTempDataPath.d.ts +0 -0
  673. /package/{src → dist/types}/util/regex/regexEscapeString.d.ts +0 -0
  674. /package/{src → dist/types}/util/string/strEnsureStartsWith.d.ts +0 -0
  675. /package/{src → dist/types}/util/string/strFirstCharToUpperCase.d.ts +0 -0
  676. /package/{src → dist/types}/util/string/strIsLowerCase.d.ts +0 -0
  677. /package/{src → dist/types}/util/string/strIsUpperCase.d.ts +0 -0
  678. /package/{src → dist/types}/util/string/strSplitCamelCase.d.ts +0 -0
  679. /package/{src → dist/types}/util/string-parsers/createBooleanParser.d.ts +0 -0
  680. /package/{src → dist/types}/util/string-parsers/parseBoolean.d.ts +0 -0
  681. /package/{src → dist/types}/util/string-parsers/parseInteger.d.ts +0 -0
  682. /package/{src → dist/types}/util/string-parsers/parseNumber.d.ts +0 -0
  683. /package/{src → dist/types}/util/string-parsers/parseString.d.ts +0 -0
  684. /package/{src → dist/types}/util/types/Any.d.ts +0 -0
  685. /package/{src → dist/types}/util/types/JsonDefinedPrimitive.d.ts +0 -0
  686. /package/{src → dist/types}/util/types/ObjectKey.d.ts +0 -0
  687. /package/{src → dist/types}/util/types/TPrimitive.d.ts +0 -0
  688. /package/{src → dist/types}/util/types/TStringParser.d.ts +0 -0
  689. /package/{src → dist/types}/util/validation/createTypedArrayValidator.d.ts +0 -0
  690. /package/{src → dist/types}/util/validation/isArray.d.ts +0 -0
  691. /package/{src → dist/types}/util/validation/isBoolean.d.ts +0 -0
  692. /package/{src → dist/types}/util/validation/isNamedFunctionArray.d.ts +0 -0
  693. /package/{src → dist/types}/util/validation/isObject.d.ts +0 -0
  694. /package/{src → dist/types}/util/validation/isString.d.ts +0 -0
  695. /package/{src → dist/types}/util/validation/isStringArray.d.ts +0 -0
  696. /package/{src → dist/types}/util/validation/isStringWithNoSpacesOrDashes.d.ts +0 -0
  697. /package/{src → dist/types}/util/validation/numbers/isInteger.d.ts +0 -0
  698. /package/{src → dist/types}/util/validation/numbers/isValidNumber.d.ts +0 -0
@@ -0,0 +1,1164 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import colors from 'ansi-colors'
3
+ import fs from 'fs-extra'
4
+ import isAsyncFunction from 'is-async-function'
5
+ import os from 'os'
6
+ import path from 'path'
7
+ import type { Any } from '../util/types/Any'
8
+ import { ArgumentBuilder } from '../arg/ArgumentBuilder'
9
+ import { arrAssign } from '../util/object/arrAssign'
10
+ import { arrLast } from '../util/array/arrLast'
11
+ import { arrSome } from '../util/array/arrSome'
12
+ import { CommandBuilderMetaData } from './CommandBuilderMetaData'
13
+ import { CommandFeatureSelector } from './CommandFeatureSelector'
14
+ import { DefaultHelpConfig } from './DefaultHelpConfig'
15
+ import { ensureThat } from '../util/validation/ensureThat'
16
+ import { formatTableForTerminal } from '../util/node/formatTableForTerminal'
17
+ import type { IConfig } from '../types/IConfig'
18
+ import type { IPreset, IPresetPartial } from '../types/IPreset'
19
+ import { isArray } from '../util/validation/isArray'
20
+ import { isObject } from '../util/validation/isObject'
21
+ import { isString } from '../util/validation/isString'
22
+ import { isStringArray } from '../util/validation/isStringArray'
23
+ import { isStringWithNoSpacesOrDashes } from '../util/validation/isStringWithNoSpacesOrDashes'
24
+ import { JsonFile } from '../db/JsonFile'
25
+ import { objAssign } from '../util/object/objAssign'
26
+ import { OptionBuilder } from '../opt/OptionBuilder'
27
+ import { OptionHelpers } from '../opt/OptionHelpers'
28
+ import { OutputManager } from '../core/OutputManager'
29
+ import { PresetsSection } from '../db/PresetsSection'
30
+ import { realizeLazyProperty } from '../util/object/realizeLazyProperty'
31
+ import { removeFile } from '../util/fs/removeFile/removeFile'
32
+ import { setNonEnumerable } from '../util/object/setNonEnumerable'
33
+ import { splitCombinedArgvShorts } from '../core/splitCombinedArgvShorts'
34
+ import {
35
+ type AddHelpTextPosition,
36
+ Argument,
37
+ Command,
38
+ CommanderError,
39
+ type CommandUnknownOpts,
40
+ type ErrorOptions,
41
+ type HelpConfiguration,
42
+ type HookEvent,
43
+ InvalidArgumentError,
44
+ Option,
45
+ type OptionValues,
46
+ type OptionValueSource,
47
+ ParseOptions,
48
+ } from '@commander-js/extra-typings'
49
+ import { type JsonValue } from '../util/types/JsonValue'
50
+
51
+ /**
52
+ * Wrapper around the @see Command class, for more intuitive construction.
53
+ */
54
+ export class CommandBuilder<Args extends Any[] = unknown[], Opts extends OptionValues = OptionValues> {
55
+ static dataDirectory = path.join(os.homedir(), 'config', 'cli')
56
+
57
+ protected readonly features = new CommandFeatureSelector(this)
58
+ readonly parent: CommandBuilder | null = null
59
+ readonly $: Command<Args, Opts>
60
+ readonly meta = new CommandBuilderMetaData<Args>()
61
+ get db() {
62
+ return realizeLazyProperty(this, 'db', new JsonFile(this))
63
+ }
64
+
65
+ constructor(
66
+ name: string,
67
+ callback?: (this: CommandBuilder<Args, Opts>, cmd: CommandBuilder<Args, Opts>) => void,
68
+ parent?: CommandBuilder,
69
+ isNative = false
70
+ ) {
71
+ this.meta.isNative = isNative
72
+ this.$ = new Command<Args, Opts>(name)
73
+ commanderBackRefs.set(this.$, this)
74
+
75
+ if (parent) {
76
+ this.parent = parent
77
+ this.parent.meta.subcommands.push(this)
78
+ this.parent.$.addCommand(this.$)
79
+ }
80
+
81
+ this.initializeHelp()
82
+
83
+ if (callback) callback.call(this, this)
84
+
85
+ if (this.parent) {
86
+ this.$.copyInheritedSettings(this.parent.$)
87
+ this.features.inheritFrom(this.parent.features)
88
+ this.inheritParentHiddenGlobals()
89
+ }
90
+
91
+ if (!this.meta.isNative) {
92
+ this.assertCommandNameNotReserved(this.name)
93
+ this.addUtilCommands()
94
+ }
95
+
96
+ if (this.isRoot) {
97
+ for (const child of this.getChildrenIterator({ includeSelf: true })) {
98
+ if (child.features.isAutoAssignSubCommandAliasesEnabled) {
99
+ child.assignSubCommandAliases()
100
+ if (!child.meta.isNative) {
101
+ child.assertNoDuplicateCommandNames()
102
+ }
103
+ }
104
+ if (child.features.isAutoAssignMissingOptionFlagsEnabled) {
105
+ child.assignMissingOptionFlags()
106
+ if (!child.meta.isNative) {
107
+ child.assertNoDuplicateOptionNames()
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+
114
+ setRecommended() {
115
+ this.enableBuiltinOptions({ debug: true, disableStderr: true, disableStdout: true })
116
+ this.autoAssignMissingOptionFlags()
117
+ this.autoAssignSubCommandAliases()
118
+ this.presetsEnabled()
119
+ }
120
+
121
+ deleteDataFile() {
122
+ const filepath = this.dataFilepath
123
+ if (fs.existsSync(filepath)) removeFile(filepath)
124
+ }
125
+
126
+ version(string: string) {
127
+ this.$.version(string)
128
+ const opt = this.options.find((o) => o.attributeName() === 'version')
129
+ if (opt) this.meta.globalOptions.push(opt)
130
+ return this
131
+ }
132
+
133
+ description(...lines: string[]) {
134
+ const description = lines.join('\n')
135
+ const summary = description.split(/(\. ?|\n|$)/)[0]
136
+ this.$.summary(summary + '.')
137
+ this.$.description(description)
138
+ return this
139
+ }
140
+
141
+ alias(alias: string) {
142
+ this.assertCommandNameNotReserved(alias)
143
+ this.$.alias(alias)
144
+ return this
145
+ }
146
+ aliases(...aliases: string[]) {
147
+ aliases.forEach((alias) => this.assertCommandNameNotReserved(alias))
148
+ this.$.aliases(aliases)
149
+ return this
150
+ }
151
+
152
+ enableBuiltinOptions(options?: {
153
+ debug?: boolean
154
+ disableColor?: boolean
155
+ disableStderr?: boolean
156
+ disableStdout?: boolean
157
+ }) {
158
+ if (!options || options.debug) this.globalOption('-D, --debug', 'Output debugging information.')
159
+ if (!options || options.disableColor) this.globalOption('-C, --disable-color', 'Disable color in terminal output.')
160
+ if (!options || options.disableStderr) this.globalOption('-E, --disable-stderr', 'Mute all output to stderr.')
161
+ if (!options || options.disableStdout) this.globalOption('-O, --disable-stdout', 'Mute all output to stdout.')
162
+ return this
163
+ }
164
+
165
+ argument(name: string, description?: string): this
166
+ argument(name: string, cb: (opt: ArgumentBuilder, cmd: this) => void): this
167
+ argument(name: string, cb?: string | ((arg: ArgumentBuilder, cmd: this) => void)): this {
168
+ const ins = new ArgumentBuilder(this, name)
169
+ this.$.addArgument(ins.$)
170
+ if (typeof cb === 'function') {
171
+ cb(ins, this)
172
+ } else if (typeof cb === 'string') {
173
+ ins.description(cb)
174
+ }
175
+ return this
176
+ }
177
+ option(flags: string, description?: string): this
178
+ option(flags: string, cb?: (opt: OptionBuilder, cmd: this) => void): this
179
+ option(flags: string, cb?: string | ((opt: OptionBuilder, cmd: this) => void)): this {
180
+ const ins = new OptionBuilder(this, flags)
181
+ if (this.hasIdenticalParentOption(ins.$)) return this
182
+ this.$.addOption(ins.$)
183
+ if (typeof cb === 'function') {
184
+ cb(ins, this)
185
+ } else if (typeof cb === 'string') {
186
+ ins.description(cb)
187
+ }
188
+ return this
189
+ }
190
+ globalOption(flags: string, description?: string): this
191
+ globalOption(flags: string, cb?: (opt: OptionBuilder, cmd: this) => void): this
192
+ globalOption(flags: string, cb?: string | ((opt: OptionBuilder, cmd: this) => void)): this {
193
+ return this.option(flags, (ins) => {
194
+ const opt = ins.$
195
+ this.meta.globalOptions.push(opt)
196
+ if (typeof cb === 'function') {
197
+ cb(ins, this)
198
+ } else if (typeof cb === 'string') {
199
+ ins.description(cb)
200
+ }
201
+ if (opt.hidden) this.meta.hiddenGlobalOptions.add(opt)
202
+ })
203
+ }
204
+ command<A extends Any[] = unknown[], O extends OptionValues = OptionValues>(
205
+ name: string,
206
+ cb: (this: CommandBuilder<A, O>, cmd: CommandBuilder<A, O>) => void
207
+ ): this {
208
+ new CommandBuilder<A, O>(name, cb, this)
209
+ return this
210
+ }
211
+ nativeCommand<A extends Any[] = unknown[], O extends OptionValues = OptionValues>(
212
+ name: string,
213
+ cb: (this: CommandBuilder<A, O>, cmd: CommandBuilder<A, O>) => void
214
+ ): this {
215
+ new CommandBuilder<A, O>(name, cb, this, true)
216
+ return this
217
+ }
218
+ action(fn: (...args: any[]) => void | Promise<void>): this {
219
+ const isAsync = isAsyncFunction(fn) || /^\(.+\) ?=> ?tslib_1\.__awaiter\(/.test(fn.toString().trim())
220
+ this.meta.isActionAsync = isAsync
221
+ Object.defineProperty(this.meta, 'actionHandler', { value: fn, configurable: false, writable: false })
222
+ this.initializeActionWrapper(isAsync)
223
+ return this
224
+ }
225
+ errorHandler(fn: (this: Command, error: unknown, cmd: CommandBuilder<Args, Opts>) => void) {
226
+ Object.defineProperty(this.meta, 'errorHandler', { value: fn, configurable: true })
227
+ return this
228
+ }
229
+ appData(key: string, value: JsonValue) {
230
+ this.features.appData(true)
231
+ this.db.appData.defineProperty(key, value)
232
+ return this
233
+ }
234
+ config(key: string, entry: IConfig<JsonValue>) {
235
+ this.features.config(true)
236
+ this.db.config.defineProperty(key, entry)
237
+ return this
238
+ }
239
+ preset(name: string, preset: IPresetPartial) {
240
+ this.features.presets()
241
+ this.meta.presetOptionKeys.push(name)
242
+ this.db.presets.defineProperty(name, {
243
+ description: preset.description,
244
+ presets: preset.presets ?? [],
245
+ args: preset.args ?? [],
246
+ options: preset.options ?? {},
247
+ })
248
+ return this
249
+ }
250
+ presetsEnabled(boolean = true) {
251
+ this.features.presets(boolean)
252
+ return this
253
+ }
254
+ autoAssignMissingOptionFlags(boolean = true) {
255
+ this.features.autoAssignMissingOptionFlags(boolean)
256
+ return this
257
+ }
258
+ autoAssignSubCommandAliases(boolean = true) {
259
+ this.features.autoAssignSubCommandAliases(boolean)
260
+ return this
261
+ }
262
+ allowExcessArguments(bool = true) {
263
+ this.$.allowExcessArguments(bool)
264
+ return this
265
+ }
266
+ allowUnknownOption(bool = true) {
267
+ this.$.allowUnknownOption(bool)
268
+ return this
269
+ }
270
+ /**
271
+ * Register callback to use as replacement for calling process.exit.
272
+ */
273
+ exitOverride(callback?: (err: CommanderError) => never | void): this {
274
+ this.$.exitOverride(callback)
275
+ return this
276
+ }
277
+ throwInsteadOfProcessExit() {
278
+ const onErr = (err: unknown) => {
279
+ throw err
280
+ }
281
+ this.exitOverride(onErr)
282
+ this.errorHandler(onErr)
283
+ }
284
+ /**
285
+ * Add hook for life cycle event.
286
+ */
287
+ hook(
288
+ event: HookEvent,
289
+ listener: (thisCommand: CommandUnknownOpts, actionCommand: CommandUnknownOpts) => void | Promise<void>
290
+ ): this {
291
+ this.$.hook(event, listener)
292
+ return this
293
+ }
294
+
295
+ /**
296
+ * You can customise the help by overriding Help properties using configureHelp(),
297
+ * or with a subclass of Help by overriding createHelp().
298
+ */
299
+ configureHelp(configuration: HelpConfiguration): this {
300
+ this.$.configureHelp(configuration)
301
+ return this
302
+ }
303
+
304
+ /**
305
+ * Display the help or a custom message after an error occurs.
306
+ */
307
+ showHelpAfterError(displayHelp?: boolean | string): this {
308
+ this.$.showHelpAfterError(displayHelp)
309
+ return this
310
+ }
311
+
312
+ /**
313
+ * Display suggestion of similar commands for unknown commands, or options for unknown options.
314
+ */
315
+ showSuggestionAfterError(displaySuggestion?: boolean): this {
316
+ this.$.showSuggestionAfterError(displaySuggestion)
317
+ return this
318
+ }
319
+
320
+ /**
321
+ * Add additional text to be displayed with the built-in help.
322
+ *
323
+ * Position is 'before' or 'after' to affect just this command,
324
+ * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
325
+ */
326
+ addHelpText(position: AddHelpTextPosition, text: string) {
327
+ this.$.addHelpText(position, text)
328
+ return this
329
+ }
330
+ throwCommanderError(message: string, exitCode = 1, type = 'error'): never {
331
+ throw new CommanderError(exitCode, type, message)
332
+ }
333
+
334
+ hideGlobalOptions(...names: string[]) {
335
+ const globals = this.getGlobalOptions()
336
+ names = names.length ? names : globals.map((opt) => opt.attributeName())
337
+ for (const name of names) {
338
+ if (!name) continue
339
+ let found = false
340
+ for (const opt of globals) {
341
+ if (opt.attributeName() === name) {
342
+ this.meta.hiddenGlobalOptions.add(opt)
343
+ found = true
344
+ break
345
+ }
346
+ }
347
+
348
+ if (!found) this.throwCommanderError(`Unknown global option name: ${name} for command, ${this.name}`)
349
+ }
350
+ return this
351
+ }
352
+ unhideGlobalOptions(...names: string[]) {
353
+ const globals = this.getGlobalOptions()
354
+ names = names.length ? names : globals.map((opt) => opt.attributeName())
355
+ for (const name of names) {
356
+ if (!name) continue
357
+ let found = false
358
+ for (const opt of globals) {
359
+ if (opt.attributeName() === name) {
360
+ this.meta.hiddenGlobalOptions.delete(opt)
361
+ found = true
362
+ break
363
+ }
364
+ }
365
+ if (!found) this.throwCommanderError(`Unknown global option name: ${name} for command, ${this.name}`)
366
+ }
367
+ return this
368
+ }
369
+ /**
370
+ * Set the directory for searching for executable subcommands of this command.
371
+ */
372
+ executableDir(path: string): this {
373
+ this.$.executableDir(path)
374
+ return this
375
+ }
376
+
377
+ /**
378
+ * Store option value.
379
+ */
380
+ setOptionValue(key: string, value: unknown): this {
381
+ this.$.setOptionValue(key, value)
382
+ return this
383
+ }
384
+
385
+ /**
386
+ * Store option value and where the value came from.
387
+ */
388
+ setOptionValueWithSource(key: string, value: unknown, source: OptionValueSource): this {
389
+ this.$.setOptionValueWithSource(key, value, source)
390
+ return this
391
+ }
392
+ setDataFilepath(filepath: string) {
393
+ Object.defineProperty(this, 'dataFilepath', { value: filepath })
394
+ if (Object.hasOwn(this, 'db') && Object.hasOwn(this.db, 'db')) {
395
+ this.db.db.setFilepath(filepath)
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Display error message and exit (or call exitOverride).
401
+ */
402
+ outputError(message: string, options?: ErrorOptions) {
403
+ this.$.error(message, options)
404
+ }
405
+
406
+ /**
407
+ * Output help information for this command.
408
+ */
409
+ outputHelp() {
410
+ console.log(this.getRenderedHelp())
411
+ }
412
+
413
+ /**
414
+ * Display error message and exit (or call exitOverride).
415
+ */
416
+ outputDebugMessage(event: string, getProps: () => Record<string, unknown> = () => ({})) {
417
+ OutputManager.getInstance().outputDebug(() => ({ event, cmd: this.getPrefixString(), ...getProps() }))
418
+ }
419
+
420
+ parseArguments(args: string[]) {
421
+ const last = this.arguments.length - 1
422
+ return args.map((arg, i) => {
423
+ if (!arg) return arg
424
+ const parse = this.meta.argParsers[i > last ? last : i]
425
+ return parse ? (Array.isArray(arg) ? arg.map(parse) : parse(arg)) : arg
426
+ })
427
+ }
428
+
429
+ /**
430
+ * Parses (and validates) options using the parsers defined in the command builder.
431
+ */
432
+ parseOptions(opts: OptionValues) {
433
+ for (const [key, value] of Object.entries(opts)) {
434
+ const parse = this.meta.optParsers[key]
435
+ opts[key] = parse ? (Array.isArray(value) ? value.map(parse) : parse(value as string)) : value
436
+ }
437
+ return opts
438
+ }
439
+
440
+ /**
441
+ * Validate ALREADY PARSED args using the validators defined in the command builder.
442
+ */
443
+ assertValidArguments(parsedArgs: Any[]) {
444
+ const last = this.arguments.length - 1
445
+ parsedArgs.forEach((arg, i) => {
446
+ if (arg == null) return
447
+ const index = i > last ? last : i
448
+ const validators = this.meta.argValidators[index]
449
+ if (!validators) return
450
+ for (const isValid of validators) {
451
+ ensureThat(arg, isValid, { Err: InvalidArgumentError })
452
+ }
453
+ })
454
+ return parsedArgs
455
+ }
456
+
457
+ /**
458
+ * Validate ALREADY PARSED options using the validators defined in the command builder.
459
+ */
460
+ assertValidOptions(parsedOptions: OptionValues) {
461
+ for (const [key, value] of Object.entries(parsedOptions)) {
462
+ if (!this.meta.optValidators[key]) continue
463
+ if (value == null) continue
464
+ for (const isValid of this.meta.optValidators[key]) {
465
+ ensureThat(value, isValid)
466
+ }
467
+ }
468
+ return parsedOptions
469
+ }
470
+
471
+ assertValidPreset(key: string, preset: IPreset) {
472
+ const { description, presets, args, options } = preset
473
+ ensureThat(key, isStringWithNoSpacesOrDashes)
474
+ ensureThat(description, isString)
475
+ ensureThat(presets, isStringArray)
476
+ ensureThat(args, isArray)
477
+ this.assertPresetArgsOptional(args)
478
+ this.assertValidArguments(args)
479
+ ensureThat(options, isObject)
480
+ this.assertValidOptions(options)
481
+ }
482
+
483
+ get name() {
484
+ return this.$.name()
485
+ }
486
+ /**
487
+ * Get the command at the root of the command tree.
488
+ */
489
+ get root(): CommandBuilder {
490
+ if (this.isRoot) return this
491
+ return this.getAncestors().pop() as CommandBuilder
492
+ }
493
+ get isRoot() {
494
+ return !this.parent
495
+ }
496
+ get arguments() {
497
+ return this.$.registeredArguments
498
+ }
499
+ get options() {
500
+ return this.$.options
501
+ }
502
+ get commander() {
503
+ return this.$
504
+ }
505
+ get hasGrandChildren() {
506
+ return this.meta.subcommands.some((sub) => !!sub.meta.subcommands.length)
507
+ }
508
+ /**
509
+ * Returns whether a command's last argument is variadic.
510
+ */
511
+ get isLastArgVariadic() {
512
+ if (!this.arguments.length) return false
513
+ return arrLast(this.arguments as Argument[]).variadic
514
+ }
515
+ get dataFilepath() {
516
+ return path.join(CommandBuilder.dataDirectory, this.root.name + '.json')
517
+ }
518
+
519
+ /**
520
+ * Get the executable search directory.
521
+ */
522
+ getExecutableDir(): string | null {
523
+ return this.$.executableDir()
524
+ }
525
+ /**
526
+ * Retrieve option value.
527
+ */
528
+ getOptionValue(key: string): Any {
529
+ return this.$.getOptionValue(key)
530
+ }
531
+
532
+ /**
533
+ * Get source of option value.
534
+ */
535
+ getOptionValueSource(key: string): OptionValueSource | undefined {
536
+ return this.$.getOptionValueSource(key)
537
+ }
538
+
539
+ /**
540
+ * Get source of option value. See also .optsWithGlobals().
541
+ */
542
+ getOptionValueSourceWithGlobals(key: string): OptionValueSource | undefined {
543
+ return this.$.getOptionValueSourceWithGlobals(key)
544
+ }
545
+ getActionHandler() {
546
+ return this.meta.actionHandler
547
+ }
548
+ getDescription() {
549
+ return this.$.description()
550
+ }
551
+ getSummary() {
552
+ return this.$.summary()
553
+ }
554
+ getVersion() {
555
+ return this.$.version()
556
+ }
557
+ getAlias() {
558
+ return this.$.alias()
559
+ }
560
+ getAliases() {
561
+ return this.$.aliases()
562
+ }
563
+
564
+ /**
565
+ * Get a commands prefix array based on all its parent/ancestor commands.
566
+ */
567
+ getPrefixArray(): string[] {
568
+ return this.getAncestors({ includeSelf: true })
569
+ .reverse()
570
+ .map((node) => node.name)
571
+ }
572
+
573
+ /**
574
+ * Get a commands prefix string based on all its parent/ancestor commands.
575
+ */
576
+ getPrefixString() {
577
+ return this.getPrefixArray().join(' ')
578
+ }
579
+
580
+ getGlobalOptions(): Option[] {
581
+ const result: Option[] = []
582
+ for (const anc of this.getAncestors({ includeSelf: true }).reverse()) {
583
+ for (const gopt of anc.meta.globalOptions) {
584
+ if (!this.meta.hiddenGlobalOptions.has(gopt)) {
585
+ result.push(gopt)
586
+ }
587
+ }
588
+ }
589
+ return result
590
+ }
591
+
592
+ getOwnAndGlobalOptions(): Option[] {
593
+ return this.options.concat(this.getGlobalOptions())
594
+ }
595
+
596
+ *getChildrenIterator(options?: { includeSelf?: boolean }): Generator<CommandBuilder> {
597
+ if (options?.includeSelf) yield this
598
+ for (const sub of this.meta.subcommands) {
599
+ yield sub
600
+ yield* sub.getChildrenIterator()
601
+ }
602
+ }
603
+
604
+ getChildren(options?: { includeSelf?: boolean }) {
605
+ return [...this.getChildrenIterator(options)]
606
+ }
607
+
608
+ *getAncestorsIterator(options?: { includeSelf?: boolean }): Generator<CommandBuilder> {
609
+ if (options?.includeSelf) yield this
610
+ let node = this.parent
611
+ while (node) {
612
+ yield node
613
+ node = node.parent
614
+ }
615
+ }
616
+
617
+ /**
618
+ * Get a command's ancestors, optionally starting from the command itself.
619
+ */
620
+ getAncestors(options?: { includeSelf?: boolean }): CommandBuilder[] {
621
+ return [...this.getAncestorsIterator(options)]
622
+ }
623
+
624
+ *getSiblingsIterator() {
625
+ if (!this.parent) return
626
+ for (const sub of this.parent.meta.subcommands) {
627
+ if (sub === this) continue
628
+ yield sub
629
+ }
630
+ }
631
+
632
+ /**
633
+ * Returns an array of sibling CommandBuilder objects.
634
+ */
635
+ getSiblings() {
636
+ return [...this.getSiblingsIterator()]
637
+ }
638
+ getClosestNonNativeParent() {
639
+ for (const anc of this.getAncestorsIterator({ includeSelf: true })) {
640
+ if (!anc.meta.isNative) return anc
641
+ }
642
+ this.throwCommanderError('No non-native parent found')
643
+ }
644
+
645
+ getRenderedHelp() {
646
+ return this.$.helpInformation()
647
+ }
648
+
649
+ getOptsWithGlobalsParsed() {
650
+ return this.parseOptions(this.$.optsWithGlobals())
651
+ }
652
+
653
+ getParsedValidArgsOptsWithPresets(): [Any[], OptionValues] {
654
+ const [presetArgs, presetOpts, presetOrder] = this.getPresetArgsAndOpts()
655
+ const args = this.getParsedValidArgsWithPresets(presetArgs)
656
+ const opts = this.getParsedValidOptsWithPresets(presetOpts)
657
+ this.debugLogArgsOpts(args, opts, presetArgs, presetOpts, presetOrder)
658
+ return [args, opts]
659
+ }
660
+
661
+ getParsedValidArgsWithPresets(presetArgs: Any[][]) {
662
+ const result = arrAssign([], ...presetArgs, this.parseArguments(this.$.args))
663
+ this.combineVariadicArgs(result)
664
+ this.assertValidArguments(result)
665
+ return this.padArgsWithUndefinedUntilExpectedLength(result)
666
+ }
667
+
668
+ getParsedValidOptsWithPresets(presetOpts: OptionValues[]) {
669
+ const parsed = this.getOptsWithGlobalsParsed()
670
+ const opts = presetOpts.length ? objAssign({}, ...presetOpts, parsed) : parsed
671
+ this.deleteOptionsWithDefaultOrNoValue(opts)
672
+ this.assertValidOptions(opts)
673
+ return opts
674
+ }
675
+
676
+ getPresetArgsAndOpts(): [presetArgs: string[][], presetOpts: OptionValues[], presetOrder: string[]] {
677
+ if (!this.features.isPresetsEnabled) return [[], [], []]
678
+ const presets = this.db.presets.getAll()
679
+ const opts = this.$.optsWithGlobals()
680
+ const selectedPresets = Object.keys(presets).filter((name) => opts[name] === true)
681
+ const presetOrder = Object.keys(opts).filter((key) => selectedPresets.includes(key))
682
+ const presetArgs: string[][] = presetOrder.map((name) => presets[name].args)
683
+ const presetOpts: OptionValues[] = presetOrder.map((name) => presets[name].options)
684
+ return [presetArgs, presetOpts, presetOrder]
685
+ }
686
+
687
+ protected combineVariadicArgs(result: Any[]) {
688
+ if (this.isLastArgVariadic && result.length && !Array.isArray(arrLast(result))) {
689
+ const rest = result.splice(this.arguments.length - 1)
690
+ result.push(rest.filter((arg) => arg != null))
691
+ }
692
+ return result
693
+ }
694
+
695
+ protected debugLogArgsOpts(
696
+ args: Any[],
697
+ opts: OptionValues,
698
+ presetArgs: string[][],
699
+ presetOpts: OptionValues[],
700
+ presetOrder: string[]
701
+ ) {
702
+ if (opts['debug']) {
703
+ if (this.features.isPresetsEnabled) {
704
+ this.outputDebugMessage('parsePresets', () => ({ presetOrder, presetArgs, presetOpts }))
705
+ }
706
+ this.outputDebugMessage('parseArgsOpts', () => {
707
+ return {
708
+ args,
709
+ opts,
710
+ command: [this.root.name, ...this.meta.rawArgs].join(' '),
711
+ }
712
+ })
713
+ }
714
+ }
715
+
716
+ protected deleteOptionsWithDefaultOrNoValue(opts: OptionValues) {
717
+ const names = new Set(this.getOwnAndGlobalOptions().map((o) => o.attributeName()))
718
+ for (const [key, value] of Object.entries(opts)) {
719
+ if (!names.has(key) || value === false || value == null) {
720
+ setNonEnumerable(opts, key)
721
+ }
722
+ }
723
+ for (const key of this.meta.presetOptionKeys) {
724
+ if (Object.hasOwn(opts, key)) {
725
+ setNonEnumerable(opts, key)
726
+ }
727
+ }
728
+ return opts
729
+ }
730
+
731
+ protected handleOutputOptions() {
732
+ const opts = this.$.optsWithGlobals()
733
+ const om = OutputManager.getInstance().reset()
734
+ if (opts['disableColor']) om.colors.enabled = false
735
+ if (opts['disableStderr']) om.stderr.disable()
736
+ if (opts['disableStdout']) om.stdout.disable()
737
+ if (opts['debug']) {
738
+ om.debug.enable()
739
+ om.drainDebugMessageQueue()
740
+ }
741
+ }
742
+
743
+ protected padArgsWithUndefinedUntilExpectedLength(args: Any[]) {
744
+ while (args.length < this.arguments.length) args.push(undefined)
745
+ return args
746
+ }
747
+
748
+ protected assertPresetArgsOptional(args: Any[]) {
749
+ args.forEach((arg, i) => {
750
+ if (arg != null && i < this.arguments.length && this.arguments[i].required) {
751
+ this.throwCommanderError(`Cannot preset required arguments.`)
752
+ }
753
+ })
754
+ }
755
+
756
+ protected addUtilCommands() {
757
+ if (
758
+ !this.hasGrandChildren &&
759
+ !this.features.isConfigEnabled &&
760
+ !this.features.isPresetsEnabled &&
761
+ !this.features.isAppDataEnabled
762
+ ) {
763
+ return
764
+ }
765
+
766
+ this.nativeCommand('util', (u) => {
767
+ const cmd = u.getClosestNonNativeParent()
768
+ u.alias('u')
769
+ u.description('Utility commands.')
770
+ if (cmd.features.isConfigEnabled) {
771
+ u.nativeCommand('config', createConfigCommand)
772
+ }
773
+ if (cmd.features.isPresetsEnabled && cmd.meta.hasCustomActionHandler) {
774
+ u.nativeCommand('presets', createPresetsCommand)
775
+ }
776
+ if (cmd.hasGrandChildren) {
777
+ u.nativeCommand('list', createUtilListCommand)
778
+ }
779
+ if (cmd.features.isConfigEnabled || cmd.features.isPresetsEnabled || cmd.features.isAppDataEnabled) {
780
+ u.nativeCommand('filepath', createUtilFilepathCommand)
781
+ }
782
+
783
+ function createUtilFilepathCommand(f: CommandBuilder) {
784
+ f.alias('f')
785
+ f.description('Print filepath to JSON file containing user data, eg. config and presets.')
786
+ f.action(async () => console.log(cmd.dataFilepath))
787
+ }
788
+
789
+ function createUtilListCommand(l: CommandBuilder) {
790
+ l.alias('l')
791
+ l.description('List nested subcommands.')
792
+ l.option('--all', 'Include utility commands.')
793
+ l.action(async (opts: { all?: boolean }) => {
794
+ const filter = opts.all
795
+ ? undefined
796
+ : (prefix: string) => {
797
+ return !/ (config|presets|util)( .+)?$/gi.test(prefix)
798
+ }
799
+ const table: string[][] = []
800
+ for (const c of cmd.getChildrenIterator({ includeSelf: true })) {
801
+ const prefix = c.getPrefixString()
802
+ if (filter && !filter(prefix)) continue
803
+ table.push([prefix, c.getSummary()])
804
+ }
805
+ const ansi = table.map((row) => {
806
+ const arr = row[0].split(' ')
807
+ const last = arr.pop() as string
808
+ let col = colors.magenta
809
+ if (row[1].startsWith('[Preset]')) {
810
+ col = colors.green
811
+ } else if (/ (util|config|presets) /.test(row[0])) {
812
+ col = colors.gray
813
+ } else if (/ (util|config|presets)/.test(row[0])) {
814
+ col = colors.dim
815
+ }
816
+ row[0] = arr.map(colors.dim).concat(col(last)).join(' ')
817
+ return row
818
+ })
819
+ console.log(formatTableForTerminal(ansi, ['Command', 'Summary']))
820
+ })
821
+ }
822
+
823
+ function createPresetsCommand(p: CommandBuilder) {
824
+ const db = cmd.db.presets as PresetsSection
825
+ p.alias('p')
826
+ p.description(
827
+ 'Edit presets in your text editor',
828
+ '',
829
+ 'A preset consists of pre-set arguments and/or options for a command.',
830
+ 'Additionally, a preset can have other presets as dependencies.',
831
+ 'When running the command, multiple presets can be stacked.',
832
+ 'Required arguments cannot be pre-set.'
833
+ )
834
+ p.nativeCommand('edit', (e) => {
835
+ e.alias('e')
836
+ e.description('Edit as JSON in a text editor.')
837
+ e.option('--editor [cmd]', 'The command to launch your preferred text editor.')
838
+ e.action(async (opts: { editor: string }) => {
839
+ db.edit(opts.editor)
840
+ console.info(db.getAll())
841
+ })
842
+ })
843
+ p.nativeCommand('list', (l) => {
844
+ l.alias('l')
845
+ l.description('List all presets.')
846
+ l.action(async () => console.dir(db.getAll(), { depth: null }))
847
+ })
848
+ for (const [key, preset] of Object.entries(db.getAll())) {
849
+ if (key === 'defaults') continue
850
+ cmd.option(`--${key}`, (o) => {
851
+ o.description('[Preset]: ' + preset.description)
852
+ const implied: Record<string, boolean> = { defaults: true }
853
+ const recurse = (preset: string) => {
854
+ if (implied[preset]) return
855
+ implied[preset] = true
856
+ db.get(preset).presets.forEach((k) => recurse(k))
857
+ }
858
+ recurse(key)
859
+ o.implies(implied)
860
+ })
861
+ }
862
+ }
863
+
864
+ function createConfigCommand(c: CommandBuilder) {
865
+ const db = cmd.db.config
866
+ c.alias('c')
867
+ c.description('Manage configuration file.')
868
+ c.nativeCommand('edit', (e) => {
869
+ e.alias('e')
870
+ e.description('Edit as JSON in a text editor.')
871
+ e.option('--editor [cmd]', 'The command to launch your preferred text editor.')
872
+ e.action(async (opts: { editor: string }) => {
873
+ db.edit(opts.editor)
874
+ console.info(db.getAll())
875
+ })
876
+ })
877
+ c.nativeCommand('list', (l) => {
878
+ l.alias('l')
879
+ l.description('Print entire config with details.')
880
+ l.action(async () => {
881
+ const result = db.keys.map((key: string) => ({
882
+ key,
883
+ description: db.descriptions[key],
884
+ value: db.get(key),
885
+ defaultValue: db.defaultValues,
886
+ }))
887
+ console.dir(result, { depth: null })
888
+ })
889
+ })
890
+ c.nativeCommand('get', (g) => {
891
+ g.alias('g')
892
+ g.description('Print value(s) from the config.')
893
+ g.argument('[key]', 'The key to print the value of. Omit to print all values.')
894
+ g.action(async (key: string) => console.log(key ? db.get(key) : db.getAll()))
895
+ })
896
+ c.nativeCommand('set', (s) => {
897
+ s.alias('s')
898
+ s.description('Set a value in the config.')
899
+ s.argument('<key>', 'The key to set the value of.')
900
+ s.argument('<value>', 'The new value.')
901
+ s.action(async (key: string, val: string) => {
902
+ const parse = db.parsers[key]
903
+ const value = typeof parse === 'function' ? parse(val) : val
904
+ db.set(key, value)
905
+ console.info({ [key]: value })
906
+ })
907
+ })
908
+ c.nativeCommand('reset', (r) => {
909
+ r.alias('r')
910
+ r.description('Reset to defaults.')
911
+ r.argument('[key]', 'The key for which to reset the value. Omit to reset entire config.')
912
+ r.action(async (key: string) => {
913
+ if (key) db.reset(key)
914
+ else db.resetAll()
915
+ console.info(db.getAll())
916
+ })
917
+ })
918
+ }
919
+ })
920
+ }
921
+
922
+ /**
923
+ * Makes aliases for the command.
924
+ * The idea is to be able to navigate the command tree by only typing the first letter(s) of the command names.
925
+ *
926
+ * Example: A command 'cola' would get these aliases: ['c', 'co', 'col'].
927
+ * However, if there are namespace clashes with sibling subcommands that start with the same letter,
928
+ * eg. like 'cola' and 'coal' where the first two letters clash, cola's aliases are reduced to only ['col'] and similarly for 'coal'.
929
+ *
930
+ * This method creates the aliases, ensuring there are no clashes with sublings, why it is important that the
931
+ * entire command tree is built before invoking this method.
932
+ */
933
+ protected assignSubCommandAliases() {
934
+ if (this.getAlias() || this.name.length <= 1) return this
935
+ const sibAliases = this.getSiblings()
936
+ .map((sib) => sib.getAliases())
937
+ .flat()
938
+ for (let i = 0; i < this.name.length - 1; i++) {
939
+ let cmdAlias = this.name.substring(0, i + 1)
940
+ let isClash = arrSome(sibAliases, (sibAlias) => {
941
+ return cmdAlias === sibAlias
942
+ })
943
+ if (isClash && i === 0) {
944
+ cmdAlias = cmdAlias.charAt(0).toUpperCase()
945
+ isClash = arrSome(sibAliases, (sibAlias) => {
946
+ return cmdAlias === sibAlias
947
+ })
948
+ }
949
+ if (isClash) continue
950
+ this.alias(cmdAlias)
951
+ return this
952
+ }
953
+ return this
954
+ }
955
+
956
+ /**
957
+ * Automatically set 'short' and 'long' names to options that don't have one assigned yet.
958
+ *
959
+ * First, it tries to assign a short name based on the first letter of the option's attribute name
960
+ * Both lower and upper case are tried. If these is not available, the next letter of the option name is tried.
961
+ *
962
+ * If none of the letters of the option name are available, the option is skipped until all other
963
+ * options have had letters from their names attempted assigned.
964
+ * Those that remain are assigned the first available letter of the alphabet + 0-9.
965
+ * If there are 64 options for the command and no more alphanumeric characters are available,
966
+ * the option is not assigned a short name.
967
+ */
968
+ protected assignMissingOptionFlags() {
969
+ const taken = new Set<string>()
970
+ for (const anc of this.getAncestorsIterator({ includeSelf: true })) {
971
+ anc.options.forEach((opt) => {
972
+ if (!opt.short) return
973
+ taken.add(opt.short.replace(/^-/g, ''))
974
+ })
975
+ }
976
+
977
+ const failed = new Set<Option>()
978
+
979
+ // assign letter from option name
980
+ this.options.forEach((opt) => {
981
+ if (opt.short) return
982
+ const name = opt.attributeName()
983
+ for (let c = 0; c < name.length; c++) {
984
+ let char = name.charAt(c).toLowerCase()
985
+ if (taken.has(char)) {
986
+ char = char.toUpperCase()
987
+ if (taken.has(char)) continue
988
+ }
989
+ OptionHelpers.setShort(opt, char)
990
+ taken.add(char)
991
+ return
992
+ }
993
+ failed.add(opt)
994
+ })
995
+
996
+ // assign random alphanumeric character.
997
+ const name = 'abcdefghijklmnopqrstuvwxyz1234567890'
998
+ failed.forEach((opt) => {
999
+ for (let c = 0; c < name.length; c++) {
1000
+ let char = name.charAt(c)
1001
+ if (taken.has(char)) {
1002
+ char = char.toUpperCase()
1003
+ if (taken.has(char)) continue
1004
+ }
1005
+ OptionHelpers.setShort(opt, char)
1006
+ taken.add(char)
1007
+ return
1008
+ }
1009
+ })
1010
+ }
1011
+
1012
+ protected assertNoDuplicateCommandNames() {
1013
+ const names = this.$.commands.map((sub) => sub.aliases().concat(sub.name())).flat()
1014
+ if (names.length !== new Set(names).size) {
1015
+ this.throwCommanderError(
1016
+ `Duplicate subcommand names/aliases found for command, ${this.name}: ${names.join(', ')}`
1017
+ )
1018
+ }
1019
+ }
1020
+ protected hasIdenticalParentOption(option: Option) {
1021
+ const flags = option.flags
1022
+ for (const anc of this.getAncestorsIterator({ includeSelf: true })) {
1023
+ for (const opt of anc.$.options) {
1024
+ if (flags === opt.flags) {
1025
+ return true
1026
+ }
1027
+ }
1028
+ }
1029
+ return false
1030
+ }
1031
+ protected assertNoDuplicateOptionNames() {
1032
+ const throwErr = (cmd: CommandBuilder, opt: string, anc?: CommandBuilder) => {
1033
+ this.throwCommanderError(
1034
+ `Duplicate option names > cmd: ${cmd.name}, ${anc ? `anc: ${anc.name}, ` : ''}opt: ${opt}`
1035
+ )
1036
+ }
1037
+ const set = new Set<string>()
1038
+ for (const opt of this.options) {
1039
+ if (opt.name() === 'help') continue
1040
+ if (opt.short) {
1041
+ if (set.has(opt.short)) throwErr(this, opt.short)
1042
+ set.add(opt.short)
1043
+ }
1044
+ if (opt.long) {
1045
+ if (set.has(opt.long)) throwErr(this, opt.long)
1046
+ set.add(opt.long)
1047
+ }
1048
+ if (opt.attributeName()) {
1049
+ if (set.has(opt.attributeName())) throwErr(this, opt.attributeName())
1050
+ set.add(opt.attributeName())
1051
+ }
1052
+ }
1053
+ for (const anc of this.getAncestorsIterator()) {
1054
+ for (const opt of anc.$.options) {
1055
+ if (opt.short && set.has(opt.short)) {
1056
+ if (opt.short !== 'V') continue
1057
+ throwErr(this, opt.short, anc)
1058
+ }
1059
+ if (opt.long && set.has(opt.long)) {
1060
+ throwErr(this, opt.long, anc)
1061
+ }
1062
+ if (opt.attributeName() && set.has(opt.attributeName())) {
1063
+ throwErr(this, opt.attributeName(), anc)
1064
+ }
1065
+ }
1066
+ }
1067
+ }
1068
+ protected initializeActionWrapper(isAsync = false) {
1069
+ if (isAsync) {
1070
+ this.$.action(async () => {
1071
+ try {
1072
+ this.handleOutputOptions()
1073
+ const [args, opts] = this.getParsedValidArgsOptsWithPresets()
1074
+ if (opts['help']) return this.outputHelp()
1075
+ type TArgs = typeof this.$.args
1076
+ const owg = this.$.optsWithGlobals()
1077
+ type TOpts = typeof owg
1078
+ await this.meta.actionHandler.call(this, ...(args as TArgs), opts as TOpts, this)
1079
+ } catch (error) {
1080
+ this.meta.errorHandler.call(this, error, this)
1081
+ }
1082
+ })
1083
+ } else {
1084
+ this.$.action(() => {
1085
+ try {
1086
+ this.handleOutputOptions()
1087
+ const [args, opts] = this.getParsedValidArgsOptsWithPresets()
1088
+ if (opts['help']) return this.outputHelp()
1089
+ // type TArgs = ReturnTypesOfFunctionArray<typeof this.meta.argParsers>
1090
+ // type TOpts = ReturnTypesOfFunctionMap<typeof this.meta.optParsers>
1091
+ type TArgs = typeof this.$.args
1092
+ const owg = this.$.optsWithGlobals()
1093
+ type TOpts = typeof owg
1094
+ this.meta.actionHandler.call(this, ...(args as TArgs), opts as TOpts, this)
1095
+ } catch (error) {
1096
+ this.meta.errorHandler.call(this, error, this)
1097
+ }
1098
+ })
1099
+ }
1100
+ }
1101
+
1102
+ protected initializeHelp() {
1103
+ if (this.isRoot) this.globalOption('-h, --help', 'show help')
1104
+ this.$.addHelpCommand('?', 'show help')
1105
+ this.$.configureHelp(DefaultHelpConfig)
1106
+ }
1107
+
1108
+ protected inheritParentHiddenGlobals() {
1109
+ if (!this.parent) return
1110
+ for (const opt of this.parent.meta.hiddenGlobalOptions) {
1111
+ this.meta.hiddenGlobalOptions.add(opt)
1112
+ }
1113
+ }
1114
+
1115
+ protected assertCommandNameNotReserved(name: string) {
1116
+ if (this.isRoot) return
1117
+ if (this.meta.isNative) return
1118
+ if (name === 'u' || name === 'util') {
1119
+ this.throwCommanderError(`Name '${name}' is reserved and is not available as name or alias.`)
1120
+ }
1121
+ }
1122
+ }
1123
+
1124
+ process.argv = splitCombinedArgvShorts(process.argv.slice())
1125
+
1126
+ export const commanderBackRefs = new WeakMap<Command<Any, Any>, CommandBuilder<Any, Any>>()
1127
+ const oldParse = Command.prototype.parse
1128
+ Command.prototype.parse = function parse(this: Command, argv?: readonly string[], options?: ParseOptions) {
1129
+ if (argv) {
1130
+ argv = splitCombinedArgvShorts(argv.slice())
1131
+ this.builder.meta.rawArgs = argv.slice(options?.from === 'user' ? 0 : 2)
1132
+ } else {
1133
+ this.builder.meta.rawArgs = process.argv.slice(2)
1134
+ }
1135
+ return oldParse.call(this, argv, options)
1136
+ }
1137
+
1138
+ const oldParseAsync = Command.prototype.parseAsync
1139
+ Command.prototype.parseAsync = async function (this: Command, argv?: readonly string[], options?: ParseOptions) {
1140
+ if (argv) {
1141
+ argv = splitCombinedArgvShorts(argv.slice())
1142
+ this.builder.meta.rawArgs = argv.slice(options?.from === 'user' ? 0 : 2)
1143
+ } else {
1144
+ this.builder.meta.rawArgs = process.argv.slice(2)
1145
+ }
1146
+ return await oldParseAsync.call(this, argv, options)
1147
+ }
1148
+ Object.defineProperty(Command.prototype, 'builder', {
1149
+ get(this: Command) {
1150
+ const ins = commanderBackRefs.get(this)
1151
+ if (!ins) throw new Error(`CommandBuilder not found for command ${this.name()}`)
1152
+ return ins
1153
+ },
1154
+ })
1155
+
1156
+ declare module '@commander-js/extra-typings' {
1157
+ interface Command {
1158
+ get builder(): CommandBuilder
1159
+ }
1160
+ }
1161
+
1162
+ export function CLI(name: string, cb: (cmd: CommandBuilder) => void) {
1163
+ return new CommandBuilder(name, cb).commander
1164
+ }