@neurodevs/node-tdd 0.2.5 → 1.0.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 (326) hide show
  1. package/.vscode/launch.json +52 -57
  2. package/.vscode/settings.json +61 -66
  3. package/.vscode/tasks.json +98 -129
  4. package/README.md +1 -0
  5. package/build/.spruce/settings.json +3 -10
  6. package/build/__tests__/MockFetch.d.ts +18 -0
  7. package/build/__tests__/MockFetch.js +55 -0
  8. package/build/__tests__/MockFetch.js.map +1 -0
  9. package/build/__tests__/{impl → behavioral}/AbstractModuleTest.test.d.ts +2 -3
  10. package/build/__tests__/{impl → behavioral}/AbstractModuleTest.test.js +3 -12
  11. package/build/__tests__/behavioral/AbstractModuleTest.test.js.map +1 -0
  12. package/build/__tests__/behavioral/utilities/AllHooksCalledEvenIfNotDefined.test.d.ts +5 -0
  13. package/build/__tests__/behavioral/utilities/AllHooksCalledEvenIfNotDefined.test.js +34 -0
  14. package/build/__tests__/behavioral/utilities/AllHooksCalledEvenIfNotDefined.test.js.map +1 -0
  15. package/build/__tests__/behavioral/utilities/Assert.test.d.ts +45 -0
  16. package/build/__tests__/behavioral/utilities/Assert.test.js +645 -0
  17. package/build/__tests__/behavioral/utilities/Assert.test.js.map +1 -0
  18. package/build/__tests__/behavioral/utilities/InstanceParentTestCanAccessParentMethods.test.d.ts +4 -0
  19. package/build/__tests__/behavioral/utilities/InstanceParentTestCanAccessParentMethods.test.js +23 -0
  20. package/build/__tests__/behavioral/utilities/InstanceParentTestCanAccessParentMethods.test.js.map +1 -0
  21. package/build/__tests__/behavioral/utilities/MockFetch.test.d.ts +28 -0
  22. package/build/__tests__/behavioral/utilities/MockFetch.test.js +211 -0
  23. package/build/__tests__/behavioral/utilities/MockFetch.test.js.map +1 -0
  24. package/build/__tests__/behavioral/utilities/StackCleaner.test.d.ts +4 -0
  25. package/build/__tests__/behavioral/utilities/StackCleaner.test.js +46 -0
  26. package/build/__tests__/behavioral/utilities/StackCleaner.test.js.map +1 -0
  27. package/build/__tests__/behavioral/utilities/StaticParentTestCanAccessParentMethods.test.d.ts +7 -0
  28. package/build/__tests__/behavioral/utilities/StaticParentTestCanAccessParentMethods.test.js +32 -0
  29. package/build/__tests__/behavioral/utilities/StaticParentTestCanAccessParentMethods.test.js.map +1 -0
  30. package/build/__tests__/behavioral/utilities/StaticTestInheritsAbstractSpruceTestProperly.test.d.ts +4 -0
  31. package/build/__tests__/behavioral/utilities/StaticTestInheritsAbstractSpruceTestProperly.test.js +19 -0
  32. package/build/__tests__/behavioral/utilities/StaticTestInheritsAbstractSpruceTestProperly.test.js.map +1 -0
  33. package/build/__tests__/behavioral/utilities/Stringify.test.d.ts +5 -0
  34. package/build/__tests__/behavioral/utilities/Stringify.test.js +127 -0
  35. package/build/__tests__/behavioral/utilities/Stringify.test.js.map +1 -0
  36. package/build/__tests__/behavioral/utilities/TestDecoratorResolver.test.d.ts +7 -0
  37. package/build/__tests__/behavioral/utilities/TestDecoratorResolver.test.js +38 -0
  38. package/build/__tests__/behavioral/utilities/TestDecoratorResolver.test.js.map +1 -0
  39. package/build/__tests__/behavioral/utilities/TestOnBasic.test.d.ts +12 -0
  40. package/build/__tests__/behavioral/utilities/TestOnBasic.test.js +68 -0
  41. package/build/__tests__/behavioral/utilities/TestOnBasic.test.js.map +1 -0
  42. package/build/__tests__/behavioral/utilities/TestOnInstance.test.d.ts +28 -0
  43. package/build/__tests__/behavioral/utilities/TestOnInstance.test.js +289 -0
  44. package/build/__tests__/behavioral/utilities/TestOnInstance.test.js.map +1 -0
  45. package/build/__tests__/behavioral/utilities/TestOnInstanceExtendsTest.test.d.ts +9 -0
  46. package/build/__tests__/behavioral/utilities/TestOnInstanceExtendsTest.test.js +118 -0
  47. package/build/__tests__/behavioral/utilities/TestOnInstanceExtendsTest.test.js.map +1 -0
  48. package/build/__tests__/behavioral/utilities/TestOnInstanceExtendsTestWithHooks.test.d.ts +5 -0
  49. package/build/__tests__/behavioral/utilities/TestOnInstanceExtendsTestWithHooks.test.js +78 -0
  50. package/build/__tests__/behavioral/utilities/TestOnInstanceExtendsTestWithHooks.test.js.map +1 -0
  51. package/build/__tests__/behavioral/utilities/TestOnInstanceWithParentBeforeAll.test.d.ts +4 -0
  52. package/build/__tests__/behavioral/utilities/TestOnInstanceWithParentBeforeAll.test.js +23 -0
  53. package/build/__tests__/behavioral/utilities/TestOnInstanceWithParentBeforeAll.test.js.map +1 -0
  54. package/build/__tests__/behavioral/utilities/TestOnInstanceWithTwoLevelsOfInheritence.test.d.ts +4 -0
  55. package/build/__tests__/behavioral/utilities/TestOnInstanceWithTwoLevelsOfInheritence.test.js +24 -0
  56. package/build/__tests__/behavioral/utilities/TestOnInstanceWithTwoLevelsOfInheritence.test.js.map +1 -0
  57. package/build/__tests__/behavioral/utilities/TestResolver.test.d.ts +7 -0
  58. package/build/__tests__/behavioral/utilities/TestResolver.test.js +38 -0
  59. package/build/__tests__/behavioral/utilities/TestResolver.test.js.map +1 -0
  60. package/build/__tests__/behavioral/utilities/TestResolverOnStatic.test.d.ts +4 -0
  61. package/build/__tests__/behavioral/utilities/TestResolverOnStatic.test.js +20 -0
  62. package/build/__tests__/behavioral/utilities/TestResolverOnStatic.test.js.map +1 -0
  63. package/build/__tests__/behavioral/workspace/JestJsonParser.test.d.ts +18 -0
  64. package/build/__tests__/behavioral/workspace/JestJsonParser.test.js +267 -0
  65. package/build/__tests__/behavioral/workspace/JestJsonParser.test.js.map +1 -0
  66. package/build/__tests__/behavioral/workspace/TestReporter.test.d.ts +16 -0
  67. package/build/__tests__/behavioral/workspace/TestReporter.test.js +227 -0
  68. package/build/__tests__/behavioral/workspace/TestReporter.test.js.map +1 -0
  69. package/build/__tests__/behavioral/workspace/TestRunner.test.d.ts +15 -0
  70. package/build/__tests__/behavioral/workspace/TestRunner.test.js +99 -0
  71. package/build/__tests__/behavioral/workspace/TestRunner.test.js.map +1 -0
  72. package/build/__tests__/behavioral/workspace/Widgets.test.d.ts +13 -0
  73. package/build/__tests__/behavioral/workspace/Widgets.test.js +99 -0
  74. package/build/__tests__/behavioral/workspace/Widgets.test.js.map +1 -0
  75. package/build/__tests__/mock-terminal-kit.d.ts +79 -0
  76. package/build/__tests__/mock-terminal-kit.js +103 -0
  77. package/build/__tests__/mock-terminal-kit.js.map +1 -0
  78. package/build/__tests__/support/AbstractForInstanceTest.d.ts +4 -0
  79. package/build/__tests__/support/AbstractForInstanceTest.js +9 -0
  80. package/build/__tests__/support/AbstractForInstanceTest.js.map +1 -0
  81. package/build/__tests__/support/AbstractLevelOneTest.d.ts +3 -0
  82. package/build/__tests__/support/AbstractLevelOneTest.js +4 -0
  83. package/build/__tests__/support/AbstractLevelOneTest.js.map +1 -0
  84. package/build/__tests__/support/AbstractLevelTwoTest.d.ts +7 -0
  85. package/build/__tests__/support/AbstractLevelTwoTest.js +14 -0
  86. package/build/__tests__/support/AbstractLevelTwoTest.js.map +1 -0
  87. package/build/__tests__/support/AbstractStaticTest.d.ts +7 -0
  88. package/build/__tests__/support/AbstractStaticTest.js +14 -0
  89. package/build/__tests__/support/AbstractStaticTest.js.map +1 -0
  90. package/build/__tests__/support/AbstractTestOnInstanceTest.d.ts +22 -0
  91. package/build/__tests__/support/AbstractTestOnInstanceTest.js +23 -0
  92. package/build/__tests__/support/AbstractTestOnInstanceTest.js.map +1 -0
  93. package/build/__tests__/support/AbstractTestOnInstanceWithHooks.d.ts +26 -0
  94. package/build/__tests__/support/AbstractTestOnInstanceWithHooks.js +59 -0
  95. package/build/__tests__/support/AbstractTestOnInstanceWithHooks.js.map +1 -0
  96. package/build/__tests__/support/jest.setup.d.ts +1 -0
  97. package/build/__tests__/support/jest.setup.js +4 -0
  98. package/build/__tests__/support/jest.setup.js.map +1 -0
  99. package/build/__tests__/support/onTestFileResult.d.ts +244 -0
  100. package/build/__tests__/support/onTestFileResult.js +980 -0
  101. package/build/__tests__/support/onTestFileResult.js.map +1 -0
  102. package/build/impl/AbstractModuleTest.d.ts +18 -4
  103. package/build/impl/AbstractModuleTest.js +47 -9
  104. package/build/impl/AbstractModuleTest.js.map +1 -1
  105. package/build/index.d.ts +4 -4
  106. package/build/index.js +4 -4
  107. package/build/index.js.map +1 -1
  108. package/build/utilities/AssertionError.d.ts +3 -0
  109. package/build/utilities/AssertionError.js +12 -0
  110. package/build/utilities/AssertionError.js.map +1 -0
  111. package/build/utilities/StackCleaner.d.ts +4 -0
  112. package/build/utilities/StackCleaner.js +10 -0
  113. package/build/utilities/StackCleaner.js.map +1 -0
  114. package/build/utilities/TestDecoratorResolver.d.ts +35 -0
  115. package/build/utilities/TestDecoratorResolver.js +93 -0
  116. package/build/utilities/TestDecoratorResolver.js.map +1 -0
  117. package/build/utilities/assert.d.ts +49 -0
  118. package/build/utilities/assert.js +255 -0
  119. package/build/utilities/assert.js.map +1 -0
  120. package/build/utilities/assert.utility.d.ts +28 -0
  121. package/build/utilities/assert.utility.js +185 -0
  122. package/build/utilities/assert.utility.js.map +1 -0
  123. package/build/utilities/decorators.d.ts +9 -0
  124. package/build/utilities/decorators.js +133 -0
  125. package/build/utilities/decorators.js.map +1 -0
  126. package/build/workspace/CommandService.d.ts +49 -0
  127. package/build/workspace/CommandService.js +179 -0
  128. package/build/workspace/CommandService.js.map +1 -0
  129. package/build/workspace/JestJsonParser.d.ts +15 -0
  130. package/build/workspace/JestJsonParser.js +149 -0
  131. package/build/workspace/JestJsonParser.js.map +1 -0
  132. package/build/workspace/TKButtonWidget.d.ts +13 -0
  133. package/build/workspace/TKButtonWidget.js +37 -0
  134. package/build/workspace/TKButtonWidget.js.map +1 -0
  135. package/build/workspace/TestLogItemGenerator.d.ts +15 -0
  136. package/build/workspace/TestLogItemGenerator.js +142 -0
  137. package/build/workspace/TestLogItemGenerator.js.map +1 -0
  138. package/build/workspace/TestReporter.d.ts +103 -0
  139. package/build/workspace/TestReporter.js +677 -0
  140. package/build/workspace/TestReporter.js.map +1 -0
  141. package/build/workspace/TestRunner.d.ts +24 -0
  142. package/build/workspace/TestRunner.js +95 -0
  143. package/build/workspace/TestRunner.js.map +1 -0
  144. package/build/workspace/TkBaseWidget.d.ts +37 -0
  145. package/build/workspace/TkBaseWidget.js +185 -0
  146. package/build/workspace/TkBaseWidget.js.map +1 -0
  147. package/build/workspace/TkInputWidget.d.ts +16 -0
  148. package/build/workspace/TkInputWidget.js +64 -0
  149. package/build/workspace/TkInputWidget.js.map +1 -0
  150. package/build/workspace/TkLayoutCellWidget.d.ts +18 -0
  151. package/build/workspace/TkLayoutCellWidget.js +32 -0
  152. package/build/workspace/TkLayoutCellWidget.js.map +1 -0
  153. package/build/workspace/TkLayoutWidget.d.ts +34 -0
  154. package/build/workspace/TkLayoutWidget.js +130 -0
  155. package/build/workspace/TkLayoutWidget.js.map +1 -0
  156. package/build/workspace/TkMenuBarWidget.d.ts +13 -0
  157. package/build/workspace/TkMenuBarWidget.js +71 -0
  158. package/build/workspace/TkMenuBarWidget.js.map +1 -0
  159. package/build/workspace/TkPopupWidget.d.ts +16 -0
  160. package/build/workspace/TkPopupWidget.js +36 -0
  161. package/build/workspace/TkPopupWidget.js.map +1 -0
  162. package/build/workspace/TkProgressBarWidget.d.ts +10 -0
  163. package/build/workspace/TkProgressBarWidget.js +39 -0
  164. package/build/workspace/TkProgressBarWidget.js.map +1 -0
  165. package/build/workspace/TkTextWidget.d.ts +20 -0
  166. package/build/workspace/TkTextWidget.js +115 -0
  167. package/build/workspace/TkTextWidget.js.map +1 -0
  168. package/build/workspace/TkWindowWidget.d.ts +22 -0
  169. package/build/workspace/TkWindowWidget.js +88 -0
  170. package/build/workspace/TkWindowWidget.js.map +1 -0
  171. package/build/workspace/WidgetFactory.d.ts +6 -0
  172. package/build/workspace/WidgetFactory.js +21 -0
  173. package/build/workspace/WidgetFactory.js.map +1 -0
  174. package/build/workspace/button.types.d.ts +15 -0
  175. package/build/workspace/button.types.js +6 -0
  176. package/build/workspace/button.types.js.map +1 -0
  177. package/build/workspace/duration.utility.d.ts +4 -0
  178. package/build/workspace/duration.utility.js +26 -0
  179. package/build/workspace/duration.utility.js.map +1 -0
  180. package/build/workspace/factory.types.d.ts +89 -0
  181. package/build/workspace/factory.types.js +37 -0
  182. package/build/workspace/factory.types.js.map +1 -0
  183. package/build/workspace/input.types.d.ts +18 -0
  184. package/build/workspace/input.types.js +7 -0
  185. package/build/workspace/input.types.js.map +1 -0
  186. package/build/workspace/keySelectChoices.d.ts +517 -0
  187. package/build/workspace/keySelectChoices.js +2 -0
  188. package/build/workspace/keySelectChoices.js.map +1 -0
  189. package/build/workspace/layout.types.d.ts +33 -0
  190. package/build/workspace/layout.types.js +2 -0
  191. package/build/workspace/layout.types.js.map +1 -0
  192. package/build/workspace/menuBar.types.d.ts +19 -0
  193. package/build/workspace/menuBar.types.js +6 -0
  194. package/build/workspace/menuBar.types.js.map +1 -0
  195. package/build/workspace/popup.types.d.ts +13 -0
  196. package/build/workspace/popup.types.js +6 -0
  197. package/build/workspace/popup.types.js.map +1 -0
  198. package/build/workspace/progressBar.types.d.ts +10 -0
  199. package/build/workspace/progressBar.types.js +2 -0
  200. package/build/workspace/progressBar.types.js.map +1 -0
  201. package/build/workspace/table.types.d.ts +6 -0
  202. package/build/workspace/table.types.js +2 -0
  203. package/build/workspace/table.types.js.map +1 -0
  204. package/build/workspace/termKit.utility.d.ts +12 -0
  205. package/build/workspace/termKit.utility.js +128 -0
  206. package/build/workspace/termKit.utility.js.map +1 -0
  207. package/build/workspace/test.types.d.ts +24 -0
  208. package/build/workspace/test.types.js +2 -0
  209. package/build/workspace/test.types.js.map +1 -0
  210. package/build/workspace/testRunner.cli.d.ts +1 -0
  211. package/build/workspace/testRunner.cli.js +149 -0
  212. package/build/workspace/testRunner.cli.js.map +1 -0
  213. package/build/workspace/text.types.d.ts +20 -0
  214. package/build/workspace/text.types.js +7 -0
  215. package/build/workspace/text.types.js.map +1 -0
  216. package/build/workspace/widget.utilities.d.ts +5 -0
  217. package/build/workspace/widget.utilities.js +20 -0
  218. package/build/workspace/widget.utilities.js.map +1 -0
  219. package/build/workspace/widgets.types.d.ts +66 -0
  220. package/build/workspace/widgets.types.js +2 -0
  221. package/build/workspace/widgets.types.js.map +1 -0
  222. package/build/workspace/window.types.d.ts +18 -0
  223. package/build/workspace/window.types.js +9 -0
  224. package/build/workspace/window.types.js.map +1 -0
  225. package/eslint.config.js +3 -0
  226. package/package.json +30 -37
  227. package/prettier.config.js +3 -0
  228. package/src/.spruce/settings.json +3 -10
  229. package/src/__tests__/MockFetch.ts +100 -0
  230. package/src/__tests__/behavioral/AbstractModuleTest.test.ts +15 -0
  231. package/src/__tests__/behavioral/utilities/AllHooksCalledEvenIfNotDefined.test.ts +31 -0
  232. package/src/__tests__/behavioral/utilities/Assert.test.ts +826 -0
  233. package/src/__tests__/behavioral/utilities/InstanceParentTestCanAccessParentMethods.test.ts +14 -0
  234. package/src/__tests__/behavioral/utilities/MockFetch.test.ts +240 -0
  235. package/src/__tests__/behavioral/utilities/StackCleaner.test.ts +46 -0
  236. package/src/__tests__/behavioral/utilities/StaticParentTestCanAccessParentMethods.test.ts +34 -0
  237. package/src/__tests__/behavioral/utilities/StaticTestInheritsAbstractSpruceTestProperly.test.ts +11 -0
  238. package/src/__tests__/behavioral/utilities/Stringify.test.ts +169 -0
  239. package/src/__tests__/behavioral/utilities/TestDecoratorResolver.test.ts +51 -0
  240. package/src/__tests__/behavioral/utilities/TestOnBasic.test.ts +62 -0
  241. package/src/__tests__/behavioral/utilities/TestOnInstance.test.ts +439 -0
  242. package/src/__tests__/behavioral/utilities/TestOnInstanceExtendsTest.test.ts +237 -0
  243. package/src/__tests__/behavioral/utilities/TestOnInstanceExtendsTestWithHooks.test.ts +85 -0
  244. package/src/__tests__/behavioral/utilities/TestOnInstanceWithParentBeforeAll.test.ts +14 -0
  245. package/src/__tests__/behavioral/utilities/TestOnInstanceWithTwoLevelsOfInheritence.test.ts +16 -0
  246. package/src/__tests__/behavioral/utilities/TestResolver.test.ts +48 -0
  247. package/src/__tests__/behavioral/utilities/TestResolverOnStatic.test.ts +12 -0
  248. package/src/__tests__/behavioral/workspace/JestJsonParser.test.ts +357 -0
  249. package/src/__tests__/behavioral/workspace/TestReporter.test.ts +257 -0
  250. package/src/__tests__/behavioral/workspace/TestRunner.test.ts +87 -0
  251. package/src/__tests__/behavioral/workspace/Widgets.test.ts +90 -0
  252. package/src/__tests__/mock-terminal-kit.ts +115 -0
  253. package/src/__tests__/support/AbstractForInstanceTest.ts +12 -0
  254. package/src/__tests__/support/AbstractLevelOneTest.ts +3 -0
  255. package/src/__tests__/support/AbstractLevelTwoTest.ts +16 -0
  256. package/src/__tests__/support/AbstractStaticTest.ts +16 -0
  257. package/src/__tests__/support/AbstractTestOnInstanceTest.ts +30 -0
  258. package/src/__tests__/support/AbstractTestOnInstanceWithHooks.ts +138 -0
  259. package/src/__tests__/support/jest.setup.ts +2 -0
  260. package/src/__tests__/support/onTestFileResult.ts +1008 -0
  261. package/src/impl/AbstractModuleTest.ts +59 -10
  262. package/src/index.ts +4 -4
  263. package/src/utilities/AssertionError.ts +14 -0
  264. package/src/utilities/StackCleaner.ts +14 -0
  265. package/src/utilities/TestDecoratorResolver.ts +118 -0
  266. package/src/utilities/assert.ts +583 -0
  267. package/src/utilities/assert.utility.ts +295 -0
  268. package/src/utilities/decorators.ts +167 -0
  269. package/src/workspace/CommandService.ts +256 -0
  270. package/src/workspace/JestJsonParser.ts +255 -0
  271. package/src/workspace/TKButtonWidget.ts +54 -0
  272. package/src/workspace/TestLogItemGenerator.ts +184 -0
  273. package/src/workspace/TestReporter.ts +865 -0
  274. package/src/workspace/TestRunner.ts +128 -0
  275. package/src/workspace/TkBaseWidget.ts +249 -0
  276. package/src/workspace/TkInputWidget.ts +83 -0
  277. package/src/workspace/TkLayoutCellWidget.ts +46 -0
  278. package/src/workspace/TkLayoutWidget.ts +181 -0
  279. package/src/workspace/TkMenuBarWidget.ts +95 -0
  280. package/src/workspace/TkPopupWidget.ts +47 -0
  281. package/src/workspace/TkProgressBarWidget.ts +54 -0
  282. package/src/workspace/TkTextWidget.ts +158 -0
  283. package/src/workspace/TkWindowWidget.ts +122 -0
  284. package/src/workspace/WidgetFactory.ts +33 -0
  285. package/src/workspace/button.types.ts +19 -0
  286. package/src/workspace/duration.utility.ts +34 -0
  287. package/src/workspace/factory.types.ts +101 -0
  288. package/src/workspace/input.types.ts +22 -0
  289. package/src/workspace/keySelectChoices.ts +134 -0
  290. package/src/workspace/layout.types.ts +40 -0
  291. package/src/workspace/menuBar.types.ts +24 -0
  292. package/src/workspace/popup.types.ts +17 -0
  293. package/src/workspace/progressBar.types.ts +13 -0
  294. package/src/workspace/table.types.ts +9 -0
  295. package/src/workspace/termKit.utility.ts +130 -0
  296. package/src/workspace/terminal-kit.d.ts +28 -0
  297. package/src/workspace/test.types.ts +34 -0
  298. package/src/workspace/testRunner.cli.ts +159 -0
  299. package/src/workspace/text.types.ts +26 -0
  300. package/src/workspace/widget.utilities.ts +35 -0
  301. package/src/workspace/widgets.types.ts +102 -0
  302. package/src/workspace/window.types.ts +22 -0
  303. package/tsconfig.json +23 -27
  304. package/build/__tests__/AbstractPackageTest.d.ts +0 -4
  305. package/build/__tests__/AbstractPackageTest.js +0 -7
  306. package/build/__tests__/AbstractPackageTest.js.map +0 -1
  307. package/build/__tests__/functions/assertFunction.test.d.ts +0 -5
  308. package/build/__tests__/functions/assertFunction.test.js +0 -23
  309. package/build/__tests__/functions/assertFunction.test.js.map +0 -1
  310. package/build/__tests__/functions/testFunction.test.d.ts +0 -5
  311. package/build/__tests__/functions/testFunction.test.js +0 -23
  312. package/build/__tests__/functions/testFunction.test.js.map +0 -1
  313. package/build/__tests__/impl/AbstractModuleTest.test.js.map +0 -1
  314. package/build/functions/assert.d.ts +0 -3
  315. package/build/functions/assert.js +0 -4
  316. package/build/functions/assert.js.map +0 -1
  317. package/build/functions/test.d.ts +0 -3
  318. package/build/functions/test.js +0 -4
  319. package/build/functions/test.js.map +0 -1
  320. package/eslint.config.mjs +0 -3
  321. package/src/__tests__/AbstractPackageTest.ts +0 -7
  322. package/src/__tests__/functions/assertFunction.test.ts +0 -22
  323. package/src/__tests__/functions/testFunction.test.ts +0 -22
  324. package/src/__tests__/impl/AbstractModuleTest.test.ts +0 -34
  325. package/src/functions/assert.ts +0 -4
  326. package/src/functions/test.ts +0 -4
@@ -0,0 +1,128 @@
1
+ import fs from 'fs'
2
+ import pathUtil from 'path'
3
+ import { EventEmitter } from 'events'
4
+ import CommandServiceImpl from './CommandService.js'
5
+ import JestJsonParser from './JestJsonParser.js'
6
+ import { TestResults } from './test.types.js'
7
+
8
+ export default class TestRunner extends EventEmitter {
9
+ private cwd: string
10
+ private commandService: CommandServiceImpl
11
+ private wasKilled = false
12
+ private testResults: TestResults = { totalTestFiles: 0 }
13
+
14
+ public constructor(options: {
15
+ cwd: string
16
+ commandService: CommandServiceImpl
17
+ }) {
18
+ super()
19
+ this.cwd = options.cwd
20
+ this.commandService = options.commandService
21
+ }
22
+
23
+ public async run(options?: {
24
+ pattern?: string | null
25
+ debugPort?: number | null
26
+ }): Promise<TestResults & { wasKilled: boolean }> {
27
+ this.wasKilled = false
28
+
29
+ const jestPath = this.resolvePathToJest()
30
+ const debugArgs =
31
+ (options?.debugPort ?? 0) > 0
32
+ ? `--inspect=${options?.debugPort}`
33
+ : ``
34
+ const pattern = options?.pattern ?? ''
35
+ const escapeShell = function (cmd: string) {
36
+ return (
37
+ '--testPathPatterns="' +
38
+ cmd.replace(/(["\s'$`\\])/g, '\\$1') +
39
+ '"'
40
+ )
41
+ }
42
+ const command = `node --experimental-vm-modules --unhandled-rejections=strict ${debugArgs} ${jestPath} --reporters="@sprucelabs/jest-json-reporter" --testRunner="jest-circus/runner" --passWithNoTests ${
43
+ pattern ? escapeShell(pattern) : ''
44
+ }`
45
+
46
+ const parser = new JestJsonParser()
47
+
48
+ this.testResults = {
49
+ totalTestFiles: 0,
50
+ }
51
+
52
+ try {
53
+ await this.commandService.execute(command, {
54
+ forceColor: true,
55
+ env: { NODE_NO_WARNINGS: '1' },
56
+ onError: async (data) => {
57
+ const isDebugMessaging = this.isDebugMessage(data)
58
+
59
+ if (!isDebugMessaging) {
60
+ this.emit('did-error', { message: data })
61
+ }
62
+ },
63
+ onData: async (data) => {
64
+ try {
65
+ parser.write(data)
66
+ this.testResults = parser.getResults()
67
+ this.emit('did-update', { results: this.testResults })
68
+ } catch (err) {
69
+ this.emit('did-error', {
70
+ message: `Parser error: ${err}`,
71
+ })
72
+ }
73
+ },
74
+ })
75
+ } catch (err) {
76
+ if (!this.testResults.totalTestFiles) {
77
+ throw err
78
+ }
79
+ }
80
+
81
+ return { ...this.testResults, wasKilled: this.wasKilled }
82
+ }
83
+
84
+ private isDebugMessage(data: string) {
85
+ return (
86
+ data.search(/^ attached/i) === 0 ||
87
+ data.search(/^ listening/i) === 0 ||
88
+ data.search(/^waiting for the /i) === 0
89
+ )
90
+ }
91
+
92
+ public hasFailedTests() {
93
+ return (this.testResults.totalFailed ?? 0) > 0
94
+ }
95
+
96
+ public hasSkippedTests() {
97
+ return (this.testResults.totalSkipped ?? 0) > 0
98
+ }
99
+
100
+ public kill() {
101
+ this.wasKilled = true
102
+ this.commandService.kill()
103
+ }
104
+
105
+ private resolvePathToJest() {
106
+ const jestBin = pathUtil.join('node_modules', '.bin', 'jest')
107
+ const fullCwd = pathUtil.resolve(this.cwd)
108
+ const pathParts = fullCwd.split(pathUtil.sep).filter(Boolean)
109
+
110
+ while (pathParts.length > 0) {
111
+ const candidate =
112
+ pathUtil.sep +
113
+ pathUtil.join(...pathParts) +
114
+ pathUtil.sep +
115
+ jestBin
116
+
117
+ if (fs.existsSync(candidate)) {
118
+ return candidate
119
+ }
120
+
121
+ pathParts.pop()
122
+ }
123
+
124
+ throw new Error(
125
+ `Could not find jest binary. Make sure jest is installed in ${this.cwd}`
126
+ )
127
+ }
128
+ }
@@ -0,0 +1,249 @@
1
+ import { EventEmitter } from 'events'
2
+ import { Terminal } from 'terminal-kit'
3
+ import {
4
+ BaseWidget,
5
+ EventContract,
6
+ UniversalWidgetOptions,
7
+ WidgetFrame,
8
+ WidgetFrameCalculated,
9
+ WidgetPadding,
10
+ } from './widgets.types.js'
11
+
12
+ export type BaseWidgetWithTermKitAddons = BaseWidget & {
13
+ getTermKitElement: () => any | null
14
+ }
15
+
16
+ export type TkWidgetOptions = UniversalWidgetOptions & {
17
+ term: Terminal
18
+ parent: BaseWidgetWithTermKitAddons
19
+ }
20
+
21
+ export default abstract class TkBaseWidget<Contract extends EventContract = any>
22
+ extends EventEmitter
23
+ implements BaseWidget<Contract>
24
+ {
25
+ public type = 'abstract'
26
+ protected parent: BaseWidgetWithTermKitAddons | null
27
+ protected term: Terminal
28
+ private id: string | null
29
+ private children: BaseWidget[] = []
30
+ protected shouldLockWidthWithParent = false
31
+ protected shouldLockHeightWithParent = false
32
+ protected shouldLockRightWithParent = false
33
+ protected shouldLockBottomWithParent = false
34
+ protected padding: WidgetPadding = {}
35
+ private frameLockDeltas: {
36
+ leftDelta: number
37
+ widthDelta: number
38
+ topDelta: number
39
+ heightDelta: number
40
+ rightDelta: number
41
+ bottomDelta: number
42
+ } = {
43
+ leftDelta: 0,
44
+ widthDelta: 0,
45
+ topDelta: 0,
46
+ heightDelta: 0,
47
+ rightDelta: 0,
48
+ bottomDelta: 0,
49
+ }
50
+
51
+ public constructor(options: TkWidgetOptions) {
52
+ super()
53
+
54
+ this.parent = options.parent ?? null
55
+ this.term = options.term
56
+ this.id = options.id ?? null
57
+ this.shouldLockHeightWithParent =
58
+ options.shouldLockHeightWithParent ?? false
59
+ this.shouldLockWidthWithParent =
60
+ options.shouldLockWidthWithParent ?? false
61
+ this.shouldLockRightWithParent =
62
+ options.shouldLockRightWithParent ?? false
63
+ this.shouldLockBottomWithParent =
64
+ options.shouldLockBottomWithParent ?? false
65
+
66
+ this.padding = {
67
+ left: 0,
68
+ top: 0,
69
+ right: 0,
70
+ bottom: 0,
71
+ ...options.padding,
72
+ }
73
+
74
+ if (this.parent) {
75
+ this.parent.addChild(this as TkBaseWidget)
76
+ }
77
+ }
78
+
79
+ public getChildren(): BaseWidget[] {
80
+ return this.children
81
+ }
82
+
83
+ public addChild(child: BaseWidget): void {
84
+ this.children.push(child)
85
+ }
86
+
87
+ public getId(): string | null {
88
+ return this.id
89
+ }
90
+
91
+ public getParent(): BaseWidget | null {
92
+ return this.parent
93
+ }
94
+
95
+ public getFrame(): WidgetFrameCalculated {
96
+ const element = this.getTermKitElement()
97
+ if (element) {
98
+ return {
99
+ left: element.outputX,
100
+ top: element.outputY,
101
+ width: element.outputWidth,
102
+ height: element.outputHeight,
103
+ }
104
+ }
105
+ throw new Error(
106
+ element
107
+ ? `${this.type} does not implement getFrame()`
108
+ : `${this.type} does not implement getTermKitElement()`
109
+ )
110
+ }
111
+
112
+ public setFrame(frame: Partial<WidgetFrame>): void {
113
+ const element = this.getTermKitElement()
114
+
115
+ if (element) {
116
+ if (element.resize) {
117
+ element.resize({
118
+ x: frame.left,
119
+ y: frame.top,
120
+ width: frame.width,
121
+ height: frame.height,
122
+ })
123
+ } else {
124
+ element.outputX = frame.left ?? element.outputX
125
+ element.outputY = frame.top ?? element.outputY
126
+ element.outputWidth = frame.width ?? element.outputWidth
127
+ element.outputHeight = frame.height ?? element.outputHeight
128
+ }
129
+
130
+ this.sizeLockedChildren()
131
+
132
+ element.draw()
133
+
134
+ return
135
+ }
136
+
137
+ throw new Error(`${this.type} does not implement getTermKitElement()`)
138
+ }
139
+
140
+ protected sizeLockedChildren() {
141
+ const newFrame = this.getFrame()
142
+ for (const child of this.children as TkBaseWidget[]) {
143
+ child.handleParentResize(newFrame)
144
+ }
145
+ }
146
+
147
+ public getChildById(id?: string): BaseWidget | null {
148
+ for (const child of this.getChildren()) {
149
+ if (child.getId() === id) {
150
+ return child
151
+ }
152
+ }
153
+
154
+ return null
155
+ }
156
+
157
+ public removeChild(child: BaseWidget) {
158
+ this.children = this.children.filter((c) => c !== child)
159
+ }
160
+
161
+ protected handleParentResize(parentFrame: WidgetFrameCalculated): void {
162
+ const updatedFrame = this.getFrame()
163
+ let shouldSetFrame = false
164
+
165
+ if (this.shouldLockHeightWithParent) {
166
+ shouldSetFrame = true
167
+ updatedFrame.height =
168
+ parentFrame.height - this.frameLockDeltas.heightDelta
169
+ }
170
+
171
+ if (this.shouldLockWidthWithParent) {
172
+ shouldSetFrame = true
173
+ updatedFrame.width =
174
+ parentFrame.width - this.frameLockDeltas.widthDelta
175
+ }
176
+
177
+ if (this.shouldLockRightWithParent) {
178
+ shouldSetFrame = true
179
+ updatedFrame.left =
180
+ parentFrame.width -
181
+ this.frameLockDeltas.rightDelta -
182
+ updatedFrame.width
183
+ }
184
+
185
+ if (this.shouldLockBottomWithParent) {
186
+ shouldSetFrame = true
187
+ updatedFrame.top =
188
+ parentFrame.height -
189
+ updatedFrame.height -
190
+ this.frameLockDeltas.bottomDelta
191
+ }
192
+
193
+ if (shouldSetFrame) {
194
+ this.setFrame(updatedFrame)
195
+ }
196
+ }
197
+
198
+ public async destroy() {
199
+ this.getTermKitElement()?.destroy()
200
+ this.getParent()?.removeChild(this as BaseWidget)
201
+ }
202
+
203
+ public getTermKitElement(): any | null {
204
+ return null
205
+ }
206
+
207
+ protected calculateSizeLockDeltas() {
208
+ const frame = this.getFrame()
209
+ const parentFrame = this.getParent()?.getFrame()
210
+
211
+ if (!parentFrame) {
212
+ return
213
+ }
214
+
215
+ let leftDelta = 0
216
+ let widthDelta = 0
217
+ let topDelta = 0
218
+ let heightDelta = 0
219
+ let rightDelta = 0
220
+ let bottomDelta = 0
221
+
222
+ if (this.shouldLockWidthWithParent) {
223
+ leftDelta = frame.left
224
+ widthDelta = parentFrame.width - frame.width
225
+ }
226
+
227
+ if (this.shouldLockHeightWithParent) {
228
+ topDelta = frame.top
229
+ heightDelta = parentFrame.height - frame.height
230
+ }
231
+
232
+ if (this.shouldLockRightWithParent) {
233
+ rightDelta = frame.left + frame.width - parentFrame.width
234
+ }
235
+
236
+ if (this.shouldLockBottomWithParent) {
237
+ bottomDelta = parentFrame.height - (frame.top + frame.height)
238
+ }
239
+
240
+ this.frameLockDeltas = {
241
+ leftDelta,
242
+ widthDelta,
243
+ topDelta,
244
+ heightDelta,
245
+ rightDelta,
246
+ bottomDelta,
247
+ }
248
+ }
249
+ }
@@ -0,0 +1,83 @@
1
+ import chalk from 'chalk'
2
+ import terminal_kit from 'terminal-kit'
3
+ import { InputWidget, InputWidgetOptions } from './input.types.js'
4
+ import { WidgetFrame } from './widgets.types.js'
5
+ import widgetUtil from './widget.utilities.js'
6
+ import termKitUtil from './termKit.utility.js'
7
+ import TkBaseWidget, { TkWidgetOptions } from './TkBaseWidget.js'
8
+ const termKit = terminal_kit as any
9
+
10
+ export default class TkInputWidget extends TkBaseWidget implements InputWidget {
11
+ public readonly type = 'input'
12
+
13
+ private input: any
14
+
15
+ public constructor(
16
+ options: TkWidgetOptions & InputWidgetOptions & { termKitElement: any }
17
+ ) {
18
+ super(options)
19
+
20
+ const frame = termKitUtil.buildFrame(options, options.parent)
21
+
22
+ const { parent, ...rest } = options
23
+
24
+ this.input = new termKit.InlineInput({
25
+ parent: parent ? parent.getTermKitElement() : undefined,
26
+ textAttr: { bgColor: 'black', color: 'yellow' },
27
+ voidAttr: { bgColor: 'black', color: 'yellow' },
28
+ placeholder: options.placeholder
29
+ ? chalk.italic.black(options.placeholder)
30
+ : undefined,
31
+ placeholderHasMarkup: true,
32
+ prompt: {
33
+ content: options.label ? `${options.label} > ` : undefined,
34
+ contentHasMarkup: true,
35
+ },
36
+ cancelable: true,
37
+ ...rest,
38
+ ...frame,
39
+ })
40
+
41
+ this.input.__widget = this
42
+ this.input.on('submit', this.handleSubmit.bind(this))
43
+ this.input.on('cancel', this.handleCancel.bind(this))
44
+
45
+ this.calculateSizeLockDeltas()
46
+ }
47
+
48
+ public setFrame(frame: WidgetFrame) {
49
+ const oldFrame = this.getFrame()
50
+ const newFrame = widgetUtil.buildFrame(frame, this.parent)
51
+
52
+ this.input.setSizeAndPosition({
53
+ x: newFrame.left ?? oldFrame.left,
54
+ y: newFrame.top ?? oldFrame.top,
55
+ width: newFrame.width ?? oldFrame.width,
56
+ height: newFrame.height ?? oldFrame.height,
57
+ })
58
+
59
+ this.input.draw()
60
+ }
61
+
62
+ private async handleCancel() {
63
+ await (this as InputWidget).emit('cancel')
64
+ }
65
+
66
+ private async handleSubmit() {
67
+ await (this as InputWidget).emit('submit', {
68
+ value: this.getValue(),
69
+ })
70
+ }
71
+
72
+ public getValue(): string | undefined {
73
+ return this.input.getValue()
74
+ }
75
+
76
+ public setValue(value: string): void {
77
+ this.input.setContent(value)
78
+ }
79
+
80
+ public getTermKitElement() {
81
+ return this.input
82
+ }
83
+ }
@@ -0,0 +1,46 @@
1
+ import { LayoutCellWidget, LayoutCellWidgetOptions } from './layout.types.js'
2
+ import TkBaseWidget, { TkWidgetOptions } from './TkBaseWidget.js'
3
+
4
+ export default class TkLayoutCellWidget
5
+ extends TkBaseWidget
6
+ implements LayoutCellWidget
7
+ {
8
+ public readonly type = 'layoutCell'
9
+
10
+ private cell: any
11
+
12
+ public constructor(
13
+ options: TkWidgetOptions &
14
+ LayoutCellWidgetOptions & { termKitElement: any }
15
+ ) {
16
+ super({
17
+ shouldLockHeightWithParent: true,
18
+ shouldLockWidthWithParent: true,
19
+ ...options,
20
+ })
21
+
22
+ this.cell = options.termKitElement
23
+ this.cell.__widget = this
24
+ }
25
+
26
+ public getId() {
27
+ return this.cell.id
28
+ }
29
+
30
+ public getTermKitElement() {
31
+ return this.cell
32
+ }
33
+
34
+ public getFrame() {
35
+ return {
36
+ left: this.cell.outputDst.x,
37
+ top: this.cell.outputDst.y,
38
+ width: this.cell.inputWidth,
39
+ height: this.cell.inputHeight,
40
+ }
41
+ }
42
+
43
+ public setFrame() {
44
+ this.sizeLockedChildren()
45
+ }
46
+ }
@@ -0,0 +1,181 @@
1
+ import terminal_kit from 'terminal-kit'
2
+ import {
3
+ LayoutColumn,
4
+ LayoutRow,
5
+ LayoutWidget,
6
+ LayoutWidgetOptions,
7
+ } from './layout.types.js'
8
+ import { WidgetFrameAttribute, WidgetFrame } from './widgets.types.js'
9
+ import termKitUtil from './termKit.utility.js'
10
+ import TkBaseWidget, { TkWidgetOptions } from './TkBaseWidget.js'
11
+ import TkLayoutCellWidget from './TkLayoutCellWidget.js'
12
+ const termKit = terminal_kit as any
13
+
14
+ export default class TkLayoutWidget
15
+ extends TkBaseWidget
16
+ implements LayoutWidget
17
+ {
18
+ public readonly type = 'layout'
19
+
20
+ private layout: any
21
+
22
+ public constructor(options: TkWidgetOptions & LayoutWidgetOptions) {
23
+ super(options)
24
+
25
+ const mappedOptions =
26
+ termKitUtil.mapWidgetOptionsToTermKitOptions(options)
27
+
28
+ const { parent, ...layout } = mappedOptions
29
+
30
+ if (!parent) {
31
+ throw new Error('Missing required parameter: parent')
32
+ }
33
+
34
+ this.layout = new termKit.Layout({
35
+ parent,
36
+ layout,
37
+ })
38
+
39
+ this.layout.__widget = this
40
+ this.layout.off('parentResize', this.layout.onParentResize)
41
+
42
+ this.calculateSizeLockDeltas()
43
+ }
44
+
45
+ public getChildren() {
46
+ return this.layout.zChildren.map((child: any) => {
47
+ return new TkLayoutCellWidget({
48
+ term: this.term,
49
+ termKitElement: child,
50
+ parent: this,
51
+ })
52
+ })
53
+ }
54
+
55
+ public getTermKitElement() {
56
+ return this.layout
57
+ }
58
+
59
+ public getFrame() {
60
+ return {
61
+ left: this.layout.computed.xmin,
62
+ top: this.layout.computed.ymin,
63
+ width: this.layout.computed.width,
64
+ height: this.layout.computed.height,
65
+ }
66
+ }
67
+
68
+ public async destroy() {
69
+ this.layout.destroy()
70
+ }
71
+
72
+ public setFrame(frame: Partial<WidgetFrame>) {
73
+ const calculated = termKitUtil.buildFrame(frame, this.parent)
74
+ const def = this.layout.layoutDef
75
+
76
+ delete def.height
77
+ delete def.heightPercent
78
+
79
+ this.layout.layoutDef.height = calculated.height
80
+
81
+ this.handleResize()
82
+ }
83
+
84
+ private handleResize() {
85
+ this.layout.computeBoundingBoxes()
86
+ this.layout.draw()
87
+
88
+ this.sizeLockedChildren()
89
+ }
90
+
91
+ public getRows(): LayoutRow[] {
92
+ const rows = this.layout.layoutDef.rows
93
+ const layoutRows = this.termKitRowsToLayoutRows(rows)
94
+
95
+ return layoutRows
96
+ }
97
+
98
+ private termKitRowsToLayoutRows(rows: any): LayoutRow[] {
99
+ return rows.map((row: any) => ({
100
+ ...termKitUtil.mapTermKitOptionsToWidgetOptions(row),
101
+ columns: this.termKitColumnsToLayoutColumns(row.columns),
102
+ }))
103
+ }
104
+
105
+ private termKitColumnsToLayoutColumns(columns: any) {
106
+ return columns.map((col: any) =>
107
+ termKitUtil.mapTermKitOptionsToWidgetOptions(col)
108
+ )
109
+ }
110
+
111
+ public addRow(row: LayoutRow): void {
112
+ this.layout.layoutDef.rows.push({
113
+ ...termKitUtil.mapWidgetOptionsToTermKitOptions(row),
114
+ columns: this.widgetColumnsToTermKitColumns(row.columns),
115
+ })
116
+ }
117
+
118
+ public removeRow(rowIdx: number): void {
119
+ this.layout.layoutDef.rows.splice(rowIdx, 1)
120
+ }
121
+
122
+ public removeColumn(rowIdx: number, columnIdx: number): void {
123
+ const row = this.layout.layoutDef.rows[rowIdx]
124
+ if (row) {
125
+ row.columns.splice(columnIdx, 1)
126
+ } else {
127
+ throw new Error(
128
+ `Can't add remove column because row at index ${rowIdx} does not exist.`
129
+ )
130
+ }
131
+ }
132
+
133
+ public addColumn(rowIdx: number, column: LayoutColumn): void {
134
+ if (this.layout.layoutDef.rows[rowIdx]) {
135
+ this.layout.layoutDef.rows[rowIdx].columns.push({
136
+ ...termKitUtil.mapWidgetOptionsToTermKitOptions(column),
137
+ })
138
+ } else {
139
+ throw new Error(
140
+ `Can't add column because row at index ${rowIdx} does not exist.`
141
+ )
142
+ }
143
+ }
144
+
145
+ public setColumnWidth(options: {
146
+ rowIdx: number
147
+ columnIdx: number
148
+ width: WidgetFrameAttribute
149
+ }): void {
150
+ const { rowIdx, columnIdx, width } = options
151
+
152
+ const col = this.layout.layoutDef.rows[rowIdx]?.columns[columnIdx]
153
+ if (col) {
154
+ this.layout.layoutDef.rows[rowIdx].columns[columnIdx] = {
155
+ ...col,
156
+ ...termKitUtil.mapWidgetOptionsToTermKitOptions({ width }),
157
+ }
158
+ } else {
159
+ throw new Error(
160
+ `Can't add set column width because column ${columnIdx} at row ${rowIdx} does not exist.`
161
+ )
162
+ }
163
+ }
164
+
165
+ private widgetColumnsToTermKitColumns(columns: LayoutColumn[]) {
166
+ return columns.map((column) => ({
167
+ ...termKitUtil.mapWidgetOptionsToTermKitOptions(column),
168
+ }))
169
+ }
170
+
171
+ public setRowHeight(rowIdx: number, height: WidgetFrameAttribute): void {
172
+ this.layout.layoutDef.rows[rowIdx] = {
173
+ ...this.layout.layoutDef.rows[rowIdx],
174
+ ...termKitUtil.mapWidgetOptionsToTermKitOptions({ height }),
175
+ }
176
+ }
177
+
178
+ public updateLayout() {
179
+ this.handleResize()
180
+ }
181
+ }