@matter/tools 0.11.0-alpha.0-20241005-e3e4e4a7a

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 (414) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +100 -0
  3. package/bin/build.js +10 -0
  4. package/bin/prepare-chip.js +5 -0
  5. package/bin/run.js +7 -0
  6. package/bin/test.js +7 -0
  7. package/bin/version.js +7 -0
  8. package/chip/Dockerfile +23 -0
  9. package/dist/cjs/building/builder.d.ts +35 -0
  10. package/dist/cjs/building/builder.d.ts.map +1 -0
  11. package/dist/cjs/building/builder.js +210 -0
  12. package/dist/cjs/building/builder.js.map +6 -0
  13. package/dist/cjs/building/cli.d.ts +7 -0
  14. package/dist/cjs/building/cli.d.ts.map +1 -0
  15. package/dist/cjs/building/cli.js +100 -0
  16. package/dist/cjs/building/cli.js.map +6 -0
  17. package/dist/cjs/building/error.d.ts +16 -0
  18. package/dist/cjs/building/error.d.ts.map +1 -0
  19. package/dist/cjs/building/error.js +50 -0
  20. package/dist/cjs/building/error.js.map +6 -0
  21. package/dist/cjs/building/graph.d.ts +37 -0
  22. package/dist/cjs/building/graph.d.ts.map +1 -0
  23. package/dist/cjs/building/graph.js +222 -0
  24. package/dist/cjs/building/graph.js.map +6 -0
  25. package/dist/cjs/building/project.d.ts +56 -0
  26. package/dist/cjs/building/project.d.ts.map +1 -0
  27. package/dist/cjs/building/project.js +239 -0
  28. package/dist/cjs/building/project.js.map +6 -0
  29. package/dist/cjs/building/tsconfig.d.ts +16 -0
  30. package/dist/cjs/building/tsconfig.d.ts.map +1 -0
  31. package/dist/cjs/building/tsconfig.js +70 -0
  32. package/dist/cjs/building/tsconfig.js.map +6 -0
  33. package/dist/cjs/building/typescript/context.d.ts +16 -0
  34. package/dist/cjs/building/typescript/context.d.ts.map +1 -0
  35. package/dist/cjs/building/typescript/context.js +82 -0
  36. package/dist/cjs/building/typescript/context.js.map +6 -0
  37. package/dist/cjs/building/typescript/incremental-compiler.d.ts +10 -0
  38. package/dist/cjs/building/typescript/incremental-compiler.d.ts.map +1 -0
  39. package/dist/cjs/building/typescript/incremental-compiler.js +119 -0
  40. package/dist/cjs/building/typescript/incremental-compiler.js.map +6 -0
  41. package/dist/cjs/building/typescript/language-service.d.ts +13 -0
  42. package/dist/cjs/building/typescript/language-service.d.ts.map +1 -0
  43. package/dist/cjs/building/typescript/language-service.js +109 -0
  44. package/dist/cjs/building/typescript/language-service.js.map +6 -0
  45. package/dist/cjs/building/typescript/solution-builder.d.ts +10 -0
  46. package/dist/cjs/building/typescript/solution-builder.d.ts.map +1 -0
  47. package/dist/cjs/building/typescript/solution-builder.js +72 -0
  48. package/dist/cjs/building/typescript/solution-builder.js.map +6 -0
  49. package/dist/cjs/building/typescript.d.ts +13 -0
  50. package/dist/cjs/building/typescript.d.ts.map +1 -0
  51. package/dist/cjs/building/typescript.js +31 -0
  52. package/dist/cjs/building/typescript.js.map +6 -0
  53. package/dist/cjs/index.d.ts +15 -0
  54. package/dist/cjs/index.d.ts.map +1 -0
  55. package/dist/cjs/index.js +32 -0
  56. package/dist/cjs/index.js.map +6 -0
  57. package/dist/cjs/package.json +3 -0
  58. package/dist/cjs/running/cli.d.ts +19 -0
  59. package/dist/cjs/running/cli.d.ts.map +1 -0
  60. package/dist/cjs/running/cli.js +82 -0
  61. package/dist/cjs/running/cli.js.map +6 -0
  62. package/dist/cjs/running/execute.d.ts +8 -0
  63. package/dist/cjs/running/execute.d.ts.map +1 -0
  64. package/dist/cjs/running/execute.js +82 -0
  65. package/dist/cjs/running/execute.js.map +6 -0
  66. package/dist/cjs/testing/chip/pics-file.d.ts +20 -0
  67. package/dist/cjs/testing/chip/pics-file.d.ts.map +1 -0
  68. package/dist/cjs/testing/chip/pics-file.js +79 -0
  69. package/dist/cjs/testing/chip/pics-file.js.map +6 -0
  70. package/dist/cjs/testing/chip.d.ts +60 -0
  71. package/dist/cjs/testing/chip.d.ts.map +1 -0
  72. package/dist/cjs/testing/chip.js +306 -0
  73. package/dist/cjs/testing/chip.js.map +6 -0
  74. package/dist/cjs/testing/cli.d.ts +9 -0
  75. package/dist/cjs/testing/cli.d.ts.map +1 -0
  76. package/dist/cjs/testing/cli.js +117 -0
  77. package/dist/cjs/testing/cli.js.map +6 -0
  78. package/dist/cjs/testing/failure-detail.d.ts +19 -0
  79. package/dist/cjs/testing/failure-detail.d.ts.map +1 -0
  80. package/dist/cjs/testing/failure-detail.js +143 -0
  81. package/dist/cjs/testing/failure-detail.js.map +6 -0
  82. package/dist/cjs/testing/files.d.ts +8 -0
  83. package/dist/cjs/testing/files.d.ts.map +1 -0
  84. package/dist/cjs/testing/files.js +52 -0
  85. package/dist/cjs/testing/files.js.map +6 -0
  86. package/dist/cjs/testing/global-declarations.d.ts +38 -0
  87. package/dist/cjs/testing/global-declarations.d.ts.map +1 -0
  88. package/dist/cjs/testing/global-declarations.js +8 -0
  89. package/dist/cjs/testing/global-declarations.js.map +6 -0
  90. package/dist/cjs/testing/global-definitions.d.ts +7 -0
  91. package/dist/cjs/testing/global-definitions.d.ts.map +1 -0
  92. package/dist/cjs/testing/global-definitions.js +50 -0
  93. package/dist/cjs/testing/global-definitions.js.map +6 -0
  94. package/dist/cjs/testing/mocha.d.ts +36 -0
  95. package/dist/cjs/testing/mocha.d.ts.map +1 -0
  96. package/dist/cjs/testing/mocha.js +155 -0
  97. package/dist/cjs/testing/mocha.js.map +6 -0
  98. package/dist/cjs/testing/mocharc.cjs +68 -0
  99. package/dist/cjs/testing/mocharc.d.cts +7 -0
  100. package/dist/cjs/testing/mocks/crypto.d.ts +7 -0
  101. package/dist/cjs/testing/mocks/crypto.d.ts.map +1 -0
  102. package/dist/cjs/testing/mocks/crypto.js +79 -0
  103. package/dist/cjs/testing/mocks/crypto.js.map +6 -0
  104. package/dist/cjs/testing/mocks/environment.d.ts +7 -0
  105. package/dist/cjs/testing/mocks/environment.d.ts.map +1 -0
  106. package/dist/cjs/testing/mocks/environment.js +7 -0
  107. package/dist/cjs/testing/mocks/environment.js.map +6 -0
  108. package/dist/cjs/testing/mocks/index.d.ts +10 -0
  109. package/dist/cjs/testing/mocks/index.d.ts.map +1 -0
  110. package/dist/cjs/testing/mocks/index.js +27 -0
  111. package/dist/cjs/testing/mocks/index.js.map +6 -0
  112. package/dist/cjs/testing/mocks/logging.d.ts +28 -0
  113. package/dist/cjs/testing/mocks/logging.d.ts.map +1 -0
  114. package/dist/cjs/testing/mocks/logging.js +93 -0
  115. package/dist/cjs/testing/mocks/logging.js.map +6 -0
  116. package/dist/cjs/testing/mocks/time.d.ts +88 -0
  117. package/dist/cjs/testing/mocks/time.d.ts.map +1 -0
  118. package/dist/cjs/testing/mocks/time.js +250 -0
  119. package/dist/cjs/testing/mocks/time.js.map +6 -0
  120. package/dist/cjs/testing/node.d.ts +16 -0
  121. package/dist/cjs/testing/node.d.ts.map +1 -0
  122. package/dist/cjs/testing/node.js +108 -0
  123. package/dist/cjs/testing/node.js.map +6 -0
  124. package/dist/cjs/testing/options.d.ts +19 -0
  125. package/dist/cjs/testing/options.d.ts.map +1 -0
  126. package/dist/cjs/testing/options.js +62 -0
  127. package/dist/cjs/testing/options.js.map +6 -0
  128. package/dist/cjs/testing/reporter.d.ts +50 -0
  129. package/dist/cjs/testing/reporter.d.ts.map +1 -0
  130. package/dist/cjs/testing/reporter.js +137 -0
  131. package/dist/cjs/testing/reporter.js.map +6 -0
  132. package/dist/cjs/testing/runner.d.ts +22 -0
  133. package/dist/cjs/testing/runner.d.ts.map +1 -0
  134. package/dist/cjs/testing/runner.js +116 -0
  135. package/dist/cjs/testing/runner.js.map +6 -0
  136. package/dist/cjs/testing/web.d.ts +8 -0
  137. package/dist/cjs/testing/web.d.ts.map +1 -0
  138. package/dist/cjs/testing/web.js +165 -0
  139. package/dist/cjs/testing/web.js.map +6 -0
  140. package/dist/cjs/util/bootstrap.mjs +105 -0
  141. package/dist/cjs/util/docker.d.ts +27 -0
  142. package/dist/cjs/util/docker.d.ts.map +1 -0
  143. package/dist/cjs/util/docker.js +163 -0
  144. package/dist/cjs/util/docker.js.map +6 -0
  145. package/dist/cjs/util/errors.d.ts +8 -0
  146. package/dist/cjs/util/errors.d.ts.map +1 -0
  147. package/dist/cjs/util/errors.js +55 -0
  148. package/dist/cjs/util/errors.js.map +6 -0
  149. package/dist/cjs/util/index.d.ts +8 -0
  150. package/dist/cjs/util/index.d.ts.map +1 -0
  151. package/dist/cjs/util/index.js +25 -0
  152. package/dist/cjs/util/index.js.map +6 -0
  153. package/dist/cjs/util/node-shims.d.ts +7 -0
  154. package/dist/cjs/util/node-shims.d.ts.map +1 -0
  155. package/dist/cjs/util/node-shims.js +12 -0
  156. package/dist/cjs/util/node-shims.js.map +6 -0
  157. package/dist/cjs/util/package.d.ts +61 -0
  158. package/dist/cjs/util/package.d.ts.map +1 -0
  159. package/dist/cjs/util/package.js +324 -0
  160. package/dist/cjs/util/package.js.map +6 -0
  161. package/dist/cjs/util/progress.d.ts +31 -0
  162. package/dist/cjs/util/progress.d.ts.map +1 -0
  163. package/dist/cjs/util/progress.js +232 -0
  164. package/dist/cjs/util/progress.js.map +6 -0
  165. package/dist/cjs/util/tools-path.cjs +13 -0
  166. package/dist/cjs/util/tools-path.d.cts +7 -0
  167. package/dist/cjs/util/trace-unhandled.d.ts +9 -0
  168. package/dist/cjs/util/trace-unhandled.d.ts.map +1 -0
  169. package/dist/cjs/util/trace-unhandled.js +48 -0
  170. package/dist/cjs/util/trace-unhandled.js.map +6 -0
  171. package/dist/cjs/util/wtf.d.ts +10 -0
  172. package/dist/cjs/util/wtf.d.ts.map +1 -0
  173. package/dist/cjs/util/wtf.js +53 -0
  174. package/dist/cjs/util/wtf.js.map +6 -0
  175. package/dist/cjs/versioning/cli.d.ts +7 -0
  176. package/dist/cjs/versioning/cli.d.ts.map +1 -0
  177. package/dist/cjs/versioning/cli.js +62 -0
  178. package/dist/cjs/versioning/cli.js.map +6 -0
  179. package/dist/cjs/versioning/versioner.d.ts +18 -0
  180. package/dist/cjs/versioning/versioner.d.ts.map +1 -0
  181. package/dist/cjs/versioning/versioner.js +145 -0
  182. package/dist/cjs/versioning/versioner.js.map +6 -0
  183. package/dist/esm/building/builder.d.ts +35 -0
  184. package/dist/esm/building/builder.d.ts.map +1 -0
  185. package/dist/esm/building/builder.js +180 -0
  186. package/dist/esm/building/builder.js.map +6 -0
  187. package/dist/esm/building/cli.d.ts +7 -0
  188. package/dist/esm/building/cli.d.ts.map +1 -0
  189. package/dist/esm/building/cli.js +70 -0
  190. package/dist/esm/building/cli.js.map +6 -0
  191. package/dist/esm/building/error.d.ts +16 -0
  192. package/dist/esm/building/error.d.ts.map +1 -0
  193. package/dist/esm/building/error.js +30 -0
  194. package/dist/esm/building/error.js.map +6 -0
  195. package/dist/esm/building/graph.d.ts +37 -0
  196. package/dist/esm/building/graph.d.ts.map +1 -0
  197. package/dist/esm/building/graph.js +192 -0
  198. package/dist/esm/building/graph.js.map +6 -0
  199. package/dist/esm/building/project.d.ts +56 -0
  200. package/dist/esm/building/project.d.ts.map +1 -0
  201. package/dist/esm/building/project.js +219 -0
  202. package/dist/esm/building/project.js.map +6 -0
  203. package/dist/esm/building/tsconfig.d.ts +16 -0
  204. package/dist/esm/building/tsconfig.d.ts.map +1 -0
  205. package/dist/esm/building/tsconfig.js +50 -0
  206. package/dist/esm/building/tsconfig.js.map +6 -0
  207. package/dist/esm/building/typescript/context.d.ts +16 -0
  208. package/dist/esm/building/typescript/context.d.ts.map +1 -0
  209. package/dist/esm/building/typescript/context.js +68 -0
  210. package/dist/esm/building/typescript/context.js.map +6 -0
  211. package/dist/esm/building/typescript/incremental-compiler.d.ts +10 -0
  212. package/dist/esm/building/typescript/incremental-compiler.d.ts.map +1 -0
  213. package/dist/esm/building/typescript/incremental-compiler.js +99 -0
  214. package/dist/esm/building/typescript/incremental-compiler.js.map +6 -0
  215. package/dist/esm/building/typescript/language-service.d.ts +13 -0
  216. package/dist/esm/building/typescript/language-service.d.ts.map +1 -0
  217. package/dist/esm/building/typescript/language-service.js +99 -0
  218. package/dist/esm/building/typescript/language-service.js.map +6 -0
  219. package/dist/esm/building/typescript/solution-builder.d.ts +10 -0
  220. package/dist/esm/building/typescript/solution-builder.d.ts.map +1 -0
  221. package/dist/esm/building/typescript/solution-builder.js +52 -0
  222. package/dist/esm/building/typescript/solution-builder.js.map +6 -0
  223. package/dist/esm/building/typescript.d.ts +13 -0
  224. package/dist/esm/building/typescript.d.ts.map +1 -0
  225. package/dist/esm/building/typescript.js +11 -0
  226. package/dist/esm/building/typescript.js.map +6 -0
  227. package/dist/esm/index.d.ts +15 -0
  228. package/dist/esm/index.d.ts.map +1 -0
  229. package/dist/esm/index.js +15 -0
  230. package/dist/esm/index.js.map +6 -0
  231. package/dist/esm/package.json +3 -0
  232. package/dist/esm/running/cli.d.ts +19 -0
  233. package/dist/esm/running/cli.d.ts.map +1 -0
  234. package/dist/esm/running/cli.js +62 -0
  235. package/dist/esm/running/cli.js.map +6 -0
  236. package/dist/esm/running/execute.d.ts +8 -0
  237. package/dist/esm/running/execute.d.ts.map +1 -0
  238. package/dist/esm/running/execute.js +52 -0
  239. package/dist/esm/running/execute.js.map +6 -0
  240. package/dist/esm/testing/chip/pics-file.d.ts +20 -0
  241. package/dist/esm/testing/chip/pics-file.d.ts.map +1 -0
  242. package/dist/esm/testing/chip/pics-file.js +59 -0
  243. package/dist/esm/testing/chip/pics-file.js.map +6 -0
  244. package/dist/esm/testing/chip.d.ts +60 -0
  245. package/dist/esm/testing/chip.d.ts.map +1 -0
  246. package/dist/esm/testing/chip.js +286 -0
  247. package/dist/esm/testing/chip.js.map +6 -0
  248. package/dist/esm/testing/cli.d.ts +9 -0
  249. package/dist/esm/testing/cli.d.ts.map +1 -0
  250. package/dist/esm/testing/cli.js +87 -0
  251. package/dist/esm/testing/cli.js.map +6 -0
  252. package/dist/esm/testing/failure-detail.d.ts +19 -0
  253. package/dist/esm/testing/failure-detail.d.ts.map +1 -0
  254. package/dist/esm/testing/failure-detail.js +113 -0
  255. package/dist/esm/testing/failure-detail.js.map +6 -0
  256. package/dist/esm/testing/files.d.ts +8 -0
  257. package/dist/esm/testing/files.d.ts.map +1 -0
  258. package/dist/esm/testing/files.js +32 -0
  259. package/dist/esm/testing/files.js.map +6 -0
  260. package/dist/esm/testing/global-declarations.d.ts +38 -0
  261. package/dist/esm/testing/global-declarations.d.ts.map +1 -0
  262. package/dist/esm/testing/global-declarations.js +7 -0
  263. package/dist/esm/testing/global-declarations.js.map +6 -0
  264. package/dist/esm/testing/global-definitions.d.ts +7 -0
  265. package/dist/esm/testing/global-definitions.d.ts.map +1 -0
  266. package/dist/esm/testing/global-definitions.js +27 -0
  267. package/dist/esm/testing/global-definitions.js.map +6 -0
  268. package/dist/esm/testing/mocha.d.ts +36 -0
  269. package/dist/esm/testing/mocha.d.ts.map +1 -0
  270. package/dist/esm/testing/mocha.js +135 -0
  271. package/dist/esm/testing/mocha.js.map +6 -0
  272. package/dist/esm/testing/mocharc.cjs +68 -0
  273. package/dist/esm/testing/mocharc.d.cts +7 -0
  274. package/dist/esm/testing/mocks/crypto.d.ts +7 -0
  275. package/dist/esm/testing/mocks/crypto.d.ts.map +1 -0
  276. package/dist/esm/testing/mocks/crypto.js +59 -0
  277. package/dist/esm/testing/mocks/crypto.js.map +6 -0
  278. package/dist/esm/testing/mocks/environment.d.ts +7 -0
  279. package/dist/esm/testing/mocks/environment.d.ts.map +1 -0
  280. package/dist/esm/testing/mocks/environment.js +6 -0
  281. package/dist/esm/testing/mocks/environment.js.map +6 -0
  282. package/dist/esm/testing/mocks/index.d.ts +10 -0
  283. package/dist/esm/testing/mocks/index.d.ts.map +1 -0
  284. package/dist/esm/testing/mocks/index.js +10 -0
  285. package/dist/esm/testing/mocks/index.js.map +6 -0
  286. package/dist/esm/testing/mocks/logging.d.ts +28 -0
  287. package/dist/esm/testing/mocks/logging.d.ts.map +1 -0
  288. package/dist/esm/testing/mocks/logging.js +63 -0
  289. package/dist/esm/testing/mocks/logging.js.map +6 -0
  290. package/dist/esm/testing/mocks/time.d.ts +88 -0
  291. package/dist/esm/testing/mocks/time.d.ts.map +1 -0
  292. package/dist/esm/testing/mocks/time.js +230 -0
  293. package/dist/esm/testing/mocks/time.js.map +6 -0
  294. package/dist/esm/testing/node.d.ts +16 -0
  295. package/dist/esm/testing/node.d.ts.map +1 -0
  296. package/dist/esm/testing/node.js +78 -0
  297. package/dist/esm/testing/node.js.map +6 -0
  298. package/dist/esm/testing/options.d.ts +19 -0
  299. package/dist/esm/testing/options.d.ts.map +1 -0
  300. package/dist/esm/testing/options.js +42 -0
  301. package/dist/esm/testing/options.js.map +6 -0
  302. package/dist/esm/testing/reporter.d.ts +50 -0
  303. package/dist/esm/testing/reporter.d.ts.map +1 -0
  304. package/dist/esm/testing/reporter.js +107 -0
  305. package/dist/esm/testing/reporter.js.map +6 -0
  306. package/dist/esm/testing/runner.d.ts +22 -0
  307. package/dist/esm/testing/runner.d.ts.map +1 -0
  308. package/dist/esm/testing/runner.js +86 -0
  309. package/dist/esm/testing/runner.js.map +6 -0
  310. package/dist/esm/testing/web.d.ts +8 -0
  311. package/dist/esm/testing/web.d.ts.map +1 -0
  312. package/dist/esm/testing/web.js +135 -0
  313. package/dist/esm/testing/web.js.map +6 -0
  314. package/dist/esm/util/bootstrap.mjs +105 -0
  315. package/dist/esm/util/docker.d.ts +27 -0
  316. package/dist/esm/util/docker.d.ts.map +1 -0
  317. package/dist/esm/util/docker.js +133 -0
  318. package/dist/esm/util/docker.js.map +6 -0
  319. package/dist/esm/util/errors.d.ts +8 -0
  320. package/dist/esm/util/errors.d.ts.map +1 -0
  321. package/dist/esm/util/errors.js +35 -0
  322. package/dist/esm/util/errors.js.map +6 -0
  323. package/dist/esm/util/index.d.ts +8 -0
  324. package/dist/esm/util/index.d.ts.map +1 -0
  325. package/dist/esm/util/index.js +8 -0
  326. package/dist/esm/util/index.js.map +6 -0
  327. package/dist/esm/util/node-shims.d.ts +7 -0
  328. package/dist/esm/util/node-shims.d.ts.map +1 -0
  329. package/dist/esm/util/node-shims.js +11 -0
  330. package/dist/esm/util/node-shims.js.map +6 -0
  331. package/dist/esm/util/package.d.ts +61 -0
  332. package/dist/esm/util/package.d.ts.map +1 -0
  333. package/dist/esm/util/package.js +304 -0
  334. package/dist/esm/util/package.js.map +6 -0
  335. package/dist/esm/util/progress.d.ts +31 -0
  336. package/dist/esm/util/progress.d.ts.map +1 -0
  337. package/dist/esm/util/progress.js +202 -0
  338. package/dist/esm/util/progress.js.map +6 -0
  339. package/dist/esm/util/tools-path.cjs +13 -0
  340. package/dist/esm/util/tools-path.d.cts +7 -0
  341. package/dist/esm/util/trace-unhandled.d.ts +9 -0
  342. package/dist/esm/util/trace-unhandled.d.ts.map +1 -0
  343. package/dist/esm/util/trace-unhandled.js +18 -0
  344. package/dist/esm/util/trace-unhandled.js.map +6 -0
  345. package/dist/esm/util/wtf.d.ts +10 -0
  346. package/dist/esm/util/wtf.d.ts.map +1 -0
  347. package/dist/esm/util/wtf.js +23 -0
  348. package/dist/esm/util/wtf.js.map +6 -0
  349. package/dist/esm/versioning/cli.d.ts +7 -0
  350. package/dist/esm/versioning/cli.d.ts.map +1 -0
  351. package/dist/esm/versioning/cli.js +32 -0
  352. package/dist/esm/versioning/cli.js.map +6 -0
  353. package/dist/esm/versioning/versioner.d.ts +18 -0
  354. package/dist/esm/versioning/versioner.d.ts.map +1 -0
  355. package/dist/esm/versioning/versioner.js +115 -0
  356. package/dist/esm/versioning/versioner.js.map +6 -0
  357. package/package.json +82 -0
  358. package/src/building/builder.ts +216 -0
  359. package/src/building/cli.ts +89 -0
  360. package/src/building/error.ts +29 -0
  361. package/src/building/graph.ts +251 -0
  362. package/src/building/project.ts +313 -0
  363. package/src/building/tsconfig.ts +69 -0
  364. package/src/building/typescript/context.ts +85 -0
  365. package/src/building/typescript/incremental-compiler.ts +126 -0
  366. package/src/building/typescript/language-service.ts +132 -0
  367. package/src/building/typescript/solution-builder.ts +67 -0
  368. package/src/building/typescript.ts +15 -0
  369. package/src/index.ts +15 -0
  370. package/src/running/cli.ts +95 -0
  371. package/src/running/execute.ts +63 -0
  372. package/src/testing/chip/pics-file.ts +71 -0
  373. package/src/testing/chip/pics.properties +53 -0
  374. package/src/testing/chip.ts +420 -0
  375. package/src/testing/cli.ts +122 -0
  376. package/src/testing/failure-detail.ts +126 -0
  377. package/src/testing/files.ts +35 -0
  378. package/src/testing/global-declarations.ts +50 -0
  379. package/src/testing/global-definitions.ts +35 -0
  380. package/src/testing/index.html +16 -0
  381. package/src/testing/mocha.ts +162 -0
  382. package/src/testing/mocharc.cjs +68 -0
  383. package/src/testing/mocharc.d.cts +7 -0
  384. package/src/testing/mocks/crypto.ts +70 -0
  385. package/src/testing/mocks/environment.ts +7 -0
  386. package/src/testing/mocks/index.ts +10 -0
  387. package/src/testing/mocks/logging.ts +99 -0
  388. package/src/testing/mocks/time.ts +294 -0
  389. package/src/testing/node.ts +114 -0
  390. package/src/testing/options.ts +58 -0
  391. package/src/testing/reporter.ts +144 -0
  392. package/src/testing/runner.ts +98 -0
  393. package/src/testing/web.ts +174 -0
  394. package/src/tsconfig.json +14 -0
  395. package/src/util/bootstrap.mjs +105 -0
  396. package/src/util/docker.ts +176 -0
  397. package/src/util/errors.ts +33 -0
  398. package/src/util/index.ts +8 -0
  399. package/src/util/node-shims.ts +13 -0
  400. package/src/util/package.ts +369 -0
  401. package/src/util/progress.ts +252 -0
  402. package/src/util/tools-path.cjs +13 -0
  403. package/src/util/tools-path.d.cts +7 -0
  404. package/src/util/trace-unhandled.ts +17 -0
  405. package/src/util/wtf.ts +25 -0
  406. package/src/versioning/cli.ts +43 -0
  407. package/src/versioning/versioner.ts +139 -0
  408. package/test/testing/mocks/MockTimeTest.ts +113 -0
  409. package/test/tsconfig.json +15 -0
  410. package/tsc/tsconfig.app.json +7 -0
  411. package/tsc/tsconfig.base.json +41 -0
  412. package/tsc/tsconfig.lib.json +12 -0
  413. package/tsc/tsconfig.test.json +7 -0
  414. package/tsconfig.json +5 -0
@@ -0,0 +1,294 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ type TimerCallback = () => any;
8
+
9
+ type MockTimeLike = typeof MockTime;
10
+ export interface MockTime extends MockTimeLike {}
11
+
12
+ // Must match matter.js Timer interface
13
+ class MockTimer {
14
+ name = "Test";
15
+ systemId = 0;
16
+ intervalMs = 0;
17
+ isPeriodic = false;
18
+
19
+ isRunning = false;
20
+ private readonly callback: TimerCallback;
21
+
22
+ constructor(
23
+ private readonly mockTime: MockTime,
24
+ private readonly durationMs: number,
25
+ callback: TimerCallback,
26
+ ) {
27
+ if (this instanceof MockInterval) {
28
+ this.callback = callback;
29
+ } else {
30
+ this.callback = () => {
31
+ this.isRunning = false;
32
+ callback();
33
+ };
34
+ }
35
+ }
36
+
37
+ start() {
38
+ this.mockTime.callbackAtTime(this.mockTime.nowMs() + this.durationMs, this.callback);
39
+ this.isRunning = true;
40
+ return this;
41
+ }
42
+
43
+ stop() {
44
+ this.mockTime.removeCallback(this.callback);
45
+ this.isRunning = false;
46
+ return this;
47
+ }
48
+ }
49
+
50
+ class MockInterval extends MockTimer {
51
+ constructor(mockTime: MockTime, durationMs: number, callback: TimerCallback) {
52
+ const intervalCallback = async () => {
53
+ mockTime.callbackAtTime(mockTime.nowMs() + durationMs, intervalCallback);
54
+ await callback();
55
+ };
56
+ super(mockTime, durationMs, intervalCallback);
57
+ }
58
+ }
59
+
60
+ type InterceptResult<T> =
61
+ T extends Promise<T>
62
+ ? { resolve: Awaited<T>; reject?: undefined } | { resolve?: undefined; reject: {} }
63
+ : { resolve: T; reject?: undefined } | { resolve?: void; reject: {} };
64
+
65
+ function isAsync(fn: (...args: any) => any): fn is (...args: any) => Promise<any> {
66
+ return fn.constructor.name === "AsyncFunction";
67
+ }
68
+
69
+ let callbacks = new Array<{ atMs: number; callback: TimerCallback }>();
70
+ let nowMs = 0;
71
+ let real = undefined as unknown;
72
+ let enabled = true;
73
+
74
+ // Must match matter.js Time interface
75
+ export const MockTime = {
76
+ get activeImplementation(): unknown {
77
+ return enabled ? this : (real ?? this);
78
+ },
79
+
80
+ disable() {
81
+ enabled = false;
82
+ reinstallTime?.();
83
+ },
84
+
85
+ enable() {
86
+ enabled = true;
87
+ reinstallTime?.();
88
+ },
89
+
90
+ reset(time = 0) {
91
+ callbacks = [];
92
+ nowMs = time;
93
+
94
+ // Ensure time reverts to correct implementation across suites
95
+ reinstallTime?.();
96
+ },
97
+
98
+ now(): Date {
99
+ return new Date(nowMs);
100
+ },
101
+
102
+ nowMs() {
103
+ return nowMs;
104
+ },
105
+
106
+ getTimer(_name: string, durationMs: number, callback: TimerCallback): MockTimer {
107
+ return new MockTimer(this, durationMs, callback);
108
+ },
109
+
110
+ getPeriodicTimer(_name: string, intervalMs: number, callback: TimerCallback): MockTimer {
111
+ return new MockInterval(this, intervalMs, callback);
112
+ },
113
+
114
+ /**
115
+ * Resolve a promise with time dependency.
116
+ *
117
+ * Moves time forward until the promise resolves.
118
+ */
119
+ async resolve<T>(promise: PromiseLike<T>) {
120
+ let resolved = false;
121
+ let result: T | undefined;
122
+ let error: any;
123
+
124
+ promise.then(
125
+ r => {
126
+ resolved = true;
127
+ result = r;
128
+ },
129
+ e => {
130
+ resolved = true;
131
+ error = e;
132
+ },
133
+ );
134
+
135
+ let timeAdvanced = 0;
136
+ while (!resolved) {
137
+ // Interestingly, a Time.yield() works in almost every case. However, on Node SubtleCrypto.deriveBits hangs
138
+ // if you only yield via microtask. It seems to require yielding via macrotask. So we use setTimeout here.
139
+ // Probably related to entropy collection but I think it's safe to classify as a Node bug. Tested on
140
+ // version 20.11.0
141
+ await new Promise<void>(resolve => setTimeout(() => resolve(), 0));
142
+
143
+ if (resolved) {
144
+ break;
145
+ }
146
+
147
+ // If we've advanced more than one hour, assume we've hung
148
+ if (timeAdvanced > 60 * 60 * 1000) {
149
+ throw new Error(
150
+ "Mock timeout: Promise did not resolve within one (virtual) hour, probably not going to happen",
151
+ );
152
+ }
153
+
154
+ // Advance time exponentially, trying for granularity but also OK performance. Note that we are not only
155
+ // advancing time but also yielding event loop. So it's possible if we run out of time it's just because
156
+ // there were too few yields in one virtual hour. As designed currently it's 360 macrotasks and 360
157
+ // microtasks (360 loops w/ 1 macro- and 1 micro-yield)
158
+ await this.advance(1000);
159
+ timeAdvanced += 1000;
160
+
161
+ if (resolved) {
162
+ break;
163
+ }
164
+
165
+ await this.yield();
166
+ }
167
+
168
+ if (error !== undefined) {
169
+ throw error;
170
+ }
171
+
172
+ return result as T;
173
+ },
174
+
175
+ /**
176
+ * Move time forward. Runs tasks scheduled during this interval.
177
+ */
178
+ async advance(ms: number) {
179
+ const newTimeMs = nowMs + ms;
180
+
181
+ while (true) {
182
+ if (callbacks.length === 0) break;
183
+ const { atMs, callback } = callbacks[0];
184
+ if (atMs > newTimeMs) break;
185
+ callbacks.shift();
186
+ nowMs = atMs;
187
+ await callback();
188
+ }
189
+
190
+ nowMs = newTimeMs;
191
+ },
192
+
193
+ /**
194
+ * Yield to scheduled microtasks. This means that all code paths waiting
195
+ * on resolved promises (including await) will proceed before this method
196
+ * returns.
197
+ */
198
+ async yield() {
199
+ await Promise.resolve();
200
+ },
201
+
202
+ /**
203
+ * Due to its implementation, an older version of yield() would actually
204
+ * yield to microtasks three times. Our tests then depended on this
205
+ * functionality -- one yield could trigger up to three nested awaits.
206
+ *
207
+ * To make this clear, the version of yield() that emulates old behavior
208
+ * is called "yield3".
209
+ */
210
+ async yield3() {
211
+ await Promise.resolve();
212
+ await Promise.resolve();
213
+ await Promise.resolve();
214
+ },
215
+
216
+ /**
217
+ * Hook a method and invoke a callback just before the method completes.
218
+ * Unhooks after completion.
219
+ *
220
+ * Handles both synchronous and asynchronous methods. The interceptor
221
+ * should match the async-ness of the intercepted method.
222
+ *
223
+ * The interceptor can optionally access and/or replace the resolve/reject
224
+ * value.
225
+ */
226
+ interceptOnce<NameT extends string, ReturnT, ObjT extends { [N in NameT]: (...args: any) => ReturnT }>(
227
+ obj: ObjT,
228
+ method: NameT,
229
+ interceptor: (
230
+ result: InterceptResult<ReturnT>,
231
+ ) => void | InterceptResult<ReturnT> | Promise<void> | Promise<InterceptResult<ReturnT>>,
232
+ ) {
233
+ const original = obj[method];
234
+ if (!original) {
235
+ throw new Error(`Interception method ${method} is not present`);
236
+ }
237
+ let result: InterceptResult<ReturnT>;
238
+ if (isAsync(interceptor)) {
239
+ obj[method] = async function (this: any, ...args: any): Promise<any> {
240
+ try {
241
+ // eslint-disable-next-line @typescript-eslint/await-thenable
242
+ const resolve = await original.apply(this, args);
243
+ result = { resolve } as any;
244
+ } catch (reject) {
245
+ result = { reject } as any;
246
+ } finally {
247
+ obj[method] = original;
248
+ }
249
+ result = (await interceptor(result)) ?? result;
250
+ if (result.reject) {
251
+ throw result.reject;
252
+ }
253
+ return result.resolve;
254
+ } as any;
255
+ } else {
256
+ obj[method] = function (this: any, ...args: any): any {
257
+ try {
258
+ const resolve = original.apply(this, args);
259
+ result = { resolve } as any;
260
+ } catch (reject) {
261
+ result = { reject } as any;
262
+ } finally {
263
+ obj[method] = original;
264
+ }
265
+ result = (interceptor(result) as any) ?? result;
266
+ if (result.reject) {
267
+ throw result.reject;
268
+ }
269
+ return result.resolve;
270
+ } as any;
271
+ }
272
+ },
273
+
274
+ callbackAtTime(atMs: number, callback: TimerCallback) {
275
+ callbacks.push({ atMs, callback });
276
+ callbacks.sort(({ atMs: atMsA }, { atMs: atMsB }) => atMsA - atMsB);
277
+ },
278
+
279
+ removeCallback(callbackToRemove: TimerCallback) {
280
+ const index = callbacks.findIndex(({ callback }) => callbackToRemove === callback);
281
+ if (index === -1) return;
282
+ callbacks.splice(index, 1);
283
+ },
284
+ };
285
+
286
+ let reinstallTime: undefined | (() => void);
287
+
288
+ export function timeSetup(Time: { get(): unknown }) {
289
+ real = Time.get();
290
+ reinstallTime = () => (Time.get = () => MockTime.activeImplementation);
291
+ reinstallTime();
292
+ }
293
+
294
+ Object.assign(globalThis, { MockTime });
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { mkdir, writeFile } from "fs/promises";
8
+ import Mocha from "mocha";
9
+ import { relative } from "path";
10
+ import { adaptReporter, generalSetup } from "./mocha.js";
11
+ import { TestOptions } from "./options.js";
12
+ import type { TestRunner } from "./runner.js";
13
+
14
+ // Load globals so settings get applied
15
+ import { FailureDetail } from "./failure-detail.js";
16
+ import "./global-definitions.js";
17
+
18
+ export async function testNode(runner: TestRunner, format: "cjs" | "esm") {
19
+ // Grr Mocha (as of 10.2.0) classifies certain unhandled rejections as "mocha". For others, it uninstalls its
20
+ // unhandled rejection handler and re-emits the "unhandledRejection" event. But since it already handled the event,
21
+ // Node knows nothing about this and the event disappears silently.
22
+ //
23
+ // So we must add our own unhandledRejection handler, but only process exceptions if Mocha's handler is not
24
+ // installed, because the code that Mocha uses to determine if an error is a "mocha" error is not exported.
25
+ process.on("unhandledRejection", e => {
26
+ if (process.listenerCount("unhandledRejection") === 1) {
27
+ const error = new Error("Unhandled rejection (ignored by mocha)");
28
+ error.cause = e;
29
+ runner.reporter.failRun(FailureDetail(error));
30
+ }
31
+ });
32
+
33
+ const mocha = new Mocha({
34
+ inlineDiffs: true,
35
+ reporter: adaptReporter(Mocha, format.toUpperCase(), runner.reporter),
36
+ });
37
+
38
+ generalSetup(mocha);
39
+
40
+ TestOptions.apply(mocha, runner.options);
41
+
42
+ const files = runner.loadFiles(format);
43
+ files.forEach(path => {
44
+ path = relative(process.cwd(), path);
45
+ if (path[0] !== ".") {
46
+ path = `./${path}`;
47
+ }
48
+ mocha.addFile(path);
49
+ });
50
+
51
+ await mocha.loadFilesAsync();
52
+
53
+ const profiler = new Profiler();
54
+ if (runner.options.profile) {
55
+ await profiler.start();
56
+ }
57
+
58
+ await new Promise<Mocha.Runner>(resolve => {
59
+ const runner = mocha.run(() => resolve(runner));
60
+ });
61
+
62
+ if (runner.options.profile) {
63
+ await profiler.stop(runner.pkg.resolve("build/profiles"));
64
+ }
65
+ }
66
+
67
+ // We use string concatenation to prevent TS from trying to find profiler library types. It doesn't build on all
68
+ // platforms we support and doesn't provide type declarations when it doesn't build
69
+ //
70
+ // This interface acts as a replacement for proper types
71
+ export interface Profilerish {
72
+ setGenerateType(value: number): void;
73
+ startProfiling(): void;
74
+ stopProfiling(): {
75
+ export(callback: (error: any, result: string) => any): void;
76
+ };
77
+ }
78
+
79
+ // v8-profiler-next doesn't manage switching node versions well. Load dynamically so it doesn't interfere if it's not
80
+ // built and we're not profiling
81
+ class Profiler {
82
+ #profiler?: Profilerish;
83
+
84
+ async start() {
85
+ this.#profiler = (await import("" + "v8-profiler-next")).default as Profilerish;
86
+ this.#profiler.setGenerateType(1);
87
+ this.#profiler.startProfiling();
88
+ }
89
+
90
+ async stop(outputDir: string) {
91
+ if (!this.#profiler) {
92
+ return;
93
+ }
94
+
95
+ const profile = this.#profiler.stopProfiling();
96
+
97
+ const result = await new Promise<string>((accept, reject) =>
98
+ profile.export((error, result) => {
99
+ if (error) {
100
+ reject(error);
101
+ } else if (!result) {
102
+ reject(new Error("No profile error or result"));
103
+ } else {
104
+ accept(result);
105
+ }
106
+ }),
107
+ );
108
+
109
+ await mkdir(outputDir, { recursive: true });
110
+ await writeFile(`${outputDir}/test-${new Date().toISOString().slice(0, 19)}.cpuprofile`, result);
111
+
112
+ this.#profiler = undefined;
113
+ }
114
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ export type TestOptions = {
8
+ spec?: string | string[];
9
+ profile?: boolean;
10
+ grep?: string;
11
+ fgrep?: string;
12
+ invert?: boolean;
13
+ allLogs?: boolean;
14
+ wtf?: boolean;
15
+ debug?: boolean;
16
+ };
17
+
18
+ function option<T extends keyof TestOptions>(options: TestOptions, name: T) {
19
+ if (options[name] !== undefined && options[name] !== null) {
20
+ return options[name];
21
+ }
22
+
23
+ // Support both node and browser
24
+ if (typeof process === "undefined") {
25
+ return;
26
+ }
27
+
28
+ return process.env?.[
29
+ "MATTER_" +
30
+ name
31
+ .match(/(.[^A-Z]+)/g)
32
+ ?.map(s => s.toUpperCase())
33
+ .join("_")
34
+ ];
35
+ }
36
+
37
+ export namespace TestOptions {
38
+ export function apply(mocha: Mocha, options: TestOptions) {
39
+ const grep = option(options, "grep");
40
+ if (grep) {
41
+ mocha.grep(grep);
42
+ }
43
+ const fgrep = option(options, "fgrep");
44
+ if (fgrep) {
45
+ mocha.fgrep(fgrep);
46
+ }
47
+ const invert = option(options, "invert");
48
+ if (invert) {
49
+ mocha.invert();
50
+ }
51
+ const allLogs = option(options, "allLogs");
52
+ if (allLogs) {
53
+ if (typeof MockLogger !== "undefined") {
54
+ MockLogger.emitAll = true;
55
+ }
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import colors from "ansi-colors";
8
+ import { Progress } from "../util/progress.js";
9
+ import { FailureDetail } from "./failure-detail.js";
10
+
11
+ export type Stats = {
12
+ total: number;
13
+ complete: number;
14
+ failures: number;
15
+ };
16
+
17
+ export interface Reporter {
18
+ beginRun(name: string, stats?: Stats, supportsSuites?: boolean): void;
19
+ beginSuite(name: string[], stats?: Stats): void;
20
+ beginTest(name: string, stats?: Stats): void;
21
+ failTest(name: string, detail: FailureDetail): void;
22
+ endRun(stats?: Stats): void;
23
+ failRun(detail: FailureDetail): void;
24
+ }
25
+
26
+ export interface Failure {
27
+ suite: string[];
28
+ test: string;
29
+ detail: FailureDetail;
30
+ }
31
+
32
+ export abstract class ProgressReporter implements Reporter {
33
+ private run = "";
34
+ private suite = Array<string>();
35
+ private failures = Array<Failure>();
36
+ private lastTitle?: string;
37
+
38
+ constructor(private progress: Progress) {}
39
+
40
+ beginRun(name: string, stats: Stats | undefined, supportsSuites = true): void {
41
+ this.run = name;
42
+ this.suite = [];
43
+ this.failures = [];
44
+ if (!supportsSuites) {
45
+ this.progress.update(this.#summarize(stats));
46
+ }
47
+ }
48
+
49
+ beginSuite(name: string[]): void {
50
+ this.suite = name;
51
+ }
52
+
53
+ beginTest(name: string, stats?: Stats): void {
54
+ // If not a TTY, only update once per suite to keep the line count down for e.g. GH action logs
55
+ const title = process.stdout.isTTY ? this.#formatName(this.suite, name) : this.suite[0];
56
+ if (this.lastTitle !== title) {
57
+ this.lastTitle = title;
58
+ this.progress.update(this.#summarize(stats), title);
59
+ }
60
+ }
61
+
62
+ failTest(name: string, detail: FailureDetail) {
63
+ this.failures.push({
64
+ suite: this.suite,
65
+ test: name,
66
+ detail,
67
+ });
68
+ }
69
+
70
+ abstract failRun(detail: FailureDetail): void;
71
+
72
+ endRun(stats?: Stats): void {
73
+ if (this.failures.length) {
74
+ this.progress.failure(this.#summarize(stats));
75
+ this.#dumpFailures();
76
+ } else if (stats && !stats.complete) {
77
+ this.progress.failure("No tests found");
78
+ } else {
79
+ this.progress.success(this.#summarize(stats));
80
+ }
81
+ }
82
+
83
+ #summarize(stats?: Stats) {
84
+ let statStr;
85
+ if (stats) {
86
+ const complete = colors.dim(`${stats.complete}/${stats.total}`);
87
+ const failures = stats.failures ? colors.redBright(` ${stats.failures.toString()} failed`) : "";
88
+ statStr = ` ${complete}${failures}`;
89
+ } else {
90
+ statStr = "";
91
+ }
92
+
93
+ return `${colors.bold(this.run)}${statStr}`;
94
+ }
95
+
96
+ #dumpFailures() {
97
+ for (let i = 0; i < this.failures.length; i++) {
98
+ const failure = this.failures[i];
99
+ const index = `Failure ${colors.bold((i + 1).toString())} of ${this.failures.length}`;
100
+ process.stdout.write(`\n${index} ${this.#formatName(failure.suite, failure.test)}\n\n`);
101
+
102
+ FailureDetail.dump(failure.detail, " ");
103
+ }
104
+ }
105
+
106
+ #formatName(suite: string[], test: string) {
107
+ return `${suite.join(" ➡ ")} ➡ ${colors.bold(test)}`;
108
+ }
109
+ }
110
+
111
+ const actualConsole = console;
112
+ const actualLog = actualConsole.log;
113
+
114
+ function proxy(...args: any[]) {
115
+ actualLog.call(actualConsole, `${ConsoleProxyReporter.FLAG}${JSON.stringify(args)}`);
116
+ }
117
+
118
+ export class ConsoleProxyReporter implements Reporter {
119
+ static FLAG = "<<REPORT>> ";
120
+
121
+ beginRun(name: string, stats?: Stats) {
122
+ proxy("beginRun", name, stats);
123
+ }
124
+
125
+ beginSuite(name: string[], stats?: Stats) {
126
+ proxy("beginSuite", name, stats);
127
+ }
128
+
129
+ beginTest(name: string, stats?: Stats) {
130
+ proxy("beginTest", name, stats);
131
+ }
132
+
133
+ endRun(stats?: Stats) {
134
+ proxy("endRun", stats);
135
+ }
136
+
137
+ failTest(name: string, detail: FailureDetail) {
138
+ proxy("failTest", name, detail);
139
+ }
140
+
141
+ failRun(detail: FailureDetail) {
142
+ proxy("failRun", detail);
143
+ }
144
+ }
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import colors from "ansi-colors";
8
+ import debug from "debug";
9
+ import { glob } from "glob";
10
+ import { relative } from "path";
11
+ import { Package } from "../util/package.js";
12
+ import { Progress } from "../util/progress.js";
13
+ import { Chip } from "./chip.js";
14
+ import { FailureDetail } from "./failure-detail.js";
15
+ import { listSupportFiles } from "./files.js";
16
+ import { testNode } from "./node.js";
17
+ import { TestOptions } from "./options.js";
18
+ import { ProgressReporter, Reporter } from "./reporter.js";
19
+ import { testWeb } from "./web.js";
20
+
21
+ export class TestRunner {
22
+ readonly reporter: Reporter;
23
+ private spec = Array<string>();
24
+
25
+ constructor(
26
+ readonly pkg: Package,
27
+ readonly progress: Progress,
28
+ readonly options: TestOptions,
29
+ ) {
30
+ Chip.config = { runner: this };
31
+
32
+ this.reporter = new (class extends ProgressReporter {
33
+ constructor() {
34
+ super(progress);
35
+ }
36
+ override failRun(detail: FailureDetail) {
37
+ process.stdout.write("\n");
38
+ FailureDetail.dump(detail);
39
+ process.exit(1);
40
+ }
41
+ })();
42
+
43
+ if (options.spec === undefined) {
44
+ this.spec = ["test/**/*Test.ts"];
45
+ } else if (Array.isArray(options.spec)) {
46
+ this.spec = options.spec;
47
+ } else {
48
+ this.spec = [options.spec];
49
+ }
50
+
51
+ if (options.debug) {
52
+ debug.enable("mocha:*");
53
+ }
54
+ }
55
+
56
+ async runNode(format: "esm" | "cjs" = "esm") {
57
+ await this.run(this.progress, () => testNode(this, format));
58
+ }
59
+
60
+ async runWeb(manual = false) {
61
+ await this.run(this.progress, () => testWeb(this, manual));
62
+ }
63
+
64
+ loadFiles(format: "esm" | "cjs") {
65
+ const tests = [];
66
+ for (let spec of this.spec) {
67
+ spec = spec.replace(/\.ts$/, ".js");
68
+ spec = relative(this.pkg.path, spec);
69
+ if (!spec.startsWith(".") && !spec.startsWith("build/") && !spec.startsWith("dist/")) {
70
+ spec = `build/${format}/${spec}`;
71
+ }
72
+ spec = this.pkg.resolve(spec);
73
+
74
+ // Glob only understands forward-slash as separator because reasons
75
+ spec = spec.replace(/\\/g, "/");
76
+
77
+ tests.push(...glob.sync(spec));
78
+ }
79
+
80
+ if (!tests.length) {
81
+ fatal(`No files match ${this.spec.join(", ")}`);
82
+ }
83
+
84
+ return [...listSupportFiles(format), ...tests];
85
+ }
86
+
87
+ private async run(progress: Progress, runner: () => Promise<void>) {
88
+ await runner();
89
+ if (progress.status !== Progress.Status.Success) {
90
+ fatal(`Test ${progress.status.toLowerCase()}, aborting`);
91
+ }
92
+ }
93
+ }
94
+
95
+ function fatal(message: string) {
96
+ process.stderr.write(colors.redBright(`\n${message}\n\n`));
97
+ process.exit(1);
98
+ }