@jakubmazanec/cli 0.3.0-unstable.e1ae458 → 0.3.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 (253) hide show
  1. package/build/constants.js +8 -0
  2. package/build/constants.js.map +7 -0
  3. package/build/main.js +4 -0
  4. package/build/main.js.map +7 -0
  5. package/{dist → build}/program/Command.d.ts +1 -1
  6. package/build/program/Command.js +70 -0
  7. package/build/program/Command.js.map +7 -0
  8. package/{dist → build}/program/CommandAction.d.ts +1 -1
  9. package/build/program/CommandAction.js +2 -0
  10. package/build/program/CommandAction.js.map +7 -0
  11. package/build/program/CommandArguments.js +2 -0
  12. package/build/program/CommandArguments.js.map +7 -0
  13. package/build/program/CommandOptions.js +2 -0
  14. package/build/program/CommandOptions.js.map +7 -0
  15. package/{dist → build}/program/Program.d.ts +1 -1
  16. package/build/program/Program.js +191 -0
  17. package/build/program/Program.js.map +7 -0
  18. package/build/program/ProgramCreateOptions.js +2 -0
  19. package/build/program/ProgramCreateOptions.js.map +7 -0
  20. package/build/program/ProgramDetail.js +2 -0
  21. package/build/program/ProgramDetail.js.map +7 -0
  22. package/{dist → build}/program/ProgramError.d.ts +1 -1
  23. package/build/program/ProgramError.js +6 -0
  24. package/build/program/ProgramError.js.map +7 -0
  25. package/build/program/ProgramOptions.js +2 -0
  26. package/build/program/ProgramOptions.js.map +7 -0
  27. package/build/program/ProgramStreams.js +2 -0
  28. package/build/program/ProgramStreams.js.map +7 -0
  29. package/build/program/getProgramDetail.js +25 -0
  30. package/build/program/getProgramDetail.js.map +7 -0
  31. package/build/program.js +13 -0
  32. package/build/program.js.map +7 -0
  33. package/build/ui/ErrorDetail.js +2 -0
  34. package/build/ui/ErrorDetail.js.map +7 -0
  35. package/build/ui/Failure.js +20 -0
  36. package/build/ui/Failure.js.map +7 -0
  37. package/build/ui/Header.js +19 -0
  38. package/build/ui/Header.js.map +7 -0
  39. package/build/ui/Help.js +38 -0
  40. package/build/ui/Help.js.map +7 -0
  41. package/build/ui/Spinner.js +24 -0
  42. package/build/ui/Spinner.js.map +7 -0
  43. package/build/ui/colors.js +12 -0
  44. package/build/ui/colors.js.map +7 -0
  45. package/build/ui/form/Form.js +2 -0
  46. package/build/ui/form/Form.js.map +7 -0
  47. package/build/ui/form/FormConfig.js +2 -0
  48. package/build/ui/form/FormConfig.js.map +7 -0
  49. package/build/ui/form/FormProps.js +2 -0
  50. package/build/ui/form/FormProps.js.map +7 -0
  51. package/build/ui/form/FormResult.js +2 -0
  52. package/build/ui/form/FormResult.js.map +7 -0
  53. package/build/ui/form/FormRow.js +71 -0
  54. package/build/ui/form/FormRow.js.map +7 -0
  55. package/build/ui/form/FormRowConfig.js +2 -0
  56. package/build/ui/form/FormRowConfig.js.map +7 -0
  57. package/build/ui/form/FormRowsConfig.js +2 -0
  58. package/build/ui/form/FormRowsConfig.js.map +7 -0
  59. package/build/ui/form/FormValue.js +2 -0
  60. package/build/ui/form/FormValue.js.map +7 -0
  61. package/build/ui/form/FormValues.js +2 -0
  62. package/build/ui/form/FormValues.js.map +7 -0
  63. package/{dist → build}/ui/form/SelectInput.d.ts +1 -1
  64. package/build/ui/form/SelectInput.js +86 -0
  65. package/build/ui/form/SelectInput.js.map +7 -0
  66. package/build/ui/form/SelectInputItem.js +2 -0
  67. package/build/ui/form/SelectInputItem.js.map +7 -0
  68. package/build/ui/form/TextInput.js +129 -0
  69. package/build/ui/form/TextInput.js.map +7 -0
  70. package/build/ui/form/createForm.js +73 -0
  71. package/build/ui/form/createForm.js.map +7 -0
  72. package/build/ui/form.js +15 -0
  73. package/build/ui/form.js.map +7 -0
  74. package/build/ui/getErrorDetail.js +65 -0
  75. package/build/ui/getErrorDetail.js.map +7 -0
  76. package/build/ui/icons.js +13 -0
  77. package/build/ui/icons.js.map +7 -0
  78. package/build/ui/internals/Wrapper.js +48 -0
  79. package/build/ui/internals/Wrapper.js.map +7 -0
  80. package/build/ui/internals/programContext.js +4 -0
  81. package/build/ui/internals/programContext.js.map +7 -0
  82. package/build/ui/internals/rotate.js +6 -0
  83. package/build/ui/internals/rotate.js.map +7 -0
  84. package/build/ui/internals.js +5 -0
  85. package/build/ui/internals.js.map +7 -0
  86. package/build/ui/useProgram.js +20 -0
  87. package/build/ui/useProgram.js.map +7 -0
  88. package/build/ui.js +12 -0
  89. package/build/ui.js.map +7 -0
  90. package/package.json +38 -33
  91. package/{src → source}/program/CommandAction.ts +1 -1
  92. package/{src → source}/program/Program.ts +4 -4
  93. package/{src → source}/ui/Failure.tsx +9 -9
  94. package/{src → source}/ui/Header.tsx +8 -4
  95. package/{src → source}/ui/Help.tsx +4 -4
  96. package/{src → source}/ui/Spinner.tsx +1 -1
  97. package/{src → source}/ui/form/FormProps.ts +12 -18
  98. package/{src → source}/ui/form/FormRow.tsx +9 -9
  99. package/{src → source}/ui/form/FormValue.ts +3 -4
  100. package/{src → source}/ui/form/SelectInput.tsx +11 -15
  101. package/{src → source}/ui/form/TextInput.tsx +13 -10
  102. package/{src → source}/ui/getErrorDetail.ts +1 -1
  103. package/{src → source}/ui/internals/Wrapper.tsx +4 -4
  104. package/dist/constants.js +0 -8
  105. package/dist/constants.js.map +0 -1
  106. package/dist/main.js +0 -4
  107. package/dist/main.js.map +0 -1
  108. package/dist/program/Command.js +0 -63
  109. package/dist/program/Command.js.map +0 -1
  110. package/dist/program/CommandAction.js +0 -5
  111. package/dist/program/CommandAction.js.map +0 -1
  112. package/dist/program/CommandArguments.js +0 -5
  113. package/dist/program/CommandArguments.js.map +0 -1
  114. package/dist/program/CommandOptions.js +0 -5
  115. package/dist/program/CommandOptions.js.map +0 -1
  116. package/dist/program/Program.js +0 -168
  117. package/dist/program/Program.js.map +0 -1
  118. package/dist/program/ProgramCreateOptions.js +0 -5
  119. package/dist/program/ProgramCreateOptions.js.map +0 -1
  120. package/dist/program/ProgramDetail.js +0 -5
  121. package/dist/program/ProgramDetail.js.map +0 -1
  122. package/dist/program/ProgramError.js +0 -8
  123. package/dist/program/ProgramError.js.map +0 -1
  124. package/dist/program/ProgramOptions.js +0 -5
  125. package/dist/program/ProgramOptions.js.map +0 -1
  126. package/dist/program/ProgramStreams.js +0 -5
  127. package/dist/program/ProgramStreams.js.map +0 -1
  128. package/dist/program/getProgramDetail.js +0 -27
  129. package/dist/program/getProgramDetail.js.map +0 -1
  130. package/dist/program.js +0 -13
  131. package/dist/program.js.map +0 -1
  132. package/dist/ui/ErrorDetail.js +0 -5
  133. package/dist/ui/ErrorDetail.js.map +0 -1
  134. package/dist/ui/Failure.js +0 -65
  135. package/dist/ui/Failure.js.map +0 -1
  136. package/dist/ui/Header.js +0 -26
  137. package/dist/ui/Header.js.map +0 -1
  138. package/dist/ui/Help.js +0 -64
  139. package/dist/ui/Help.js.map +0 -1
  140. package/dist/ui/Spinner.js +0 -39
  141. package/dist/ui/Spinner.js.map +0 -1
  142. package/dist/ui/colors.js +0 -12
  143. package/dist/ui/colors.js.map +0 -1
  144. package/dist/ui/form/Form.js +0 -5
  145. package/dist/ui/form/Form.js.map +0 -1
  146. package/dist/ui/form/FormConfig.js +0 -5
  147. package/dist/ui/form/FormConfig.js.map +0 -1
  148. package/dist/ui/form/FormProps.js +0 -5
  149. package/dist/ui/form/FormProps.js.map +0 -1
  150. package/dist/ui/form/FormResult.js +0 -5
  151. package/dist/ui/form/FormResult.js.map +0 -1
  152. package/dist/ui/form/FormRow.js +0 -59
  153. package/dist/ui/form/FormRow.js.map +0 -1
  154. package/dist/ui/form/FormRowConfig.js +0 -5
  155. package/dist/ui/form/FormRowConfig.js.map +0 -1
  156. package/dist/ui/form/FormRowsConfig.js +0 -5
  157. package/dist/ui/form/FormRowsConfig.js.map +0 -1
  158. package/dist/ui/form/FormValue.js +0 -5
  159. package/dist/ui/form/FormValue.js.map +0 -1
  160. package/dist/ui/form/FormValues.js +0 -5
  161. package/dist/ui/form/FormValues.js.map +0 -1
  162. package/dist/ui/form/SelectInput.js +0 -113
  163. package/dist/ui/form/SelectInput.js.map +0 -1
  164. package/dist/ui/form/SelectInputItem.js +0 -5
  165. package/dist/ui/form/SelectInputItem.js.map +0 -1
  166. package/dist/ui/form/TextInput.js +0 -152
  167. package/dist/ui/form/TextInput.js.map +0 -1
  168. package/dist/ui/form/createForm.js +0 -72
  169. package/dist/ui/form/createForm.js.map +0 -1
  170. package/dist/ui/form.js +0 -15
  171. package/dist/ui/form.js.map +0 -1
  172. package/dist/ui/getErrorDetail.js +0 -72
  173. package/dist/ui/getErrorDetail.js.map +0 -1
  174. package/dist/ui/icons.js +0 -13
  175. package/dist/ui/icons.js.map +0 -1
  176. package/dist/ui/internals/Wrapper.js +0 -66
  177. package/dist/ui/internals/Wrapper.js.map +0 -1
  178. package/dist/ui/internals/programContext.js +0 -6
  179. package/dist/ui/internals/programContext.js.map +0 -1
  180. package/dist/ui/internals/rotate.js +0 -17
  181. package/dist/ui/internals/rotate.js.map +0 -1
  182. package/dist/ui/internals.js +0 -5
  183. package/dist/ui/internals.js.map +0 -1
  184. package/dist/ui/useProgram.js +0 -25
  185. package/dist/ui/useProgram.js.map +0 -1
  186. package/dist/ui.js +0 -12
  187. package/dist/ui.js.map +0 -1
  188. package/{dist → build}/constants.d.ts +0 -0
  189. package/{dist → build}/main.d.ts +0 -0
  190. package/{dist → build}/program/CommandArguments.d.ts +0 -0
  191. package/{dist → build}/program/CommandOptions.d.ts +0 -0
  192. package/{dist → build}/program/ProgramCreateOptions.d.ts +0 -0
  193. package/{dist → build}/program/ProgramDetail.d.ts +0 -0
  194. package/{dist → build}/program/ProgramOptions.d.ts +0 -0
  195. package/{dist → build}/program/ProgramStreams.d.ts +0 -0
  196. package/{dist → build}/program/getProgramDetail.d.ts +0 -0
  197. package/{dist → build}/program.d.ts +0 -0
  198. package/{dist → build}/ui/ErrorDetail.d.ts +0 -0
  199. package/{dist → build}/ui/Failure.d.ts +0 -0
  200. package/{dist → build}/ui/Header.d.ts +0 -0
  201. package/{dist → build}/ui/Help.d.ts +0 -0
  202. package/{dist → build}/ui/Spinner.d.ts +0 -0
  203. package/{dist → build}/ui/colors.d.ts +0 -0
  204. package/{dist → build}/ui/form/Form.d.ts +0 -0
  205. package/{dist → build}/ui/form/FormConfig.d.ts +0 -0
  206. package/{dist → build}/ui/form/FormProps.d.ts +0 -0
  207. package/{dist → build}/ui/form/FormResult.d.ts +0 -0
  208. package/{dist → build}/ui/form/FormRow.d.ts +0 -0
  209. package/{dist → build}/ui/form/FormRowConfig.d.ts +0 -0
  210. package/{dist → build}/ui/form/FormRowsConfig.d.ts +0 -0
  211. package/{dist → build}/ui/form/FormValue.d.ts +0 -0
  212. package/{dist → build}/ui/form/FormValues.d.ts +0 -0
  213. package/{dist → build}/ui/form/SelectInputItem.d.ts +0 -0
  214. package/{dist → build}/ui/form/TextInput.d.ts +0 -0
  215. package/{dist → build}/ui/form/createForm.d.ts +0 -0
  216. package/{dist → build}/ui/form.d.ts +3 -3
  217. package/{dist → build}/ui/getErrorDetail.d.ts +0 -0
  218. package/{dist → build}/ui/icons.d.ts +0 -0
  219. package/{dist → build}/ui/internals/Wrapper.d.ts +0 -0
  220. package/{dist → build}/ui/internals/programContext.d.ts +0 -0
  221. package/{dist → build}/ui/internals/rotate.d.ts +0 -0
  222. package/{dist → build}/ui/internals.d.ts +0 -0
  223. package/{dist → build}/ui/useProgram.d.ts +0 -0
  224. package/{dist → build}/ui.d.ts +3 -3
  225. package/{src → source}/constants.ts +0 -0
  226. package/{src → source}/main.ts +0 -0
  227. package/{src → source}/program/Command.ts +2 -2
  228. package/{src → source}/program/CommandArguments.ts +0 -0
  229. package/{src → source}/program/CommandOptions.ts +0 -0
  230. package/{src → source}/program/ProgramCreateOptions.ts +0 -0
  231. package/{src → source}/program/ProgramDetail.ts +0 -0
  232. package/{src → source}/program/ProgramError.ts +0 -0
  233. package/{src → source}/program/ProgramOptions.ts +0 -0
  234. package/{src → source}/program/ProgramStreams.ts +0 -0
  235. package/{src → source}/program/getProgramDetail.ts +0 -0
  236. package/{src → source}/program.ts +0 -0
  237. package/{src → source}/ui/ErrorDetail.ts +0 -0
  238. package/{src → source}/ui/colors.ts +0 -0
  239. package/{src → source}/ui/form/Form.ts +0 -0
  240. package/{src → source}/ui/form/FormConfig.ts +0 -0
  241. package/{src → source}/ui/form/FormResult.ts +0 -0
  242. package/{src → source}/ui/form/FormRowConfig.ts +0 -0
  243. package/{src → source}/ui/form/FormRowsConfig.ts +0 -0
  244. package/{src → source}/ui/form/FormValues.ts +0 -0
  245. package/{src → source}/ui/form/SelectInputItem.ts +0 -0
  246. package/{src → source}/ui/form/createForm.tsx +0 -0
  247. package/{src → source}/ui/form.ts +3 -3
  248. package/{src → source}/ui/icons.ts +0 -0
  249. package/{src → source}/ui/internals/programContext.ts +0 -0
  250. package/{src → source}/ui/internals/rotate.ts +0 -0
  251. package/{src → source}/ui/internals.ts +0 -0
  252. package/{src → source}/ui/useProgram.ts +0 -0
  253. package/{src → source}/ui.ts +3 -3
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { Box } from "ink";
4
+ import { useCallback } from "react";
5
+ import { FormRow } from "./FormRow.js";
6
+ export function createForm(formConfig) {
7
+ let Form = ({
8
+ rows,
9
+ values: results,
10
+ onChange,
11
+ onComplete: onFinish,
12
+ ...boxProps
13
+ }) => {
14
+ let handleChange = useCallback(
15
+ (value, rowName) => {
16
+ if (onChange) {
17
+ onChange({
18
+ ...results,
19
+ [rowName]: {
20
+ ...results[rowName],
21
+ value
22
+ }
23
+ });
24
+ }
25
+ },
26
+ [onChange, results]
27
+ );
28
+ let handleFinish = useCallback(
29
+ (value, rowName) => {
30
+ onFinish({
31
+ ...results,
32
+ [rowName]: {
33
+ value,
34
+ isComplete: true
35
+ }
36
+ });
37
+ },
38
+ [onFinish, results]
39
+ );
40
+ let inputElements = [];
41
+ let activeInputName = null;
42
+ for (let [rowName] of Object.entries(formConfig.rows)) {
43
+ if (!results[rowName].isComplete) {
44
+ activeInputName = String(rowName);
45
+ break;
46
+ }
47
+ }
48
+ for (let [rowName, input] of Object.entries(formConfig.rows)) {
49
+ if (results[rowName].isComplete || rowName === activeInputName) {
50
+ inputElements.push(
51
+ /* @__PURE__ */ jsx(
52
+ FormRow,
53
+ {
54
+ marginTop: inputElements.length === 0 ? 0 : 1,
55
+ focus: rowName === activeInputName,
56
+ isComplete: results[rowName].isComplete,
57
+ config: input,
58
+ rows,
59
+ rowName,
60
+ value: results[rowName].value,
61
+ onChange: handleChange,
62
+ onComplete: handleFinish
63
+ },
64
+ rowName
65
+ )
66
+ );
67
+ }
68
+ }
69
+ return /* @__PURE__ */ jsx(Box, { ...boxProps, flexDirection: "column", children: inputElements });
70
+ };
71
+ return Object.assign(Form, { config: formConfig });
72
+ }
73
+ //# sourceMappingURL=createForm.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../source/ui/form/createForm.tsx"],
4
+ "sourcesContent": ["import {Box, type BoxProps} from 'ink';\nimport {useCallback} from 'react';\n\nimport {type Form} from './Form.js';\nimport {type FormConfig} from './FormConfig.js';\nimport {type FormProps} from './FormProps.js';\nimport {FormRow} from './FormRow.js';\n\n/**\n * Creates form component that contains individual rows with inputs based on the provided config.\n *\n * @param formConfig Form configuration.\n * @returns Form component.\n */\nexport function createForm<C extends FormConfig>(formConfig: C): Form<C> {\n let Form = ({\n rows,\n values: results,\n onChange,\n onComplete: onFinish,\n ...boxProps\n }: FormProps<C>) => {\n let handleChange = useCallback(\n (value: unknown, rowName: keyof C['rows']) => {\n if (onChange) {\n onChange({\n ...results,\n [rowName]: {\n ...results[rowName],\n value,\n },\n });\n }\n },\n [onChange, results],\n );\n\n let handleFinish = useCallback(\n (value: unknown, rowName: keyof C['rows']) => {\n onFinish({\n ...results,\n [rowName]: {\n value,\n isComplete: true,\n },\n });\n },\n [onFinish, results],\n );\n\n let inputElements = [];\n let activeInputName: string | null = null;\n\n for (let [rowName] of Object.entries(formConfig.rows)) {\n if (!results[rowName as keyof C['rows']].isComplete) {\n activeInputName = String(rowName);\n\n break;\n }\n }\n\n for (let [rowName, input] of Object.entries(formConfig.rows)) {\n if (results[rowName as keyof C['rows']].isComplete || rowName === activeInputName) {\n inputElements.push(\n <FormRow\n key={rowName}\n marginTop={inputElements.length === 0 ? 0 : 1}\n focus={rowName === activeInputName}\n isComplete={results[rowName as keyof C['rows']].isComplete}\n config={input}\n rows={rows}\n rowName={rowName}\n value={results[rowName as keyof C['rows']].value}\n onChange={handleChange}\n onComplete={handleFinish}\n />,\n );\n }\n }\n\n return (\n <Box {...(boxProps as BoxProps)} flexDirection=\"column\">\n {inputElements}\n </Box>\n );\n };\n\n return Object.assign(Form, {config: formConfig});\n}\n"],
5
+ "mappings": ";AAgEU;AAhEV,SAAQ,WAAyB;AACjC,SAAQ,mBAAkB;AAK1B,SAAQ,eAAc;AAQf,gBAAS,WAAiC,YAAwB;AACvE,MAAI,OAAO,CAAC;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,YAAY;AAAA,IACZ,GAAG;AAAA,EACL,MAAoB;AAClB,QAAI,eAAe;AAAA,MACjB,CAAC,OAAgB,YAA6B;AAC5C,YAAI,UAAU;AACZ,mBAAS;AAAA,YACP,GAAG;AAAA,YACH,CAAC,OAAO,GAAG;AAAA,cACT,GAAG,QAAQ,OAAO;AAAA,cAClB;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,CAAC,UAAU,OAAO;AAAA,IACpB;AAEA,QAAI,eAAe;AAAA,MACjB,CAAC,OAAgB,YAA6B;AAC5C,iBAAS;AAAA,UACP,GAAG;AAAA,UACH,CAAC,OAAO,GAAG;AAAA,YACT;AAAA,YACA,YAAY;AAAA,UACd;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,CAAC,UAAU,OAAO;AAAA,IACpB;AAEA,QAAI,gBAAgB,CAAC;AACrB,QAAI,kBAAiC;AAErC,aAAS,CAAC,OAAO,KAAK,OAAO,QAAQ,WAAW,IAAI,GAAG;AACrD,UAAI,CAAC,QAAQ,OAA0B,EAAE,YAAY;AACnD,0BAAkB,OAAO,OAAO;AAEhC;AAAA,MACF;AAAA,IACF;AAEA,aAAS,CAAC,SAAS,KAAK,KAAK,OAAO,QAAQ,WAAW,IAAI,GAAG;AAC5D,UAAI,QAAQ,OAA0B,EAAE,cAAc,YAAY,iBAAiB;AACjF,sBAAc;AAAA,UACZ;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,cAAc,WAAW,IAAI,IAAI;AAAA,cAC5C,OAAO,YAAY;AAAA,cACnB,YAAY,QAAQ,OAA0B,EAAE;AAAA,cAChD,QAAQ;AAAA,cACR;AAAA,cACA;AAAA,cACA,OAAO,QAAQ,OAA0B,EAAE;AAAA,cAC3C,UAAU;AAAA,cACV,YAAY;AAAA;AAAA,YATP;AAAA,UAUP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WACE,oBAAC,OAAK,GAAI,UAAuB,eAAc,UAC5C,yBACH;AAAA,EAEJ;AAEA,SAAO,OAAO,OAAO,MAAM,EAAC,QAAQ,WAAU,CAAC;AACjD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ export * from "./form/createForm.js";
3
+ export * from "./form/Form.js";
4
+ export * from "./form/FormConfig.js";
5
+ export * from "./form/FormProps.js";
6
+ export * from "./form/FormResult.js";
7
+ export * from "./form/FormRow.js";
8
+ export * from "./form/FormRowConfig.js";
9
+ export * from "./form/FormRowsConfig.js";
10
+ export * from "./form/FormValue.js";
11
+ export * from "./form/FormValues.js";
12
+ export * from "./form/SelectInput.js";
13
+ export * from "./form/SelectInputItem.js";
14
+ export * from "./form/TextInput.js";
15
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../source/ui/form.ts"],
4
+ "sourcesContent": ["export * from './form/createForm.js';\nexport * from './form/Form.js';\nexport * from './form/FormConfig.js';\nexport * from './form/FormProps.js';\nexport * from './form/FormResult.js';\nexport * from './form/FormRow.js';\nexport * from './form/FormRowConfig.js';\nexport * from './form/FormRowsConfig.js';\nexport * from './form/FormValue.js';\nexport * from './form/FormValues.js';\nexport * from './form/SelectInput.js';\nexport * from './form/SelectInputItem.js';\nexport * from './form/TextInput.js';\n"],
5
+ "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ import { ParsingError, ValidationError } from "@jakubmazanec/args";
3
+ import { zodIssuesToStrings } from "@jakubmazanec/zod-utils";
4
+ import { ZodError } from "zod";
5
+ export function getErrorDetail(error) {
6
+ if (error instanceof ParsingError) {
7
+ switch (error.code) {
8
+ default: {
9
+ return {
10
+ label: "Parsing error",
11
+ description: error.message
12
+ };
13
+ }
14
+ }
15
+ }
16
+ if (error instanceof ValidationError) {
17
+ switch (error.code) {
18
+ default: {
19
+ return {
20
+ label: "Validation error",
21
+ description: error.message
22
+ };
23
+ }
24
+ }
25
+ }
26
+ if (error instanceof ReferenceError) {
27
+ let errorDetail = {
28
+ label: "Error",
29
+ description: error.message
30
+ };
31
+ if (error.stack) {
32
+ errorDetail.stack = error.stack;
33
+ }
34
+ return errorDetail;
35
+ }
36
+ if (error instanceof ZodError) {
37
+ let errorDetail = {
38
+ label: "Error",
39
+ description: zodIssuesToStrings(error.issues).join("\n")
40
+ };
41
+ return errorDetail;
42
+ }
43
+ if (error instanceof Error) {
44
+ let errorDetail = {
45
+ label: "Error",
46
+ description: error.message
47
+ };
48
+ if (error.stack) {
49
+ errorDetail.stack = error.stack;
50
+ }
51
+ if (error.cause instanceof Error) {
52
+ errorDetail.cause = {
53
+ description: error.cause.message
54
+ };
55
+ if (error.cause.stack) {
56
+ errorDetail.cause.stack = error.cause.stack;
57
+ }
58
+ }
59
+ return errorDetail;
60
+ }
61
+ return {
62
+ label: "Error"
63
+ };
64
+ }
65
+ //# sourceMappingURL=getErrorDetail.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../source/ui/getErrorDetail.ts"],
4
+ "sourcesContent": ["import {ParsingError, ValidationError} from '@jakubmazanec/args';\nimport {zodIssuesToStrings} from '@jakubmazanec/zod-utils';\nimport {ZodError} from 'zod';\n\nimport {type ErrorDetail} from './ErrorDetail.js';\n\n/**\n * Creates detailed information about an error.\n */\nexport function getErrorDetail(error: unknown): ErrorDetail {\n // TODO: add all codes\n if (error instanceof ParsingError) {\n switch (error.code) {\n default: {\n return {\n label: 'Parsing error',\n description: error.message,\n };\n }\n }\n }\n\n // TODO: add all codes\n if (error instanceof ValidationError) {\n switch (error.code) {\n default: {\n return {\n label: 'Validation error',\n description: error.message,\n };\n }\n }\n }\n\n // TODO: add all built-in errors\n if (error instanceof ReferenceError) {\n let errorDetail: ErrorDetail = {\n label: 'Error',\n description: error.message,\n };\n\n if (error.stack) {\n errorDetail.stack = error.stack;\n }\n\n return errorDetail;\n }\n\n if (error instanceof ZodError) {\n let errorDetail: ErrorDetail = {\n label: 'Error',\n description: zodIssuesToStrings(error.issues).join('\\n'),\n };\n\n return errorDetail;\n }\n\n if (error instanceof Error) {\n let errorDetail: ErrorDetail = {\n label: 'Error',\n description: error.message,\n };\n\n if (error.stack) {\n errorDetail.stack = error.stack;\n }\n\n if (error.cause instanceof Error) {\n errorDetail.cause = {\n description: error.cause.message,\n };\n\n if (error.cause.stack) {\n errorDetail.cause.stack = error.cause.stack;\n }\n }\n\n return errorDetail;\n }\n\n return {\n label: 'Error',\n };\n}\n"],
5
+ "mappings": ";AAAA,SAAQ,cAAc,uBAAsB;AAC5C,SAAQ,0BAAyB;AACjC,SAAQ,gBAAe;AAOhB,gBAAS,eAAe,OAA6B;AAE1D,MAAI,iBAAiB,cAAc;AACjC,YAAQ,MAAM,MAAM;AAAA,MAClB,SAAS;AACP,eAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,iBAAiB,iBAAiB;AACpC,YAAQ,MAAM,MAAM;AAAA,MAClB,SAAS;AACP,eAAO;AAAA,UACL,OAAO;AAAA,UACP,aAAa,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,iBAAiB,gBAAgB;AACnC,QAAI,cAA2B;AAAA,MAC7B,OAAO;AAAA,MACP,aAAa,MAAM;AAAA,IACrB;AAEA,QAAI,MAAM,OAAO;AACf,kBAAY,QAAQ,MAAM;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,UAAU;AAC7B,QAAI,cAA2B;AAAA,MAC7B,OAAO;AAAA,MACP,aAAa,mBAAmB,MAAM,MAAM,EAAE,KAAK,IAAI;AAAA,IACzD;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,OAAO;AAC1B,QAAI,cAA2B;AAAA,MAC7B,OAAO;AAAA,MACP,aAAa,MAAM;AAAA,IACrB;AAEA,QAAI,MAAM,OAAO;AACf,kBAAY,QAAQ,MAAM;AAAA,IAC5B;AAEA,QAAI,MAAM,iBAAiB,OAAO;AAChC,kBAAY,QAAQ;AAAA,QAClB,aAAa,MAAM,MAAM;AAAA,MAC3B;AAEA,UAAI,MAAM,MAAM,OAAO;AACrB,oBAAY,MAAM,QAAQ,MAAM,MAAM;AAAA,MACxC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ import chalk from "chalk";
3
+ import * as colors from "./colors.js";
4
+ export const question = chalk[colors.notice]("?");
5
+ export const info = chalk[colors.info]("i");
6
+ export const success = chalk[colors.success]("\u2713");
7
+ export const warning = chalk[colors.warning]("\u25B2");
8
+ export const error = chalk[colors.failure]("\xD7");
9
+ export const unselectedSquare = chalk[colors.unselected]("\u25FB");
10
+ export const selectedSquare = chalk[colors.selected]("\u25FC");
11
+ export const unselectedCircle = chalk[colors.unselected]("\u25CB");
12
+ export const selectedCircle = chalk[colors.selected]("\u25CF");
13
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../source/ui/icons.ts"],
4
+ "sourcesContent": ["import chalk from 'chalk';\n\nimport * as colors from './colors.js';\n\nexport const question = chalk[colors.notice]('?');\nexport const info = chalk[colors.info]('i');\nexport const success = chalk[colors.success]('\u2713');\nexport const warning = chalk[colors.warning]('\u25B2');\nexport const error = chalk[colors.failure]('\u00D7');\nexport const unselectedSquare = chalk[colors.unselected]('\u25FB');\nexport const selectedSquare = chalk[colors.selected]('\u25FC');\nexport const unselectedCircle = chalk[colors.unselected]('\u25CB');\nexport const selectedCircle = chalk[colors.selected]('\u25CF');\n"],
5
+ "mappings": ";AAAA,OAAO,WAAW;AAElB,YAAY,YAAY;AAEjB,aAAM,WAAW,MAAM,OAAO,MAAM,EAAE,GAAG;AACzC,aAAM,OAAO,MAAM,OAAO,IAAI,EAAE,GAAG;AACnC,aAAM,UAAU,MAAM,OAAO,OAAO,EAAE,QAAG;AACzC,aAAM,UAAU,MAAM,OAAO,OAAO,EAAE,QAAG;AACzC,aAAM,QAAQ,MAAM,OAAO,OAAO,EAAE,MAAG;AACvC,aAAM,mBAAmB,MAAM,OAAO,UAAU,EAAE,QAAG;AACrD,aAAM,iBAAiB,MAAM,OAAO,QAAQ,EAAE,QAAG;AACjD,aAAM,mBAAmB,MAAM,OAAO,UAAU,EAAE,QAAG;AACrD,aAAM,iBAAiB,MAAM,OAAO,QAAQ,EAAE,QAAG;",
6
+ "names": []
7
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Box, Spacer, Text } from "ink";
4
+ import { useMemo } from "react";
5
+ import { ErrorBoundary } from "react-error-boundary";
6
+ import { highlighted, notice } from "../colors.js";
7
+ import { Failure } from "../Failure.js";
8
+ import { programContext } from "./programContext.js";
9
+ export const Wrapper = ({ program, children }) => {
10
+ let programContextValue = useMemo(
11
+ () => ({
12
+ program
13
+ }),
14
+ [program]
15
+ );
16
+ return /* @__PURE__ */ jsx(ErrorBoundary, { FallbackComponent: Failure, children: /* @__PURE__ */ jsxs(programContext.Provider, { value: programContextValue, children: [
17
+ program.latestVersion && program.latestVersion !== program.version ? /* @__PURE__ */ jsxs(Box, { children: [
18
+ /* @__PURE__ */ jsxs(
19
+ Box,
20
+ {
21
+ flexDirection: "column",
22
+ borderColor: notice,
23
+ borderStyle: "round",
24
+ margin: 1,
25
+ paddingTop: 1,
26
+ paddingRight: 4,
27
+ paddingBottom: 1,
28
+ paddingLeft: 4,
29
+ children: [
30
+ /* @__PURE__ */ jsxs(Text, { children: [
31
+ "New version ",
32
+ /* @__PURE__ */ jsx(Text, { color: highlighted, children: program.latestVersion }),
33
+ " is available!"
34
+ ] }),
35
+ /* @__PURE__ */ jsxs(Text, { children: [
36
+ "Run ",
37
+ /* @__PURE__ */ jsx(Text, { color: highlighted, children: `npm install ${program.name} -D` }),
38
+ " to update."
39
+ ] })
40
+ ]
41
+ }
42
+ ),
43
+ /* @__PURE__ */ jsx(Spacer, {})
44
+ ] }) : null,
45
+ /* @__PURE__ */ jsx(Box, { children })
46
+ ] }) });
47
+ };
48
+ //# sourceMappingURL=Wrapper.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../source/ui/internals/Wrapper.tsx"],
4
+ "sourcesContent": ["import {Box, Spacer, Text} from 'ink';\nimport {type FC, type PropsWithChildren, useMemo} from 'react';\nimport {ErrorBoundary} from 'react-error-boundary';\n\nimport {type Program} from '../../program.js';\nimport {highlighted, notice} from '../colors.js';\nimport {Failure} from '../Failure.js';\nimport {programContext} from './programContext.js';\n\n/**\n * {@link Wrapper} component props.\n */\nexport type WrapperProps = {\n program: Program;\n};\n\n/**\n * A component that wraps anything {@link Program} tries to render with an error boundary and all neccessary providers.\n */\nexport const Wrapper: FC<PropsWithChildren<WrapperProps>> = ({program, children}) => {\n let programContextValue = useMemo(\n () => ({\n program,\n }),\n [program],\n );\n\n return (\n <ErrorBoundary FallbackComponent={Failure}>\n <programContext.Provider value={programContextValue}>\n {program.latestVersion && program.latestVersion !== program.version ?\n <Box>\n <Box\n flexDirection=\"column\"\n borderColor={notice}\n borderStyle=\"round\"\n margin={1}\n paddingTop={1}\n paddingRight={4}\n paddingBottom={1}\n paddingLeft={4}\n >\n <Text>\n New version <Text color={highlighted}>{program.latestVersion}</Text> is available!\n </Text>\n <Text>\n Run <Text color={highlighted}>{`npm install ${program.name} -D`}</Text> to update.\n </Text>\n </Box>\n <Spacer />\n </Box>\n : null}\n <Box>{children}</Box>\n </programContext.Provider>\n </ErrorBoundary>\n );\n};\n"],
5
+ "mappings": ";AA0Cc,SACc,KADd;AA1Cd,SAAQ,KAAK,QAAQ,YAAW;AAChC,SAAyC,eAAc;AACvD,SAAQ,qBAAoB;AAG5B,SAAQ,aAAa,cAAa;AAClC,SAAQ,eAAc;AACtB,SAAQ,sBAAqB;AAYtB,aAAM,UAA+C,CAAC,EAAC,SAAS,SAAQ,MAAM;AACnF,MAAI,sBAAsB;AAAA,IACxB,OAAO;AAAA,MACL;AAAA,IACF;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,SACE,oBAAC,iBAAc,mBAAmB,SAChC,+BAAC,eAAe,UAAf,EAAwB,OAAO,qBAC7B;AAAA,YAAQ,iBAAiB,QAAQ,kBAAkB,QAAQ,UAC1D,qBAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAc;AAAA,UACd,aAAa;AAAA,UACb,aAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,eAAe;AAAA,UACf,aAAa;AAAA,UAEb;AAAA,iCAAC,QAAK;AAAA;AAAA,cACQ,oBAAC,QAAK,OAAO,aAAc,kBAAQ,eAAc;AAAA,cAAO;AAAA,eACtE;AAAA,YACA,qBAAC,QAAK;AAAA;AAAA,cACA,oBAAC,QAAK,OAAO,aAAc,yBAAe,QAAQ,IAAI,OAAM;AAAA,cAAO;AAAA,eACzE;AAAA;AAAA;AAAA,MACF;AAAA,MACA,oBAAC,UAAO;AAAA,OACV,IACA;AAAA,IACF,oBAAC,OAAK,UAAS;AAAA,KACjB,GACF;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ import React from "react";
3
+ export const programContext = React.createContext({});
4
+ //# sourceMappingURL=programContext.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../source/ui/internals/programContext.ts"],
4
+ "sourcesContent": ["import React from 'react';\n\nimport {type Program} from '../../program/Program.js';\n\nexport type ProgramContext = {\n program: Program;\n};\n\n/**\n * A React context that stores {@link Program} instance.\n */\nexport const programContext = React.createContext<ProgramContext>({} as ProgramContext);\n"],
5
+ "mappings": ";AAAA,OAAO,WAAW;AAWX,aAAM,iBAAiB,MAAM,cAA8B,CAAC,CAAmB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ export function rotate(value, n) {
3
+ let x = [...value];
4
+ return [...x.splice(-n % x.length), ...x];
5
+ }
6
+ //# sourceMappingURL=rotate.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../source/ui/internals/rotate.ts"],
4
+ "sourcesContent": ["/**\n * Rotate an array by `n` places.\n *\n * @param value An array to rotate.\n * @param n By how many places the items should move.\n * @returns The new item with items rotated.\n */\nexport function rotate<T>(value: T[], n: number) {\n let x = [...value];\n\n return [...x.splice(-n % x.length), ...x];\n}\n"],
5
+ "mappings": ";AAOO,gBAAS,OAAU,OAAY,GAAW;AAC/C,MAAI,IAAI,CAAC,GAAG,KAAK;AAEjB,SAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;AAC1C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ export * from "./internals/programContext.js";
3
+ export * from "./internals/rotate.js";
4
+ export * from "./internals/Wrapper.js";
5
+ //# sourceMappingURL=internals.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../source/ui/internals.ts"],
4
+ "sourcesContent": ["export * from './internals/programContext.js';\nexport * from './internals/rotate.js';\nexport * from './internals/Wrapper.js';\n"],
5
+ "mappings": ";AAAA,cAAc;AACd,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ import { useApp } from "ink";
3
+ import { useCallback, useContext } from "react";
4
+ import { useErrorBoundary } from "react-error-boundary";
5
+ import { programContext } from "./internals.js";
6
+ export function useProgram() {
7
+ let { showBoundary } = useErrorBoundary();
8
+ let { exit: appExit } = useApp();
9
+ let { program } = useContext(programContext);
10
+ let exit = useCallback(
11
+ (error) => {
12
+ process.exitCode = 1;
13
+ showBoundary(error);
14
+ appExit(error);
15
+ },
16
+ [appExit, showBoundary]
17
+ );
18
+ return { program, exit };
19
+ }
20
+ //# sourceMappingURL=useProgram.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../source/ui/useProgram.ts"],
4
+ "sourcesContent": ["import {useApp} from 'ink';\nimport {useCallback, useContext} from 'react';\nimport {useErrorBoundary} from 'react-error-boundary';\n\nimport {programContext} from './internals.js';\n\n/**\n * A React hook for accessing {@link Program} instance and `exit` function that is used for showing an error (via an error boundary) and exiting.\n */\nexport function useProgram() {\n let {showBoundary} = useErrorBoundary();\n let {exit: appExit} = useApp();\n let {program} = useContext(programContext);\n\n let exit = useCallback(\n (error: unknown) => {\n process.exitCode = 1;\n\n showBoundary(error);\n appExit(error as Error);\n },\n [appExit, showBoundary],\n );\n\n return {program, exit};\n}\n"],
5
+ "mappings": ";AAAA,SAAQ,cAAa;AACrB,SAAQ,aAAa,kBAAiB;AACtC,SAAQ,wBAAuB;AAE/B,SAAQ,sBAAqB;AAKtB,gBAAS,aAAa;AAC3B,MAAI,EAAC,aAAY,IAAI,iBAAiB;AACtC,MAAI,EAAC,MAAM,QAAO,IAAI,OAAO;AAC7B,MAAI,EAAC,QAAO,IAAI,WAAW,cAAc;AAEzC,MAAI,OAAO;AAAA,IACT,CAAC,UAAmB;AAClB,cAAQ,WAAW;AAEnB,mBAAa,KAAK;AAClB,cAAQ,KAAc;AAAA,IACxB;AAAA,IACA,CAAC,SAAS,YAAY;AAAA,EACxB;AAEA,SAAO,EAAC,SAAS,KAAI;AACvB;",
6
+ "names": []
7
+ }
package/build/ui.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ export * as colors from "./ui/colors.js";
3
+ export * from "./ui/ErrorDetail.js";
4
+ export * from "./ui/Failure.js";
5
+ export * from "./ui/form.js";
6
+ export * from "./ui/getErrorDetail.js";
7
+ export * from "./ui/Header.js";
8
+ export * from "./ui/Help.js";
9
+ export * as icons from "./ui/icons.js";
10
+ export * from "./ui/Spinner.js";
11
+ export * from "./ui/useProgram.js";
12
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../source/ui.ts"],
4
+ "sourcesContent": ["export * as colors from './ui/colors.js';\nexport * from './ui/ErrorDetail.js';\nexport * from './ui/Failure.js';\nexport * from './ui/form.js';\nexport * from './ui/getErrorDetail.js';\nexport * from './ui/Header.js';\nexport * from './ui/Help.js';\nexport * as icons from './ui/icons.js';\nexport * from './ui/Spinner.js';\nexport * from './ui/useProgram.js';\n"],
5
+ "mappings": ";AAAA,YAAY,YAAY;AACxB,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,YAAY,WAAW;AACvB,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jakubmazanec/cli",
3
- "version": "0.3.0-unstable.e1ae458",
3
+ "version": "0.3.0",
4
4
  "description": "TypeScript-first library for building CLIs.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,52 +11,57 @@
11
11
  "author": "Jakub Mazanec <jakub@mazanec.dev>",
12
12
  "sideEffects": false,
13
13
  "type": "module",
14
- "exports": "./dist/main.js",
14
+ "exports": "./build/main.js",
15
15
  "files": [
16
- "dist",
17
- "src"
16
+ "build",
17
+ "source"
18
18
  ],
19
19
  "scripts": {
20
- "build": "swc src -d dist && tsc",
21
- "clean": "del-cli coverage dist *.tsbuildinfo",
22
- "develop": "concurrently \"swc src -d dist --watch\" \"tsc --watch\"",
23
- "document": "typedoc --options typedoc.config.cjs",
24
- "format": "prettier . --write --ignore-unknown --ignore-path ../../.prettierignore",
20
+ "build": "del-cli build tsconfig.tsbuildinfo && esbuild \"source/**/*\" --platform=node --target=node20.8 --outdir=build --sourcemap && tsc",
21
+ "clean": "del-cli coverage build *.tsbuildinfo",
22
+ "develop": "concurrently \"esbuild \"source/**/*\" --platform=node --target=node20.8 --outdir=build --sourcemap --watch\" \"tsc --watch\"",
23
+ "document": "del-cli docs && typedoc --options typedoc.config.cjs",
24
+ "format": "prettier . --write --ignore-unknown",
25
25
  "lint": "eslint .",
26
- "test": "cross-env FORCE_COLOR=1 NODE_OPTIONS=--experimental-vm-modules jest --passWithNoTests",
26
+ "test": "del-cli coverage && cross-env FORCE_COLOR=1 vitest run --coverage",
27
27
  "typecheck": "tsc --project tsconfig.typecheck.json"
28
28
  },
29
29
  "dependencies": {
30
- "@jakubmazanec/args": "2.0.0-unstable.e1ae458",
31
- "@jakubmazanec/error": "3.0.0-unstable.e1ae458",
32
- "@jakubmazanec/ts-utils": "3.0.0-unstable.e1ae458",
33
- "@jakubmazanec/zod-utils": "2.0.0-unstable.e1ae458",
34
- "chalk": "^5.2.0",
35
- "fs-extra": "^10.0.1",
36
- "latest-version": "^7.0.0",
30
+ "@jakubmazanec/args": "^2.0.0",
31
+ "@jakubmazanec/error": "^3.0.0",
32
+ "@jakubmazanec/ts-utils": "^3.0.0",
33
+ "@jakubmazanec/zod-utils": "^2.0.0",
34
+ "chalk": "^5.3.0",
35
+ "fs-extra": "^11.2.0",
36
+ "latest-version": "^8.0.0",
37
37
  "lodash": "^4.17.21",
38
- "react-error-boundary": "^4.0.7",
39
- "zod": "^3.14.4"
38
+ "react-error-boundary": "^4.0.12",
39
+ "zod": "^3.22.4"
40
40
  },
41
41
  "devDependencies": {
42
- "@jest/globals": "^29.5.0",
43
- "@types/fs-extra": "^9.0.13",
44
- "@types/lodash": "^4.14.195",
42
+ "@types/fs-extra": "^11.0.4",
43
+ "@types/lodash": "^4.14.202",
45
44
  "@types/node": "^20.8.5",
46
- "@types/react": "^18.0.26",
47
- "ink": "^3.2.0",
45
+ "@types/react": "^18.2.53",
46
+ "@vitest/coverage-v8": "^1.2.2",
47
+ "concurrently": "^8.2.2",
48
+ "cross-env": "^7.0.3",
49
+ "del-cli": "^5.1.0",
50
+ "esbuild": "^0.20.0",
51
+ "eslint": "^8.56.0",
52
+ "ink": "^4.4.1",
48
53
  "ink-testing-library": "^3.0.0",
49
- "react": "^18.2.0"
54
+ "prettier": "^3.2.5",
55
+ "prettier-plugin-packagejson": "^2.4.10",
56
+ "react": "^18.2.0",
57
+ "typedoc": "^0.25.7",
58
+ "typedoc-plugin-markdown": "^3.17.1",
59
+ "typescript": "^5.3.3",
60
+ "vitest": "^1.2.2"
50
61
  },
51
62
  "peerDependencies": {
52
- "@types/react": "17.x || 18.x",
53
- "ink": "^3.0.0",
54
- "react": "17.x || 18.x"
55
- },
56
- "peerDependenciesMeta": {
57
- "@types/react": {
58
- "optional": true
59
- }
63
+ "ink": "4.x",
64
+ "react": "18.x"
60
65
  },
61
66
  "packageManager": "npm@10.1.0",
62
67
  "engines": {
@@ -1,4 +1,4 @@
1
- import {type OptionsConfig, type ParametersConfig, type Arguments} from '@jakubmazanec/args';
1
+ import {type Arguments, type OptionsConfig, type ParametersConfig} from '@jakubmazanec/args';
2
2
 
3
3
  import {type Program} from './Program.js';
4
4
 
@@ -1,19 +1,19 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any -- needed */
2
- import {type ParametersConfig, type Argv, type OptionsConfig} from '@jakubmazanec/args';
2
+ import {type Argv, type OptionsConfig, type ParametersConfig} from '@jakubmazanec/args';
3
3
  import fs from 'fs-extra';
4
4
  import fetchLatestVersion from 'latest-version';
5
5
  import path from 'path';
6
6
  import {type ComponentType} from 'react';
7
7
  import {type FallbackProps} from 'react-error-boundary';
8
8
 
9
+ import {CACHE_PATH} from '../constants.js';
10
+ import {Failure, Help} from '../ui.js';
11
+ import {Wrapper} from '../ui/internals.js';
9
12
  import {type Command} from './Command.js';
10
13
  import {type ProgramCreateOptions} from './ProgramCreateOptions.js';
11
14
  import {ProgramError} from './ProgramError.js';
12
15
  import {type ProgramOptions} from './ProgramOptions.js';
13
16
  import {type ProgramStreams} from './ProgramStreams.js';
14
- import {CACHE_PATH} from '../constants.js';
15
- import {Wrapper} from '../ui/internals.js';
16
- import {Failure, Help} from '../ui.js';
17
17
 
18
18
  /**
19
19
  * Program manages and executes {@link Command} instances attached to it based on parsing command line arguments.
@@ -1,4 +1,4 @@
1
- import {Box, Text, type BoxProps} from 'ink';
1
+ import {Box, type BoxProps, Text} from 'ink';
2
2
 
3
3
  import * as colors from './colors.js';
4
4
  import {type ErrorDetail} from './ErrorDetail.js';
@@ -29,31 +29,31 @@ export function Failure({error, errorDetail, ...boxProps}: FailureProps) {
29
29
  <Text color={colors.highlighted}>{label}</Text>
30
30
  </Header>
31
31
 
32
- {description ? (
32
+ {description ?
33
33
  <Box flexDirection="column" marginLeft={2}>
34
34
  <Text color={colors.failure}>{description}</Text>
35
35
  </Box>
36
- ) : null}
36
+ : null}
37
37
 
38
- {stack ? (
38
+ {stack ?
39
39
  <Box flexDirection="column" marginTop={1} marginLeft={2}>
40
40
  <Text color={colors.muted}>{stack}</Text>
41
41
  </Box>
42
- ) : null}
42
+ : null}
43
43
 
44
- {cause ? (
44
+ {cause ?
45
45
  <>
46
46
  <Box flexDirection="column" marginTop={1} marginLeft={2}>
47
47
  <Text color={colors.muted}>{cause.description}</Text>
48
48
  </Box>
49
49
 
50
- {cause.stack ? (
50
+ {cause.stack ?
51
51
  <Box flexDirection="column" marginTop={1} marginLeft={2}>
52
52
  <Text color={colors.muted}>{cause.stack}</Text>
53
53
  </Box>
54
- ) : null}
54
+ : null}
55
55
  </>
56
- ) : null}
56
+ : null}
57
57
  </Box>
58
58
  );
59
59
  }
@@ -25,12 +25,16 @@ export function Header({
25
25
  }: PropsWithChildren<HeaderProps>) {
26
26
  return (
27
27
  <Box {...boxProps}>
28
- {icon || showSpinner ? (
28
+ {icon || showSpinner ?
29
29
  <Box marginRight={1}>
30
- {showSpinner ? <Spinner /> : null}
31
- {!showSpinner && icon ? <Text>{icon}</Text> : null}
30
+ {showSpinner ?
31
+ <Spinner />
32
+ : null}
33
+ {!showSpinner && icon ?
34
+ <Text>{icon}</Text>
35
+ : null}
32
36
  </Box>
33
- ) : null}
37
+ : null}
34
38
  <Box>{children}</Box>
35
39
  </Box>
36
40
  );
@@ -1,10 +1,10 @@
1
1
  import chalk from 'chalk';
2
- import {Box, Text, type BoxProps} from 'ink';
2
+ import {Box, type BoxProps, Text} from 'ink';
3
3
 
4
+ import {type Program} from '../program.js';
4
5
  import * as colors from './colors.js';
5
6
  import {Header} from './Header.js';
6
7
  import * as icons from './icons.js';
7
- import {type Program} from '../program.js';
8
8
 
9
9
  /**
10
10
  * {@link Help} component props.
@@ -25,7 +25,7 @@ export function Help({program, ...boxProps}: HelpProps) {
25
25
  ](program.version ?? '?')}`}</Text>
26
26
  <Text color={colors.body}>{program.description}</Text>
27
27
 
28
- {program.commands.length ? (
28
+ {program.commands.length ?
29
29
  <>
30
30
  <Header icon={icons.info} marginTop={1}>
31
31
  <Text color={colors.highlighted}>Usage</Text>
@@ -62,7 +62,7 @@ export function Help({program, ...boxProps}: HelpProps) {
62
62
  );
63
63
  })}
64
64
  </>
65
- ) : null}
65
+ : null}
66
66
  </Box>
67
67
  );
68
68
  }
@@ -1,5 +1,5 @@
1
1
  import {Text} from 'ink';
2
- import {useState, useEffect} from 'react';
2
+ import {useEffect, useState} from 'react';
3
3
 
4
4
  const SPINNER = {
5
5
  interval: 80,