@davidsouther/jiffies 2.2.4 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/LICENSE +1 -1
  2. package/lib/cjs/assert.d.ts +2 -2
  3. package/lib/cjs/awaitable.d.ts +1 -1
  4. package/lib/cjs/components/button_bar.d.ts +2 -2
  5. package/lib/cjs/components/inline_edit.d.ts +2 -2
  6. package/lib/cjs/components/logger.d.ts +1 -1
  7. package/lib/cjs/components/select.d.ts +4 -7
  8. package/lib/cjs/components/test.d.ts +1 -1
  9. package/lib/cjs/components/virtual_scroll.d.ts +6 -4
  10. package/lib/cjs/context.d.ts +5 -9
  11. package/lib/cjs/debounce.d.ts +1 -1
  12. package/lib/cjs/diff.d.ts +2 -2
  13. package/lib/cjs/display.d.ts +1 -1
  14. package/lib/cjs/dom/css/border.d.ts +2 -2
  15. package/lib/cjs/dom/css/constants.d.ts +3 -3
  16. package/lib/cjs/dom/css/core.d.ts +1 -1
  17. package/lib/cjs/dom/css/fstyle.d.ts +2 -2
  18. package/lib/cjs/dom/css/sizing.d.ts +2 -2
  19. package/lib/cjs/dom/dom.d.ts +8 -8
  20. package/lib/cjs/dom/fc.d.ts +8 -12
  21. package/lib/cjs/dom/form/form.d.ts +5 -6
  22. package/lib/cjs/dom/html.d.ts +112 -113
  23. package/lib/cjs/dom/observable.d.ts +1 -1
  24. package/lib/cjs/dom/provide.d.ts +1 -1
  25. package/lib/cjs/dom/router/router.d.ts +2 -2
  26. package/lib/cjs/dom/svg.d.ts +64 -64
  27. package/lib/cjs/dom/types/css.d.ts +10 -32
  28. package/lib/cjs/dom/types/html.d.ts +4 -6
  29. package/lib/cjs/equal.d.ts +8 -5
  30. package/lib/cjs/flags.d.ts +1 -1
  31. package/lib/cjs/fs.d.ts +3 -3
  32. package/lib/cjs/fs_node.d.ts +1 -1
  33. package/lib/cjs/lock.d.ts +1 -1
  34. package/lib/cjs/log.d.ts +9 -9
  35. package/lib/cjs/observable/event.d.ts +2 -2
  36. package/lib/cjs/observable/observable.d.ts +37 -35
  37. package/lib/cjs/result.d.ts +21 -21
  38. package/lib/cjs/safe.d.ts +1 -1
  39. package/lib/cjs/scope/describe.d.ts +4 -4
  40. package/lib/cjs/scope/display/console.d.ts +1 -1
  41. package/lib/cjs/scope/display/dom.d.ts +2 -2
  42. package/lib/cjs/scope/display/junit.d.ts +1 -1
  43. package/lib/cjs/scope/execute.d.ts +2 -2
  44. package/lib/cjs/scope/index.d.ts +3 -3
  45. package/lib/cjs/scope/scope.d.ts +3 -3
  46. package/lib/cjs/scope/state.d.ts +1 -1
  47. package/lib/cjs/server/http/apps.d.ts +1 -1
  48. package/lib/cjs/server/http/css.d.ts +1 -1
  49. package/lib/cjs/server/http/index.d.ts +4 -9
  50. package/lib/cjs/server/http/response.d.ts +3 -3
  51. package/lib/cjs/server/http/sitemap.d.ts +1 -1
  52. package/lib/cjs/server/http/static.d.ts +1 -1
  53. package/lib/cjs/server/http/typescript.d.ts +1 -1
  54. package/lib/cjs/test_all.d.ts +9 -9
  55. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  56. package/lib/esm/assert.d.ts +2 -2
  57. package/lib/esm/awaitable.d.ts +1 -1
  58. package/lib/esm/components/button_bar.d.ts +2 -2
  59. package/lib/esm/components/inline_edit.d.ts +2 -2
  60. package/lib/esm/components/logger.d.ts +1 -1
  61. package/lib/esm/components/select.d.ts +3 -3
  62. package/lib/esm/components/test.d.ts +1 -1
  63. package/lib/esm/components/virtual_scroll.d.ts +6 -4
  64. package/lib/esm/context.d.ts +5 -9
  65. package/lib/esm/debounce.d.ts +1 -2
  66. package/lib/esm/diff.d.ts +2 -2
  67. package/lib/esm/display.d.ts +1 -1
  68. package/lib/esm/dom/css/border.d.ts +2 -2
  69. package/lib/esm/dom/css/constants.d.ts +3 -3
  70. package/lib/esm/dom/css/core.d.ts +1 -1
  71. package/lib/esm/dom/css/fstyle.d.ts +2 -2
  72. package/lib/esm/dom/css/sizing.d.ts +2 -2
  73. package/lib/esm/dom/dom.d.ts +8 -8
  74. package/lib/esm/dom/fc.d.ts +8 -12
  75. package/lib/esm/dom/form/form.d.ts +5 -6
  76. package/lib/esm/dom/html.d.ts +112 -113
  77. package/lib/esm/dom/observable.d.ts +1 -1
  78. package/lib/esm/dom/provide.d.ts +1 -1
  79. package/lib/esm/dom/router/router.d.ts +2 -2
  80. package/lib/esm/dom/svg.d.ts +64 -64
  81. package/lib/esm/dom/types/css.d.ts +10 -32
  82. package/lib/esm/dom/types/html.d.ts +4 -6
  83. package/lib/esm/equal.d.ts +8 -5
  84. package/lib/esm/flags.d.ts +1 -1
  85. package/lib/esm/fs.d.ts +3 -3
  86. package/lib/esm/fs_node.d.ts +1 -1
  87. package/lib/esm/lock.d.ts +1 -1
  88. package/lib/esm/log.d.ts +9 -9
  89. package/lib/esm/observable/event.d.ts +2 -2
  90. package/lib/esm/observable/observable.d.ts +37 -35
  91. package/lib/esm/result.d.ts +21 -21
  92. package/lib/esm/safe.d.ts +1 -1
  93. package/lib/esm/scope/describe.d.ts +4 -4
  94. package/lib/esm/scope/display/console.d.ts +1 -1
  95. package/lib/esm/scope/display/dom.d.ts +2 -2
  96. package/lib/esm/scope/display/junit.d.ts +1 -1
  97. package/lib/esm/scope/execute.d.ts +2 -2
  98. package/lib/esm/scope/index.d.ts +3 -3
  99. package/lib/esm/scope/scope.d.ts +3 -3
  100. package/lib/esm/scope/state.d.ts +1 -1
  101. package/lib/esm/server/http/apps.d.ts +1 -1
  102. package/lib/esm/server/http/css.d.ts +1 -1
  103. package/lib/esm/server/http/index.d.ts +4 -9
  104. package/lib/esm/server/http/response.d.ts +3 -3
  105. package/lib/esm/server/http/sitemap.d.ts +1 -1
  106. package/lib/esm/server/http/static.d.ts +1 -1
  107. package/lib/esm/server/http/typescript.d.ts +1 -1
  108. package/lib/esm/test_all.d.ts +9 -9
  109. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  110. package/package.json +11 -9
  111. package/src/assert.ts +5 -5
  112. package/src/components/button_bar.ts +28 -30
  113. package/src/components/inline_edit.ts +8 -7
  114. package/src/components/logger.ts +6 -6
  115. package/src/components/select.ts +7 -7
  116. package/src/components/test.ts +5 -0
  117. package/src/components/virtual_scroll.test.ts +9 -6
  118. package/src/components/virtual_scroll.ts +29 -24
  119. package/src/context.test.ts +4 -4
  120. package/src/context.ts +16 -11
  121. package/src/debounce.ts +9 -3
  122. package/src/diff.test.ts +4 -4
  123. package/src/diff.ts +14 -16
  124. package/src/dom/css/border.ts +11 -11
  125. package/src/dom/css/core.ts +1 -1
  126. package/src/dom/css/fstyle.ts +4 -4
  127. package/src/dom/css/sizing.ts +1 -1
  128. package/src/dom/dom.ts +57 -47
  129. package/src/dom/fc.test.ts +8 -8
  130. package/src/dom/fc.ts +32 -35
  131. package/src/dom/form/form.app.ts +9 -9
  132. package/src/dom/form/form.ts +25 -16
  133. package/src/dom/form/index.html +3 -2
  134. package/src/dom/html.test.ts +12 -10
  135. package/src/dom/html.ts +2 -3
  136. package/src/dom/observable.test.ts +6 -6
  137. package/src/dom/observable.ts +2 -2
  138. package/src/dom/provide.ts +1 -1
  139. package/src/dom/router/link.ts +3 -3
  140. package/src/dom/router/router.ts +5 -5
  141. package/src/dom/svg.ts +7 -6
  142. package/src/dom/test.ts +3 -0
  143. package/src/dom/types/css.ts +43 -61
  144. package/src/dom/types/html.ts +2 -4
  145. package/src/dom/xml.ts +2 -2
  146. package/src/equal.test.ts +3 -3
  147. package/src/equal.ts +27 -14
  148. package/src/flags.test.ts +2 -2
  149. package/src/flags.ts +2 -2
  150. package/src/fs.test.ts +5 -5
  151. package/src/fs.ts +26 -20
  152. package/src/fs_node.ts +4 -4
  153. package/src/fs_win.test.ts +1 -1
  154. package/src/generator.test.ts +4 -3
  155. package/src/generator.ts +1 -1
  156. package/src/hooks/_notes +4 -1
  157. package/src/index.html +7 -7
  158. package/src/lock.test.ts +4 -4
  159. package/src/lock.ts +8 -7
  160. package/src/log.ts +28 -18
  161. package/src/observable/event.ts +7 -7
  162. package/src/observable/observable.test.ts +3 -3
  163. package/src/observable/observable.ts +71 -52
  164. package/src/result.test.ts +7 -10
  165. package/src/result.ts +51 -47
  166. package/src/safe.ts +1 -1
  167. package/src/scope/describe.ts +12 -11
  168. package/src/scope/display/console.ts +4 -4
  169. package/src/scope/display/dom.ts +9 -9
  170. package/src/scope/display/junit.ts +21 -24
  171. package/src/scope/execute.ts +17 -12
  172. package/src/scope/expect.ts +22 -22
  173. package/src/scope/fix.ts +10 -7
  174. package/src/scope/index.ts +3 -3
  175. package/src/scope/scope.ts +2 -2
  176. package/src/scope/state.ts +2 -2
  177. package/src/server/http/apps.ts +5 -5
  178. package/src/server/http/css.ts +10 -26
  179. package/src/server/http/index.ts +30 -24
  180. package/src/server/http/response.ts +12 -5
  181. package/src/server/http/sitemap.ts +8 -8
  182. package/src/server/http/static.ts +9 -6
  183. package/src/server/http/typescript.ts +25 -25
  184. package/src/server/main.ts +7 -4
  185. package/src/test.mjs +8 -8
  186. package/src/test_all.ts +16 -13
  187. package/src/transpile.mjs +6 -18
  188. package/build/pico.css +0 -2466
  189. package/build/pico.css.map +0 -1
  190. package/lib/cjs/assert.js +0 -46
  191. package/lib/cjs/awaitable.js +0 -2
  192. package/lib/cjs/case.js +0 -9
  193. package/lib/cjs/components/button_bar.js +0 -29
  194. package/lib/cjs/components/inline_edit.js +0 -51
  195. package/lib/cjs/components/logger.js +0 -27
  196. package/lib/cjs/components/select.js +0 -6
  197. package/lib/cjs/components/test.js +0 -7
  198. package/lib/cjs/components/virtual_scroll.js +0 -102
  199. package/lib/cjs/components/virtual_scroll.test.js +0 -22
  200. package/lib/cjs/context.js +0 -48
  201. package/lib/cjs/context.test.js +0 -48
  202. package/lib/cjs/debounce.js +0 -12
  203. package/lib/cjs/diff.js +0 -58
  204. package/lib/cjs/diff.test.js +0 -41
  205. package/lib/cjs/display.js +0 -16
  206. package/lib/cjs/dom/css/border.js +0 -33
  207. package/lib/cjs/dom/css/constants.js +0 -31
  208. package/lib/cjs/dom/css/core.js +0 -31
  209. package/lib/cjs/dom/css/fstyle.js +0 -36
  210. package/lib/cjs/dom/css/sizing.js +0 -14
  211. package/lib/cjs/dom/dom.js +0 -110
  212. package/lib/cjs/dom/fc.js +0 -39
  213. package/lib/cjs/dom/fc.test.js +0 -23
  214. package/lib/cjs/dom/form/form.app.js +0 -27
  215. package/lib/cjs/dom/form/form.js +0 -49
  216. package/lib/cjs/dom/form/form.test.js +0 -1
  217. package/lib/cjs/dom/html.js +0 -119
  218. package/lib/cjs/dom/html.test.js +0 -60
  219. package/lib/cjs/dom/observable.js +0 -10
  220. package/lib/cjs/dom/observable.test.js +0 -35
  221. package/lib/cjs/dom/provide.js +0 -12
  222. package/lib/cjs/dom/router/link.js +0 -7
  223. package/lib/cjs/dom/router/router.js +0 -55
  224. package/lib/cjs/dom/svg.js +0 -69
  225. package/lib/cjs/dom/test.js +0 -13
  226. package/lib/cjs/dom/types/css.js +0 -24
  227. package/lib/cjs/dom/types/dom.js +0 -1
  228. package/lib/cjs/dom/types/html.js +0 -2
  229. package/lib/cjs/dom/xml.js +0 -8
  230. package/lib/cjs/equal.js +0 -48
  231. package/lib/cjs/equal.test.js +0 -22
  232. package/lib/cjs/flags.js +0 -52
  233. package/lib/cjs/flags.test.js +0 -37
  234. package/lib/cjs/fs.js +0 -235
  235. package/lib/cjs/fs.test.js +0 -86
  236. package/lib/cjs/fs_node.js +0 -50
  237. package/lib/cjs/fs_win.test.js +0 -10
  238. package/lib/cjs/generator.js +0 -14
  239. package/lib/cjs/generator.test.js +0 -26
  240. package/lib/cjs/is_browser.js +0 -4
  241. package/lib/cjs/loader-register.d.mts +0 -1
  242. package/lib/cjs/loader-register.d.ts +0 -1
  243. package/lib/cjs/loader-register.js +0 -4
  244. package/lib/cjs/loader-register.mjs +0 -4
  245. package/lib/cjs/loader.d.mts +0 -23
  246. package/lib/cjs/loader.mjs +0 -41
  247. package/lib/cjs/lock.js +0 -27
  248. package/lib/cjs/lock.test.js +0 -18
  249. package/lib/cjs/log.js +0 -98
  250. package/lib/cjs/observable/event.js +0 -61
  251. package/lib/cjs/observable/observable.js +0 -363
  252. package/lib/cjs/observable/observable.test.js +0 -65
  253. package/lib/cjs/package.json +0 -1
  254. package/lib/cjs/range.js +0 -11
  255. package/lib/cjs/result.js +0 -80
  256. package/lib/cjs/result.test.js +0 -78
  257. package/lib/cjs/safe.js +0 -14
  258. package/lib/cjs/scope/describe.js +0 -73
  259. package/lib/cjs/scope/display/console.js +0 -25
  260. package/lib/cjs/scope/display/dom.js +0 -30
  261. package/lib/cjs/scope/display/junit.js +0 -21
  262. package/lib/cjs/scope/execute.js +0 -91
  263. package/lib/cjs/scope/expect.js +0 -110
  264. package/lib/cjs/scope/fix.js +0 -26
  265. package/lib/cjs/scope/index.js +0 -15
  266. package/lib/cjs/scope/scope.js +0 -2
  267. package/lib/cjs/scope/state.js +0 -12
  268. package/lib/cjs/server/http/apps.js +0 -27
  269. package/lib/cjs/server/http/css.js +0 -54
  270. package/lib/cjs/server/http/index.js +0 -77
  271. package/lib/cjs/server/http/response.js +0 -45
  272. package/lib/cjs/server/http/sitemap.js +0 -46
  273. package/lib/cjs/server/http/static.js +0 -25
  274. package/lib/cjs/server/http/typescript.js +0 -44
  275. package/lib/cjs/server/main.js +0 -14
  276. package/lib/cjs/test.mjs +0 -28
  277. package/lib/cjs/test_all.js +0 -30
  278. package/lib/cjs/transpile.mjs +0 -22
  279. package/lib/esm/assert.js +0 -38
  280. package/lib/esm/awaitable.js +0 -1
  281. package/lib/esm/case.js +0 -5
  282. package/lib/esm/components/button_bar.js +0 -27
  283. package/lib/esm/components/inline_edit.js +0 -48
  284. package/lib/esm/components/logger.js +0 -22
  285. package/lib/esm/components/select.js +0 -3
  286. package/lib/esm/components/test.js +0 -3
  287. package/lib/esm/components/virtual_scroll.js +0 -94
  288. package/lib/esm/components/virtual_scroll.test.js +0 -20
  289. package/lib/esm/context.js +0 -43
  290. package/lib/esm/context.test.js +0 -46
  291. package/lib/esm/debounce.js +0 -8
  292. package/lib/esm/diff.js +0 -54
  293. package/lib/esm/diff.test.js +0 -39
  294. package/lib/esm/display.js +0 -11
  295. package/lib/esm/dom/css/border.js +0 -27
  296. package/lib/esm/dom/css/constants.js +0 -28
  297. package/lib/esm/dom/css/core.js +0 -24
  298. package/lib/esm/dom/css/fstyle.js +0 -32
  299. package/lib/esm/dom/css/sizing.js +0 -10
  300. package/lib/esm/dom/dom.js +0 -104
  301. package/lib/esm/dom/fc.js +0 -35
  302. package/lib/esm/dom/fc.test.js +0 -21
  303. package/lib/esm/dom/form/form.app.js +0 -23
  304. package/lib/esm/dom/form/form.js +0 -34
  305. package/lib/esm/dom/form/form.test.js +0 -1
  306. package/lib/esm/dom/html.js +0 -114
  307. package/lib/esm/dom/html.test.js +0 -58
  308. package/lib/esm/dom/observable.js +0 -6
  309. package/lib/esm/dom/observable.test.js +0 -33
  310. package/lib/esm/dom/provide.js +0 -7
  311. package/lib/esm/dom/router/link.js +0 -3
  312. package/lib/esm/dom/router/router.js +0 -52
  313. package/lib/esm/dom/svg.js +0 -65
  314. package/lib/esm/dom/test.js +0 -9
  315. package/lib/esm/dom/types/css.js +0 -23
  316. package/lib/esm/dom/types/dom.js +0 -1
  317. package/lib/esm/dom/types/html.js +0 -1
  318. package/lib/esm/dom/xml.js +0 -4
  319. package/lib/esm/equal.js +0 -41
  320. package/lib/esm/equal.test.js +0 -20
  321. package/lib/esm/flags.js +0 -48
  322. package/lib/esm/flags.test.js +0 -35
  323. package/lib/esm/fs.js +0 -226
  324. package/lib/esm/fs.test.js +0 -84
  325. package/lib/esm/fs_node.js +0 -45
  326. package/lib/esm/fs_win.test.js +0 -8
  327. package/lib/esm/generator.js +0 -10
  328. package/lib/esm/generator.test.js +0 -24
  329. package/lib/esm/is_browser.js +0 -1
  330. package/lib/esm/loader-register.d.mts +0 -1
  331. package/lib/esm/loader-register.mjs +0 -2
  332. package/lib/esm/loader.d.mts +0 -23
  333. package/lib/esm/loader.mjs +0 -36
  334. package/lib/esm/lock.js +0 -23
  335. package/lib/esm/lock.test.js +0 -16
  336. package/lib/esm/log.js +0 -88
  337. package/lib/esm/observable/event.js +0 -46
  338. package/lib/esm/observable/observable.js +0 -343
  339. package/lib/esm/observable/observable.test.js +0 -63
  340. package/lib/esm/range.js +0 -7
  341. package/lib/esm/result.js +0 -65
  342. package/lib/esm/result.test.js +0 -76
  343. package/lib/esm/safe.js +0 -10
  344. package/lib/esm/scope/describe.js +0 -60
  345. package/lib/esm/scope/display/console.js +0 -21
  346. package/lib/esm/scope/display/dom.js +0 -26
  347. package/lib/esm/scope/display/junit.js +0 -17
  348. package/lib/esm/scope/execute.js +0 -85
  349. package/lib/esm/scope/expect.js +0 -104
  350. package/lib/esm/scope/fix.js +0 -22
  351. package/lib/esm/scope/index.js +0 -3
  352. package/lib/esm/scope/scope.js +0 -1
  353. package/lib/esm/scope/state.js +0 -8
  354. package/lib/esm/server/http/apps.js +0 -23
  355. package/lib/esm/server/http/css.js +0 -50
  356. package/lib/esm/server/http/index.js +0 -73
  357. package/lib/esm/server/http/response.js +0 -40
  358. package/lib/esm/server/http/sitemap.js +0 -42
  359. package/lib/esm/server/http/static.js +0 -21
  360. package/lib/esm/server/http/typescript.js +0 -40
  361. package/lib/esm/server/main.js +0 -12
  362. package/lib/esm/test.mjs +0 -26
  363. package/lib/esm/test_all.js +0 -28
  364. package/lib/esm/transpile.mjs +0 -18
  365. package/src/components/test.js +0 -3
  366. package/src/loader-register.mjs +0 -3
  367. package/src/loader.mjs +0 -46
@@ -1,85 +0,0 @@
1
- import { afterall, aftereach, beforeall, beforeeach, rootCases, } from "./describe.js";
2
- export async function execute(cases = rootCases()) {
3
- const beforeallfn = cases[beforeall] ?? (() => { });
4
- const beforeeachfn = cases[beforeeach] ?? (() => { });
5
- const afterallfn = cases[afterall] ?? (() => { });
6
- const aftereachfn = cases[aftereach] ?? (() => { });
7
- const result = { executed: 0, passed: 0, failed: 0, total: 0 };
8
- try {
9
- await beforeallfn();
10
- }
11
- catch (e) {
12
- result["_beforeAll"] = { error: e };
13
- return result;
14
- }
15
- for (const [title, block] of Object.entries(cases)) {
16
- if (typeof title === "symbol") {
17
- continue;
18
- }
19
- if (block instanceof Function) {
20
- try {
21
- result.executed += 1;
22
- await beforeeachfn();
23
- await block();
24
- await aftereachfn();
25
- result.passed += 1;
26
- result[title] = { passed: true };
27
- }
28
- catch (e) {
29
- result.failed += 1;
30
- result[title] = { error: /** @type Error */ e };
31
- }
32
- }
33
- else if (block) {
34
- const run = await execute(block);
35
- result.executed += run.executed;
36
- result.passed += run.passed;
37
- result.failed += run.failed;
38
- result[title] = run;
39
- }
40
- }
41
- try {
42
- await afterallfn();
43
- }
44
- catch (e) {
45
- result["_afterAll"] = { error: e };
46
- }
47
- return result;
48
- }
49
- export function getError({ error }) {
50
- if (typeof error == "string") {
51
- return error;
52
- }
53
- else if (error.message) {
54
- return error.stack;
55
- }
56
- else {
57
- return "unknown error";
58
- }
59
- }
60
- function makeResult(test, result) {
61
- if (result.error)
62
- return [
63
- {
64
- test,
65
- stack: getError(result),
66
- stats: { executed: 1, failed: 1 },
67
- },
68
- ];
69
- if (result.passed === true) {
70
- return [{ test, stats: { executed: 1, failed: 0 } }];
71
- }
72
- return flattenResults(result, test);
73
- }
74
- export function flattenResults(results, prefix = "") {
75
- const arrow = prefix == "" ? "" : " -> ";
76
- let errorList = [];
77
- for (const [title, result] of Object.entries(results).filter(([key]) => !["executed", "passed", "failed"].includes(key))) {
78
- const test = `${prefix}${arrow}${title}`;
79
- if (typeof result == "number")
80
- continue;
81
- const flatResult = makeResult(test, result);
82
- errorList = errorList.concat(flatResult);
83
- }
84
- return errorList;
85
- }
@@ -1,104 +0,0 @@
1
- import { assert } from "../assert.js";
2
- import { display } from "../display.js";
3
- import { equals } from "../equal.js";
4
- export class Matcher {
5
- actual;
6
- constructor(actual) {
7
- this.actual = actual;
8
- }
9
- get not() {
10
- return new NotMatcher(this.actual);
11
- }
12
- toBe(expected) {
13
- assert(this.actual === expected, () => `${this.actual} !== ${expected}`);
14
- }
15
- toEqual(expected, partial = false) {
16
- assert(equals(this.actual, expected, partial), () => `Objects are not equivalent: ${display(this.actual)}, ${display(expected)}`);
17
- }
18
- toMatch(expected) {
19
- assert(typeof this.actual === "string", () => "Must have string for regexp match");
20
- // @ts-expect-error
21
- const actual = this.actual;
22
- if (typeof expected === "string") {
23
- assert(actual.includes(expected), () => `${actual} does not include ${expected}`);
24
- }
25
- else {
26
- assert(expected.test(actual), () => `${actual} does not match ${expected}`);
27
- }
28
- }
29
- toMatchObject(expected) {
30
- for (const [k, v] of Object.entries(expected)) {
31
- // @ts-expect-error
32
- const actual = this.actual[k];
33
- assert(equals(actual, v, true), () => `Comparing ${k}, properties not equal: ${display(actual)}, ${display(v)}`);
34
- }
35
- }
36
- toBeNull() {
37
- assert(this.actual === null, () => `Expected null, got ${JSON.stringify(this.actual)}`);
38
- }
39
- toThrow(message = "") {
40
- let didThrow = false;
41
- let result = undefined;
42
- try {
43
- // @ts-expect-error
44
- result = this.actual();
45
- }
46
- catch (e) {
47
- assert((e.message ?? "").match(message) !== null, () => `Expected thrown message to match ${message}, got ${e}`);
48
- didThrow = true;
49
- }
50
- assert(didThrow, () => `Expected throw but got ${JSON.stringify(result)}`);
51
- }
52
- }
53
- export class NotMatcher {
54
- actual;
55
- constructor(actual) {
56
- this.actual = actual;
57
- }
58
- get not() {
59
- return new Matcher(this.actual);
60
- }
61
- toBe(expected) {
62
- assert(this.actual !== expected, () => `${this.actual} === ${expected}`);
63
- }
64
- toEqual(expected) {
65
- assert(!equals(this.actual, expected), () => `Objects are equivalent: ${JSON.stringify(this.actual)}, ${JSON.stringify(expected)}`);
66
- }
67
- toMatch(expected) {
68
- assert(typeof this.actual === "string", () => "Must have string for regexp match");
69
- // @ts-expect-error
70
- const actual = this.actual;
71
- if (typeof expected === "string") {
72
- assert(!actual.includes(expected), () => `${actual} includes ${expected}`);
73
- }
74
- else {
75
- assert(!expected.test(actual), () => `${actual} matches ${expected}`);
76
- }
77
- }
78
- toMatchObject(expected) {
79
- for (const [k, v] of Object.entries(expected)) {
80
- // @ts-expect-error
81
- const actual = this.actual[k];
82
- assert(!equals(actual, v), () => `Comparing ${k}, properties equal: ${JSON.stringify(actual)}, ${JSON.stringify(v)}`);
83
- }
84
- }
85
- toBeNull() {
86
- assert(this.actual !== null, () => `Expected not null`);
87
- }
88
- toThrow(message = "") {
89
- let didThrow = false;
90
- let result = undefined;
91
- try {
92
- // @ts-expect-error
93
- result = this.actual();
94
- }
95
- catch (e) {
96
- assert((e.message ?? "").match(message) !== null, () => `Expected thrown message to match ${message}, got ${e}`);
97
- didThrow = true;
98
- }
99
- assert(!didThrow, () => `Expected throw but got ${JSON.stringify(result)}`);
100
- }
101
- }
102
- export function expect(t) {
103
- return new Matcher(t);
104
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * Given a value with numbers, attempt to fix all numbers to 1 decimal point.
3
- */
4
- export function fix(n) {
5
- if (typeof n === "number") {
6
- // @ts-ignore
7
- return +n.toFixed(1);
8
- }
9
- if (n !== Object(n)) {
10
- // A primitive
11
- return n;
12
- }
13
- if (n instanceof Array) {
14
- // @ts-ignore
15
- return n.map(fix);
16
- }
17
- // @ts-ignore
18
- return mapreduce(fix, n);
19
- }
20
- function mapreduce(fn, iter) {
21
- return Object.entries(iter).reduce((acc, [k, v]) => ((acc[k] = fn(v)), acc), {});
22
- }
@@ -1,3 +0,0 @@
1
- export { expect } from "./expect.js";
2
- export { fix } from "./fix.js";
3
- export { afterAll, afterEach, beforeAll, beforeEach, cleanState, describe, it, } from "./describe.js";
@@ -1 +0,0 @@
1
- export {};
@@ -1,8 +0,0 @@
1
- export function cleanState(init, runner) {
2
- const state = {};
3
- runner(async () => {
4
- const freshState = await init();
5
- Object.assign(state, freshState);
6
- });
7
- return state;
8
- }
@@ -1,23 +0,0 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { fileResponse } from "./response.js";
4
- /**
5
- * Searches up the request path until the first index is found.
6
- */
7
- export const findIndex = async ({ root }) => async (req) => {
8
- let filename = path.join(root, req.url ?? "");
9
- if (path.basename(filename).match(/\.[a-z]{1,3}$/)) {
10
- return undefined;
11
- }
12
- while (filename.startsWith(root)) {
13
- const index = path.join(filename, "index.html");
14
- try {
15
- const stat = await fs.stat(index);
16
- return fileResponse(index, stat);
17
- }
18
- catch (e) {
19
- filename = path.dirname(filename);
20
- }
21
- }
22
- return undefined;
23
- };
@@ -1,50 +0,0 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { contentResponse } from "./response.js";
4
- // @ts-ignore
5
- import sass from "sass";
6
- const { compileStringAsync } = sass;
7
- function render(source) {
8
- // Replace `from "@scope` with `from "/@scope`, for browsers
9
- // source = source
10
- // .replaceAll(`from "@`, 'from "/@')
11
- // .replaceAll(`import("@`, 'import("/@');
12
- return contentResponse(source, "text/css");
13
- }
14
- async function compile(filename, root, vars) {
15
- vars = vars.substring(1).replaceAll("=", ":");
16
- filename = filename.replaceAll("\\", "/"); // Normalize for dart-sass
17
- const sassString = `// Using variables: ${vars}\n${vars};\n@import "${filename}";`;
18
- return (await compileStringAsync(sassString, { loadPaths: [root] })).css;
19
- }
20
- /**
21
- * Serves .css files statically. Finds .sass files and transpiles them to css.
22
- */
23
- export const cssFileServer = async ({ root, scopes = {} }) => async (req) => {
24
- const Url = new URL(req.url ?? "/", `http://${req.headers.host}`);
25
- if (Url.pathname.endsWith(".css")) {
26
- let scope = Object.entries(scopes).find(([s]) => Url.pathname.startsWith(`/${s}`));
27
- // Expand url with found scope
28
- Url.protocol = "file";
29
- let url = scope ? Url.pathname.replace(scope[0], scope[1]) : Url.pathname;
30
- let filename = path.join(root, url);
31
- try {
32
- const stat = await fs.stat(filename);
33
- if (stat.isFile()) {
34
- const css = (await fs.readFile(filename)).toString("utf-8");
35
- return render(css);
36
- }
37
- }
38
- catch { }
39
- filename = filename.replace(/\.css$/, ".scss");
40
- try {
41
- const stat = await fs.stat(filename);
42
- if (stat.isFile()) {
43
- const css = await compile(filename.replace(root, "."), root, Url.search);
44
- return render(css);
45
- }
46
- }
47
- catch { }
48
- }
49
- return undefined;
50
- };
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createServer, } from "http";
3
- import * as path from "path";
4
- import { info } from "../../log.js";
5
- import { findIndex } from "./apps.js";
6
- import { cssFileServer } from "./css.js";
7
- import { fileResponse } from "./response.js";
8
- import { sitemap } from "./sitemap.js";
9
- import { staticFileServer } from "./static.js";
10
- import { tsFileServer } from "./typescript.js";
11
- const notFound = async ({ root }) => async () => fileResponse(
12
- // path.join(path.dirname(FLAGS.argv0), "404.html"),
13
- path.join(root, "404.html"), undefined, 404);
14
- const BASE_MIDDLEWARES = [
15
- sitemap,
16
- tsFileServer,
17
- cssFileServer,
18
- staticFileServer,
19
- findIndex,
20
- notFound,
21
- ];
22
- const error = (res, message) => {
23
- console.error(message);
24
- res.statusCode = 500;
25
- res.write(message);
26
- res.end();
27
- return true;
28
- };
29
- const sendContent = async (res, { content, contentType, contentLength }) => {
30
- res.setHeader("Content-Length", `${contentLength}`);
31
- res.setHeader("Content-Type", contentType);
32
- await res.write(content);
33
- res.end();
34
- return true;
35
- };
36
- const log = (req) => {
37
- const when = new Date().toISOString();
38
- const who = req.socket.remoteAddress;
39
- const what = req.url;
40
- const how = `${req.method} ${what}`;
41
- info("Request", { when, who, how });
42
- };
43
- export const makeServer = async (config, middlewares = []) => {
44
- const handlers = await Promise.all([...middlewares, ...BASE_MIDDLEWARES].map(async (m) => m(config)));
45
- const middlewareHandler = async (req, res) => {
46
- log(req);
47
- let handler;
48
- try {
49
- for (const middleware of handlers) {
50
- handler = await middleware(req);
51
- if (handler !== undefined) {
52
- break;
53
- }
54
- }
55
- if (handler) {
56
- sendContent(res, await handler());
57
- }
58
- else {
59
- res.end();
60
- }
61
- }
62
- catch (e) {
63
- error(res, e.message + "\n" + e.stack);
64
- }
65
- };
66
- // TODO(https)
67
- const server = createServer(middlewareHandler);
68
- server.on("listening", () => {
69
- const { address, port } = server.address();
70
- info("Server listening", { address: `http://${address}:${port}` });
71
- });
72
- return server;
73
- };
@@ -1,40 +0,0 @@
1
- import * as fs from "fs/promises";
2
- const MIME_TYPES = {
3
- js: "text/javascript",
4
- json: "text/javascript",
5
- css: "text/css",
6
- html: "text/html",
7
- png: "image/png",
8
- jpg: "image/jpeg",
9
- jpeg: "image/jpeg",
10
- svg: "image/svg+xml",
11
- eot: "application/vnd.ms-fontobject",
12
- ttf: "application/font-ttf",
13
- woff: "application/font-woff",
14
- woff2: "application/font-woff2",
15
- };
16
- const mime = (basename) => {
17
- const extension = basename
18
- .substring(basename.lastIndexOf(".") + 1)
19
- .toLowerCase();
20
- return MIME_TYPES[extension] ?? "application/octet-stream";
21
- };
22
- export const fileResponse = (filename, stat, status = 200) => async () => {
23
- if (!stat) {
24
- stat = await fs.stat(filename);
25
- }
26
- const content = await fs.readFile(filename);
27
- const contentType = mime(filename);
28
- const contentLength = stat.size;
29
- return { status, contentType, contentLength, content };
30
- };
31
- const CHARSET = "utf-8";
32
- export const contentResponse = (content, contentType, status = 200) => async () => {
33
- const contentBuffer = Buffer.from(content, CHARSET);
34
- return {
35
- content: contentBuffer,
36
- contentType: contentType.split(";")[0] + "; charset=" + CHARSET,
37
- status,
38
- contentLength: contentBuffer.length,
39
- };
40
- };
@@ -1,42 +0,0 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { info } from "../../log.js";
4
- import { contentResponse } from "./response.js";
5
- const findSiteMap = async (root, prefix = root) => {
6
- if (root.startsWith("node_modules")) {
7
- return [];
8
- }
9
- const children = (await fs.readdir(root, { withFileTypes: true })).map(async (entry) => {
10
- const next = path
11
- .join(root, entry.name)
12
- // Normalize separators for web
13
- .replaceAll(path.sep, "/");
14
- if (entry.isFile()) {
15
- if (entry.name === "index.html") {
16
- let index = next.replace(prefix, "");
17
- info(`Adding to sitemap`, { index });
18
- return [index];
19
- }
20
- }
21
- else if (entry.isDirectory()) {
22
- if (entry.name.startsWith(".")) {
23
- return [];
24
- }
25
- const flattened = (await Promise.all(await findSiteMap(next, prefix))).flat();
26
- return flattened;
27
- }
28
- return [];
29
- });
30
- return children;
31
- };
32
- export const sitemap = async ({ root }) => {
33
- const apps = await (await Promise.all(await findSiteMap(root)))
34
- .flat()
35
- .filter((a) => a !== undefined);
36
- return async (req) => {
37
- if ((req.url ?? "").endsWith("sitemap.json")) {
38
- return contentResponse(JSON.stringify(apps), "application/json");
39
- }
40
- return undefined;
41
- };
42
- };
@@ -1,21 +0,0 @@
1
- import * as path from "path";
2
- import * as fs from "fs/promises";
3
- import { fileResponse } from "./response.js";
4
- export const staticFileServer = async ({ root, scopes = {} }) => async (req) => {
5
- const scope = Object.entries(scopes).find(([s]) => req.url?.startsWith(`/${s}`));
6
- const url = new URL(req.url ?? "", `http://localhost`);
7
- const pathname = scope
8
- ? url.pathname.replace(scope[0], scope[1])
9
- : url.pathname;
10
- const filename = path.join(root, pathname);
11
- // Expand url with found scope
12
- console.log(scope, req.url, filename);
13
- try {
14
- const stat = await fs.stat(filename);
15
- return stat.isDirectory() ? undefined : fileResponse(filename, stat);
16
- }
17
- catch (e) {
18
- console.error(e);
19
- return undefined;
20
- }
21
- };
@@ -1,40 +0,0 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { contentResponse } from "./response.js";
4
- import { transpile } from "../../transpile.mjs";
5
- function render(source) {
6
- // Replace `from "@scope` with `from "/@scope`, for browsers
7
- source = source
8
- .replaceAll(`from "@`, 'from "/@')
9
- .replaceAll(`import("@`, 'import("/@');
10
- return contentResponse(source, "application/javascript");
11
- }
12
- /**
13
- * Serves .js files statically. Finds .ts files and transpiles them to JS.
14
- */
15
- export const tsFileServer = async ({ root, scopes = {} }) => async (req) => {
16
- if (req.url?.endsWith(".js")) {
17
- let scope = Object.entries(scopes).find(([s]) => req.url?.startsWith(`/${s}`));
18
- // Expand url with found scope
19
- let url = scope ? req.url.replace(scope[0], scope[1]) : req.url;
20
- let filename = path.join(root, url);
21
- try {
22
- const stat = await fs.stat(filename);
23
- if (stat.isFile()) {
24
- const js = (await fs.readFile(filename)).toString("utf-8");
25
- return render(js);
26
- }
27
- }
28
- catch { }
29
- filename = filename.replace(/\.js$/, ".ts");
30
- try {
31
- const stat = await fs.stat(filename);
32
- if (stat.isFile()) {
33
- const js = await transpile(filename, () => fs.readFile(filename));
34
- return render(js);
35
- }
36
- }
37
- catch { }
38
- }
39
- return undefined;
40
- };
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env node --experimental-loader ../loader.mjs
2
- import { info } from "../log.js";
3
- info("Starting server", { cwd: process.cwd() });
4
- import { parse } from "../flags.js";
5
- const FLAGS = parse(process.argv);
6
- import { makeServer } from "./http/index.js";
7
- import * as path from "node:path";
8
- async function main() {
9
- const server = await makeServer({ root: path.join(process.cwd(), "src") });
10
- server.listen(FLAGS.asNumber("port", 8080), FLAGS.asString("host", "0.0.0.0"));
11
- }
12
- main();
package/lib/esm/test.mjs DELETED
@@ -1,26 +0,0 @@
1
- #!/usr/bin/env node
2
- import { parse } from "./flags.js";
3
- import { execute } from "./scope/execute.js";
4
- import { asXML } from "./scope/display/junit.js";
5
- import { onConsole } from "./scope/display/console.js";
6
- async function main() {
7
- await import("./test_all.js");
8
- (async function () {
9
- const results = await execute();
10
- const FLAGS = parse(process.argv);
11
- switch (FLAGS.asString("mode", "console")) {
12
- case "junit":
13
- const xml = asXML(results);
14
- console.log(xml);
15
- break;
16
- case "console":
17
- default:
18
- onConsole(results);
19
- break;
20
- }
21
- if (results.failed > 0) {
22
- process.exit(1);
23
- }
24
- })();
25
- }
26
- main();
@@ -1,28 +0,0 @@
1
- // This file must be .js for imports to run. Unused imports in .ts files are
2
- // discarded during transpilation.
3
- import { describe, expect, it } from "./scope/index.js";
4
- describe("Test executor", () => {
5
- it("matches equality", () => {
6
- expect(1).toBe(1);
7
- });
8
- it("fails on inequality", () => {
9
- expect(() => expect(1).toBe(2)).toThrow();
10
- });
11
- });
12
- import "./context.test.js";
13
- import "./diff.test.js";
14
- import "./equal.test.js";
15
- import "./flags.test.js";
16
- import "./fs.test.js";
17
- import "./generator.test.js";
18
- import "./lock.test.js";
19
- import "./result.test.js";
20
- import "./observable/observable.test.js";
21
- if (typeof process != "undefined" && process.env.CI?.toLowerCase() !== "true") {
22
- (async () => {
23
- const components = await import("./components/test.js");
24
- const dom = await import("./dom/test.js");
25
- await components.loadTests();
26
- await dom.loadTests();
27
- })();
28
- }
@@ -1,18 +0,0 @@
1
- // @ts-ignore
2
- import ts from "typescript";
3
- const compilerOptions = {
4
- target: ts.ScriptTarget.ESNext,
5
- module: ts.ModuleKind.ESNext,
6
- inlineSourceMap: true,
7
- inlineSources: true,
8
- };
9
- const tsmap = new Map();
10
- export async function transpile(
11
- /** @type string */ url,
12
- /** @type {() => Promise<{toString(): string}>} */ get) {
13
- if (!tsmap.has(url)) {
14
- const source = ts.transpile((await get()).toString(), compilerOptions, url, undefined, url);
15
- tsmap.set(url, source);
16
- }
17
- return tsmap.get(url);
18
- }
@@ -1,3 +0,0 @@
1
- export async function loadTests() {
2
- // await import("./virtual_scroll.test.js");
3
- }
@@ -1,3 +0,0 @@
1
- import { register } from 'node:module';
2
-
3
- register('./loader.mjs', import.meta.url);
package/src/loader.mjs DELETED
@@ -1,46 +0,0 @@
1
- import { stat } from "node:fs/promises";
2
- import { cwd } from "node:process";
3
- import { fileURLToPath, pathToFileURL } from "node:url";
4
- import { transpile } from "./transpile.mjs";
5
-
6
- const baseURL = pathToFileURL(`${cwd()}/`).href;
7
-
8
- /** @returns {Promise<{url: string, shortCircuit?: boolean}>} */
9
- export async function resolve(
10
- /** @type string */ specifier,
11
- /** @type {{parentURL?: string}} */ context,
12
- /** @type {(specifier: string, context: {parentURL?: string}, defaultResolve: Function) => Promise<{url: string}>} */ defaultResolve
13
- ) {
14
- const tsURL = new URL(
15
- specifier.replace(/js$/, "ts"),
16
- context.parentURL ?? baseURL
17
- );
18
- const tsSpecifier = tsURL.href;
19
- try {
20
- const stats = await stat(fileURLToPath(tsURL));
21
- if (stats.isFile()) {
22
- // return { url: tsSpecifier, shortCircuit: true };
23
- return defaultResolve(tsSpecifier, context, defaultResolve);
24
- }
25
- } catch (e) {
26
- // Do nothing
27
- }
28
- return defaultResolve(specifier, context, defaultResolve);
29
- }
30
-
31
- /** @returns {Promise<{format: string, source: string}>} */
32
- export async function load(
33
- /** @type string */ url,
34
- /** @type {{format?: string}} */ context,
35
- /** @type {(url: string, context: {format?: string}, defaultLoad?: Function) => Promise<{format: string, source: string}>} */ defaultLoad
36
- ) {
37
- return url.endsWith("ts")
38
- ? {
39
- format: "module",
40
- source: await transpile(
41
- url,
42
- async () => (await defaultLoad(url, { format: "module" })).source
43
- ),
44
- }
45
- : defaultLoad(url, context, defaultLoad);
46
- }