@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 { isObject } from 'lodash-es';
2
+ import widgetUtil from './widget.utilities.js';
3
+ const termKitUtil = {
4
+ buildFrame(frame, parent) {
5
+ const calculated = widgetUtil.buildFrame(frame, parent);
6
+ return {
7
+ x: calculated.left,
8
+ y: calculated.top,
9
+ width: calculated.width,
10
+ height: calculated.height,
11
+ };
12
+ },
13
+ mapWidgetOptionsToTermKitOptions(options) {
14
+ const mapped = {};
15
+ const keys = Object.keys(options);
16
+ const ignores = [
17
+ 'shouldLockHeightWithParent',
18
+ 'shouldLockWidthWithParent',
19
+ 'shouldLockBottomWithParent',
20
+ 'term',
21
+ ];
22
+ if (options.backgroundColor) {
23
+ mapped.attr = {
24
+ ...mapped.attr,
25
+ bgColor: options.backgroundColor,
26
+ };
27
+ }
28
+ if (options.foregroundColor) {
29
+ mapped.attr = {
30
+ ...mapped.attr,
31
+ color: options.foregroundColor,
32
+ };
33
+ }
34
+ for (const key of keys) {
35
+ const item = options[key];
36
+ if (Array.isArray(item)) {
37
+ mapped[key] = [];
38
+ for (const i of item) {
39
+ mapped[key].push(this.mapWidgetOptionsToTermKitOptions(i));
40
+ }
41
+ }
42
+ else {
43
+ switch (key) {
44
+ case 'left':
45
+ mapped.x = item;
46
+ break;
47
+ case 'top':
48
+ mapped.y = item;
49
+ break;
50
+ case 'width':
51
+ if (typeof item === 'string') {
52
+ mapped.widthPercent = parseInt(item);
53
+ }
54
+ else {
55
+ mapped.width = item;
56
+ }
57
+ break;
58
+ case 'height':
59
+ if (typeof item === 'string') {
60
+ mapped.heightPercent = parseInt(item);
61
+ }
62
+ else {
63
+ mapped.height = item;
64
+ }
65
+ break;
66
+ case 'parent':
67
+ mapped.parent = item.getTermKitElement();
68
+ break;
69
+ default:
70
+ if (ignores.indexOf(key) > -1) {
71
+ break;
72
+ }
73
+ if (typeof item !== 'function' && isObject(item)) {
74
+ mapped[key] =
75
+ this.mapWidgetOptionsToTermKitOptions(item);
76
+ }
77
+ else {
78
+ mapped[key] = item;
79
+ }
80
+ }
81
+ }
82
+ }
83
+ return mapped;
84
+ },
85
+ mapTermKitOptionsToWidgetOptions(options) {
86
+ const mapped = {};
87
+ const keys = Object.keys(options);
88
+ for (const key of keys) {
89
+ const item = options[key];
90
+ if (Array.isArray(item)) {
91
+ mapped[key] = [];
92
+ for (const i of item) {
93
+ mapped[key].push(this.mapTermKitOptionsToWidgetOptions(i));
94
+ }
95
+ }
96
+ else {
97
+ switch (key) {
98
+ case 'left':
99
+ mapped.x = item;
100
+ break;
101
+ case 'top':
102
+ mapped.y = item;
103
+ break;
104
+ case 'widthPercent':
105
+ mapped.width = `${item}%`;
106
+ break;
107
+ case 'heightPercent':
108
+ mapped.height = `${item}%`;
109
+ break;
110
+ case 'parent':
111
+ mapped.parent = item.getTermKitElement();
112
+ break;
113
+ default:
114
+ if (typeof item !== 'function' && isObject(item)) {
115
+ mapped[key] =
116
+ this.mapTermKitOptionsToWidgetOptions(item);
117
+ }
118
+ else {
119
+ mapped[key] = item;
120
+ }
121
+ }
122
+ }
123
+ }
124
+ return mapped;
125
+ },
126
+ };
127
+ export default termKitUtil;
128
+ //# sourceMappingURL=termKit.utility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"termKit.utility.js","sourceRoot":"","sources":["../../src/workspace/termKit.utility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type TestResultStatus = 'running' | 'passed' | 'failed';
2
+ export type TestRunnerStatus = 'running' | 'stopped' | 'ready';
3
+ export interface TestFileTest {
4
+ name: string;
5
+ status: 'passed' | 'failed' | 'skipped' | 'pending' | 'todo' | 'disabled' | 'focused';
6
+ errorMessages?: string[];
7
+ duration: number;
8
+ }
9
+ export interface SpruceTestFile {
10
+ path: string;
11
+ status: TestResultStatus;
12
+ tests?: TestFileTest[];
13
+ errorMessage?: string;
14
+ }
15
+ export interface TestResults {
16
+ totalTests?: number;
17
+ totalPassed?: number;
18
+ totalFailed?: number;
19
+ totalSkipped?: number;
20
+ totalTodo?: number;
21
+ totalTestFiles: number;
22
+ totalTestFilesComplete?: number;
23
+ testFiles?: SpruceTestFile[];
24
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.types.js","sourceRoot":"","sources":["../../src/workspace/test.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,149 @@
1
+ import chokidar from 'chokidar';
2
+ import path from 'path';
3
+ import CommandServiceImpl from './CommandService.js';
4
+ import TestReporter from './TestReporter.js';
5
+ import TestRunner from './TestRunner.js';
6
+ const args = process.argv.slice(2);
7
+ const get = (flag) => {
8
+ const i = args.indexOf(flag);
9
+ return i !== -1 ? args[i + 1] : undefined;
10
+ };
11
+ const has = (flag) => args.includes(flag);
12
+ const pattern = get('--pattern') ?? null;
13
+ const watchMode = (get('--watchMode') ?? 'off');
14
+ const inspectPort = parseInt(get('--inspect') ?? '0', 10) || null;
15
+ const cwd = process.cwd();
16
+ let currentPattern = pattern;
17
+ let isDebugging = inspectPort !== null;
18
+ let currentWatchMode = watchMode;
19
+ let runner = null;
20
+ let running = false;
21
+ const reporter = new TestReporter({
22
+ cwd,
23
+ filterPattern: pattern ?? undefined,
24
+ watchMode,
25
+ isDebugging,
26
+ status: has('--shouldHoldAtStart') ? 'stopped' : 'ready',
27
+ handleStartStop: () => {
28
+ if (running) {
29
+ runner?.kill();
30
+ }
31
+ else {
32
+ runTests();
33
+ }
34
+ },
35
+ handleRestart: () => {
36
+ runner?.kill();
37
+ setTimeout(runTests, 100);
38
+ },
39
+ handleQuit: () => {
40
+ runner?.kill();
41
+ process.exit(0);
42
+ },
43
+ handleFilterPatternChange: (p) => {
44
+ currentPattern = p ?? null;
45
+ if (running) {
46
+ runner?.kill();
47
+ setTimeout(runTests, 100);
48
+ }
49
+ else {
50
+ runTests();
51
+ }
52
+ },
53
+ handleToggleDebug: () => {
54
+ isDebugging = !isDebugging;
55
+ reporter.setIsDebugging(isDebugging);
56
+ },
57
+ handletoggleStandardWatch: () => {
58
+ currentWatchMode = currentWatchMode === 'standard' ? 'off' : 'standard';
59
+ reporter.setWatchMode(currentWatchMode);
60
+ },
61
+ handleToggleSmartWatch: () => {
62
+ currentWatchMode = currentWatchMode === 'smart' ? 'off' : 'smart';
63
+ reporter.setWatchMode(currentWatchMode);
64
+ },
65
+ });
66
+ async function runTests() {
67
+ if (running) {
68
+ return;
69
+ }
70
+ running = true;
71
+ try {
72
+ reporter.setStatus('running');
73
+ }
74
+ catch (err) {
75
+ running = false;
76
+ reporter.appendError(`setStatus error: ${err}`);
77
+ return;
78
+ }
79
+ const commandSvc = new CommandServiceImpl(cwd);
80
+ runner = new TestRunner({ cwd, commandService: commandSvc });
81
+ runner.on('did-update', ({ results }) => {
82
+ try {
83
+ reporter.updateResults(results);
84
+ }
85
+ catch (err) {
86
+ reporter.appendError(`updateResults error: ${err}`);
87
+ }
88
+ });
89
+ runner.on('did-error', ({ message }) => {
90
+ reporter.appendError(message);
91
+ });
92
+ try {
93
+ await runner.run({
94
+ pattern: currentPattern,
95
+ debugPort: isDebugging ? (inspectPort ?? 5200) : null,
96
+ });
97
+ }
98
+ catch (err) {
99
+ reporter.appendError(`Test run failed: ${err}`);
100
+ }
101
+ finally {
102
+ running = false;
103
+ reporter.setStatus('stopped');
104
+ }
105
+ }
106
+ let debounceTimer = null;
107
+ function scheduleRerun(changedFile) {
108
+ if (debounceTimer) {
109
+ clearTimeout(debounceTimer);
110
+ }
111
+ if (currentWatchMode === 'smart' && changedFile) {
112
+ const rel = path.relative(cwd, changedFile);
113
+ const base = path.basename(rel, path.extname(rel));
114
+ reporter.startCountdownTimer(2);
115
+ debounceTimer = setTimeout(() => {
116
+ currentPattern = base;
117
+ reporter.setFilterPattern(base);
118
+ runner?.kill();
119
+ setTimeout(runTests, 100);
120
+ }, 2000);
121
+ }
122
+ else if (currentWatchMode === 'standard') {
123
+ reporter.startCountdownTimer(2);
124
+ debounceTimer = setTimeout(() => {
125
+ runner?.kill();
126
+ setTimeout(runTests, 100);
127
+ }, 2000);
128
+ }
129
+ }
130
+ async function main() {
131
+ await reporter.start();
132
+ await new Promise((r) => setTimeout(r, 50));
133
+ if (!has('--shouldHoldAtStart')) {
134
+ runTests();
135
+ }
136
+ if (currentWatchMode !== 'off') {
137
+ const watcher = chokidar.watch(path.join(cwd, 'src'), {
138
+ ignored: /node_modules/,
139
+ ignoreInitial: true,
140
+ });
141
+ watcher.on('change', scheduleRerun);
142
+ watcher.on('add', scheduleRerun);
143
+ }
144
+ }
145
+ main().catch((err) => {
146
+ console.error(err);
147
+ process.exit(1);
148
+ });
149
+ //# sourceMappingURL=testRunner.cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testRunner.cli.js","sourceRoot":"","sources":["../../src/workspace/testRunner.cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { BaseWidget } from './widgets.types.js';
2
+ export declare const textEventContract: {
3
+ eventSignatures: {
4
+ click: {};
5
+ };
6
+ };
7
+ export type TextEventContract = typeof textEventContract;
8
+ export interface TextWidgetOptions {
9
+ isScrollEnabled?: boolean;
10
+ shouldAutoScrollWhenAppendingContent?: boolean;
11
+ wordWrap?: boolean;
12
+ text?: string;
13
+ }
14
+ export interface TextWidget extends BaseWidget<TextEventContract> {
15
+ readonly type: 'text';
16
+ getText(): string;
17
+ setText(content: string): void;
18
+ getScrollX(): number;
19
+ getScrollY(): number;
20
+ }
@@ -0,0 +1,7 @@
1
+ // ** Text Widget ** //
2
+ export const textEventContract = {
3
+ eventSignatures: {
4
+ click: {},
5
+ },
6
+ };
7
+ //# sourceMappingURL=text.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.types.js","sourceRoot":"","sources":["../../src/workspace/text.types.ts"],"names":[],"mappings":"AAEA,uBAAuB;AAEvB,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,eAAe,EAAE;QACb,KAAK,EAAE,EAAE;KACZ;CACJ,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { BaseWidget, WidgetFrame, WidgetFrameCalculated } from './widgets.types.js';
2
+ declare const widgetUtil: {
3
+ buildFrame(frame?: Partial<WidgetFrame>, parent?: BaseWidget | null): Partial<WidgetFrameCalculated>;
4
+ };
5
+ export default widgetUtil;
@@ -0,0 +1,20 @@
1
+ const widgetUtil = {
2
+ buildFrame(frame, parent) {
3
+ let { left, top, height, width } = frame || {};
4
+ if (typeof width === 'string') {
5
+ if (!parent) {
6
+ throw new Error('I can only calculate percentage sizes if a parent is passed.');
7
+ }
8
+ width = parent.getFrame().width * (parseInt(width, 10) / 100);
9
+ }
10
+ if (typeof height === 'string') {
11
+ if (!parent) {
12
+ throw new Error('I can only calculate percentage sizes if a parent is passed.');
13
+ }
14
+ height = parent.getFrame().height * (parseInt(height, 10) / 100);
15
+ }
16
+ return { left, top, height, width };
17
+ },
18
+ };
19
+ export default widgetUtil;
20
+ //# sourceMappingURL=widget.utilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.utilities.js","sourceRoot":"","sources":["../../src/workspace/widget.utilities.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,GAAG;IACf,UAAU,CAAC,KAA4B,EAAE,MAA0B;QAC/D,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA;QAE9C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CACX,8DAA8D,CACjE,CAAA;YACL,CAAC;YAED,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAA;QACjE,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CACX,8DAA8D,CACjE,CAAA;YACL,CAAC;YAED,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAoC,CAAA;IACzE,CAAC;CACJ,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { EventEmitter } from 'events';
2
+ export interface EventSignatureMap {
3
+ [eventName: string]: {
4
+ emitPayloadSchema?: any;
5
+ };
6
+ }
7
+ export interface EventContract {
8
+ eventSignatures: EventSignatureMap;
9
+ }
10
+ export type MercuryEventEmitter<Contract extends EventContract = any> = EventEmitter & {
11
+ emit(eventName: keyof Contract['eventSignatures'] & string, payload?: any): any;
12
+ on(eventName: keyof Contract['eventSignatures'] & string, listener: (payload?: any) => void | Promise<void>): any;
13
+ };
14
+ export interface WidgetPadding {
15
+ top?: number;
16
+ left?: number;
17
+ bottom?: number;
18
+ right?: number;
19
+ }
20
+ export interface WidgetButton {
21
+ label: string;
22
+ onClick?: (cb: () => void) => void;
23
+ }
24
+ export interface BaseWidget<Contract extends EventContract = any> extends MercuryEventEmitter<Contract> {
25
+ type: string;
26
+ getId(): string | null;
27
+ getFrame(): WidgetFrameCalculated;
28
+ setFrame(frame: Partial<WidgetFrame>): void;
29
+ getParent(): BaseWidget | null;
30
+ destroy(): Promise<void>;
31
+ getChildById(id?: string): BaseWidget | null;
32
+ getChildren(): BaseWidget[];
33
+ addChild(child: BaseWidget): void;
34
+ removeChild(child: BaseWidget): void;
35
+ }
36
+ export type Color = 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray' | 'brightRed' | 'brightGreen' | 'brightYellow' | 'brightBlue' | 'brightMagenta' | 'brightCyan' | 'brightWhite';
37
+ export interface UniversalWidgetOptions {
38
+ id?: string;
39
+ width?: WidgetFrameAttribute;
40
+ height?: WidgetFrameAttribute;
41
+ left?: WidgetFrameAttribute;
42
+ top?: WidgetFrameAttribute;
43
+ parent?: BaseWidget;
44
+ padding?: WidgetPadding;
45
+ shouldLockWidthWithParent?: boolean;
46
+ shouldLockHeightWithParent?: boolean;
47
+ shouldLockRightWithParent?: boolean;
48
+ shouldLockBottomWithParent?: boolean;
49
+ eventContract?: EventContract;
50
+ backgroundColor?: Color;
51
+ foregroundColor?: Color;
52
+ focusable?: boolean;
53
+ }
54
+ export interface WidgetFrame {
55
+ left: WidgetFrameAttribute;
56
+ top: WidgetFrameAttribute;
57
+ width: WidgetFrameAttribute;
58
+ height: WidgetFrameAttribute;
59
+ }
60
+ export interface WidgetFrameCalculated {
61
+ left: number;
62
+ top: number;
63
+ width: number;
64
+ height: number;
65
+ }
66
+ export type WidgetFrameAttribute = number | string;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=widgets.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.types.js","sourceRoot":"","sources":["../../src/workspace/widgets.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { BaseWidget } from './widgets.types.js';
2
+ export declare const windowEventContract: {
3
+ eventSignatures: {
4
+ key: {};
5
+ kill: {};
6
+ resize: {};
7
+ };
8
+ };
9
+ export type WindowEventContract = typeof windowEventContract;
10
+ export interface WindowWidgetOptions {
11
+ }
12
+ export interface WindowWidget extends BaseWidget<WindowEventContract> {
13
+ readonly type: 'window';
14
+ hideCursor: () => void;
15
+ showCursor: () => void;
16
+ setTitle: (title: string) => void;
17
+ getFocusedWidget(): BaseWidget | null;
18
+ }
@@ -0,0 +1,9 @@
1
+ // ** Window Widget ** //
2
+ export const windowEventContract = {
3
+ eventSignatures: {
4
+ key: {},
5
+ kill: {},
6
+ resize: {},
7
+ },
8
+ };
9
+ //# sourceMappingURL=window.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.types.js","sourceRoot":"","sources":["../../src/workspace/window.types.ts"],"names":[],"mappings":"AAEA,yBAAyB;AACzB,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,eAAe,EAAE;QACb,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;KACb;CACJ,CAAA"}
@@ -0,0 +1,3 @@
1
+ import eslintConfigNdx from '@neurodevs/eslint-config-ndx'
2
+
3
+ export default eslintConfigNdx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurodevs/node-tdd",
3
- "version": "0.2.5",
3
+ "version": "1.0.0",
4
4
  "description": "A Node.js framework for test-driven development (TDD)",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -9,7 +9,7 @@
9
9
  "tdd"
10
10
  ],
11
11
  "license": "MIT",
12
- "author": "Eric Yates <hello@ericthecurious.com>",
12
+ "author": "Eric Yates <hello@ericyates.me>",
13
13
  "homepage": "https://github.com/neurodevs/node-tdd",
14
14
  "repository": {
15
15
  "type": "git",
@@ -20,10 +20,9 @@
20
20
  },
21
21
  "main": "build/index.js",
22
22
  "scripts": {
23
- "build.ci": "yarn run build.tsc && yarn run build.resolve-paths && yarn run lint",
24
- "build.dev": "yarn run build.tsc --sourceMap ; yarn run resolve-paths.lint",
23
+ "build.ci": "yarn run build.tsc && yarn run lint",
24
+ "build.dev": "yarn run build.tsc --sourceMap ; yarn run fix.lint ; prettier --write .",
25
25
  "build.copy-files": "mkdir -p build && rsync -avzq --exclude='*.ts' ./src/ ./build/",
26
- "build.resolve-paths": "resolve-path-aliases --target build --patterns '**/*.js,**/*.d.ts'",
27
26
  "build.tsc": "yarn run build.copy-files && tsc",
28
27
  "clean": "yarn run clean.build",
29
28
  "clean.all": "yarn run clean.dependencies && yarn run clean.build",
@@ -31,54 +30,48 @@
31
30
  "clean.dependencies": "rm -rf node_modules/ package-lock.json yarn.lock",
32
31
  "fix.lint": "eslint --fix --cache '**/*.ts'",
33
32
  "lint": "eslint --cache '**/*.ts'",
34
- "lint.tsc": "tsc -p . --noEmit",
35
- "post.watch.build": "yarn run build.copy-files && yarn run build.resolve-paths",
36
33
  "rebuild": "yarn run clean.all && yarn install && yarn run build.dev",
37
34
  "update.dependencies": "yarn run clean.dependencies && yarn",
38
- "resolve-paths.lint": "yarn run build.resolve-paths ; yarn run lint",
39
- "test": "jest",
40
- "watch.build.dev": "tsc-watch --sourceMap --onCompilationComplete 'yarn run post.watch.build'",
41
- "watch.rebuild": "yarn run clean.all && yarn install && yarn run watch.build.dev",
42
- "watch.tsc": "tsc -w"
35
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest",
36
+ "watch.build.dev": "tsc-watch --sourceMap --onCompilationComplete 'yarn run build.copy-files'"
43
37
  },
44
38
  "dependencies": {
45
- "@neurodevs/generate-id": "1.1.2",
46
- "@sprucelabs/jest-json-reporter": "^9.0.71",
47
- "@sprucelabs/resolve-path-aliases": "^3.0.29",
48
- "@sprucelabs/test": "^10.0.25",
49
- "@sprucelabs/test-utils": "^6.0.117"
39
+ "@neurodevs/generate-id": "^1.1.2",
40
+ "chokidar": "^5.0.0",
41
+ "deep-equal": "^2.2.3",
42
+ "lodash-es": "^4.18.1",
43
+ "terminal-kit": "sprucelabsai/terminal-kit"
50
44
  },
51
45
  "devDependencies": {
52
- "@types/node": "^24.9.1",
53
- "chokidar-cli": "^3.0.0",
54
- "eslint": "^9.38.0",
55
- "eslint-config-spruce": "^11.2.26",
46
+ "@neurodevs/eslint-config-ndx": "^1.0.1",
47
+ "@neurodevs/node-tdd": "^0.2.5",
48
+ "@neurodevs/prettier-config-ndx": "^1.0.2",
49
+ "@types/deep-equal": "^1.0.4",
50
+ "@types/jest": "^30.0.0",
51
+ "@types/lodash-es": "^4.17.12",
52
+ "@types/node": "^25.8.0",
56
53
  "jest": "^30.2.0",
57
54
  "jest-circus": "^30.2.0",
58
- "prettier": "^3.6.2",
59
- "ts-node": "^10.9.2",
55
+ "prettier": "^3.8.1",
60
56
  "tsc-watch": "^7.2.0",
61
57
  "typescript": "^5.9.3"
62
58
  },
63
- "skill": {
64
- "namespace": "node-tdd"
65
- },
66
59
  "jest": {
67
60
  "testRunner": "jest-circus/runner",
68
61
  "maxWorkers": 4,
69
- "testTimeout": 120000,
62
+ "testTimeout": 5000,
70
63
  "testEnvironment": "node",
71
- "testPathIgnorePatterns": [
72
- "<rootDir>/tmp/",
73
- "<rootDir>/src/",
74
- "<rootDir>/node_modules/",
75
- "<rootDir>/build/__tests__/testDirsAndFiles/"
76
- ],
77
- "testMatch": [
78
- "**/__tests__/**/*.test.js?(x)"
64
+ "roots": [
65
+ "<rootDir>/build"
79
66
  ],
80
67
  "moduleNameMapper": {
81
- "^#spruce/(.*)$": "<rootDir>/build/.spruce/$1"
82
- }
68
+ "^terminal-kit$": "<rootDir>/build/__tests__/mock-terminal-kit.js"
69
+ },
70
+ "setupFiles": [
71
+ "<rootDir>/build/__tests__/support/jest.setup.js"
72
+ ],
73
+ "testMatch": [
74
+ "<rootDir>/build/__tests__/**/*.test.js?(x)"
75
+ ]
83
76
  }
84
77
  }
@@ -0,0 +1,3 @@
1
+ import prettierConfigNdx from '@neurodevs/prettier-config-ndx'
2
+
3
+ export default prettierConfigNdx
@@ -1,11 +1,4 @@
1
1
  {
2
- "scriptUpdater": {
3
- "skipped": []
4
- },
5
- "skipped": [
6
- "skill"
7
- ],
8
- "installed": [
9
- "test"
10
- ]
11
- }
2
+ "skipped": ["skill"],
3
+ "installed": ["test"]
4
+ }