@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
package/src/lock.test.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { describe, it, expect } from "./scope/index.js";
2
- import { lock } from "./lock.js";
1
+ import { lock } from "./lock.ts";
2
+ import { describe, expect, it } from "./scope/index.ts";
3
3
 
4
4
  describe("Lock", () => {
5
- it("prevents reentry", function () {
5
+ it("prevents reentry", () => {
6
6
  let count = 0;
7
- const inc = lock(function () {
7
+ const inc = lock(() => {
8
8
  if (count > 4) {
9
9
  return;
10
10
  }
package/src/lock.ts CHANGED
@@ -1,13 +1,13 @@
1
- const locks = new WeakSet<Function>();
1
+ const locks = new WeakSet<CallableFunction>();
2
2
 
3
- export function lock(fn: Function): Function {
4
- return function (...args: unknown[]) {
5
- let ret = null;
3
+ export function lock<CF extends (...args: unknown[]) => unknown>(fn: CF): CF {
4
+ const lockingFn = (...args: unknown[]): ReturnType<CF> => {
5
+ let ret: ReturnType<CF>;
6
6
  let ex = null;
7
7
  if (!locks.has(fn)) {
8
8
  locks.add(fn);
9
9
  try {
10
- ret = fn(...args);
10
+ ret = fn(...args) as ReturnType<CF>;
11
11
  } catch (e) {
12
12
  ex = e;
13
13
  }
@@ -15,8 +15,9 @@ export function lock(fn: Function): Function {
15
15
  locks.delete(fn);
16
16
  if (ex !== null) {
17
17
  throw ex;
18
- } else {
19
- return ret;
20
18
  }
19
+ // @ts-expect-error 2454 can't track ret's assignment
20
+ return ret;
21
21
  };
22
+ return lockingFn as CF;
22
23
  }
package/src/log.ts CHANGED
@@ -1,10 +1,9 @@
1
- import { display, Display } from "./display.js";
1
+ import { type Display, display } from "./display.ts";
2
2
 
3
- export interface Log {
4
- (message: Display, data?: {}): void;
5
- }
3
+ export type Log = (message: Display, data?: object) => void;
6
4
 
7
5
  export interface Logger {
6
+ logAt: (level: number, prefix: string, fn?: (logLine: string) => void) => Log;
8
7
  level: number;
9
8
  format: <
10
9
  D extends {
@@ -13,11 +12,12 @@ export interface Logger {
13
12
  level: number;
14
13
  message: string;
15
14
  source: string;
16
- }
15
+ },
17
16
  >(
18
- data: D
17
+ data: D,
19
18
  ) => string;
20
19
  console: Console;
20
+ default: (logLine: string) => void;
21
21
  debug: Log;
22
22
  info: Log;
23
23
  warn: Log;
@@ -46,7 +46,8 @@ export const LEVELS: Record<string, number> = {
46
46
 
47
47
  export function getLogLevel(level = ""): number {
48
48
  return (
49
- LEVELS[level.toLowerCase()] ?? (!isNaN(+level) ? Number(level) : LEVEL.INFO)
49
+ LEVELS[level.toLowerCase()] ??
50
+ (!Number.isNaN(+level) ? Number(level) : LEVEL.INFO)
50
51
  );
51
52
  }
52
53
 
@@ -78,9 +79,9 @@ type LoggerFormatFn = <
78
79
  level: number;
79
80
  message: string;
80
81
  source: string;
81
- }
82
+ },
82
83
  >(
83
- data: D
84
+ data: D,
84
85
  ) => string;
85
86
 
86
87
  export function getLogger(
@@ -88,28 +89,37 @@ export function getLogger(
88
89
  args: LoggerFormatFn | { format?: LoggerFormatFn; console?: Console } = {
89
90
  format: JSON.stringify,
90
91
  console,
91
- }
92
+ },
92
93
  ): Logger {
93
94
  if (args instanceof Function) {
94
95
  args = { format: args };
95
96
  }
97
+ const defaultLog = (logLine: string): void => {
98
+ logger.console.info(logLine);
99
+ };
96
100
  const logAt =
97
- (level: number, prefix: string, fn: (logLine: string) => void) =>
98
- (message: Display, data?: {}) =>
101
+ (
102
+ level: number,
103
+ prefix: string,
104
+ fn: (logLine: string) => void = defaultLog,
105
+ ): Log =>
106
+ (message: Display, data?: object) =>
99
107
  level >= (logger.level ?? LEVEL.SILENT)
100
108
  ? fn(
101
- logger.format!({
109
+ logger.format?.({
102
110
  name,
103
111
  prefix,
104
112
  level,
105
113
  message: display(message),
106
114
  ...data,
107
115
  source: findSource(),
108
- })
116
+ }),
109
117
  )
110
118
  : undefined;
111
119
 
112
120
  const logger: Logger = {
121
+ logAt,
122
+ default: defaultLog,
113
123
  level: LEVEL.INFO,
114
124
  format: args.format ?? JSON.stringify,
115
125
  console: args.console ?? global.console,
@@ -124,22 +134,22 @@ export function getLogger(
124
134
 
125
135
  export const DEFAULT_LOGGER = getLogger("default");
126
136
 
127
- export function debug(message: Display, data?: {}) {
137
+ export function debug(message: Display, data?: object) {
128
138
  if (data) DEFAULT_LOGGER.debug(message, data);
129
139
  else DEFAULT_LOGGER.debug(message);
130
140
  }
131
141
 
132
- export function info(message: Display, data?: {}) {
142
+ export function info(message: Display, data?: object) {
133
143
  if (data) DEFAULT_LOGGER.info(message, data);
134
144
  else DEFAULT_LOGGER.info(message);
135
145
  }
136
146
 
137
- export function warn(message: Display, data?: {}) {
147
+ export function warn(message: Display, data?: object) {
138
148
  if (data) DEFAULT_LOGGER.warn(message, data);
139
149
  else DEFAULT_LOGGER.warn(message);
140
150
  }
141
151
 
142
- export function error(message: Display, data?: {}) {
152
+ export function error(message: Display, data?: object) {
143
153
  if (data) DEFAULT_LOGGER.error(message, data);
144
154
  else DEFAULT_LOGGER.error(message);
145
155
  }
@@ -1,5 +1,5 @@
1
- import { display } from "../display.js"
2
- import { Observable } from "./observable.js"
1
+ import { display } from "../display.ts";
2
+ import type { Observable } from "./observable.ts";
3
3
 
4
4
  export interface Next<T> {
5
5
  value: T;
@@ -47,7 +47,7 @@ export const isNext = <T>(event: Event<T, unknown>): event is Next<T> =>
47
47
  export const isError = <E>(event: Event<unknown, E>): event is Error<E> =>
48
48
  event.failed && !event.completed;
49
49
  export const isCompleted = (
50
- event: Event<unknown, unknown>
50
+ event: Event<unknown, unknown>,
51
51
  ): event is Completed => event.completed && !event.failed;
52
52
  export const isFailed = (event: Event<unknown, unknown>): event is Failed =>
53
53
  event.completed && event.failed;
@@ -64,10 +64,10 @@ const marble = <T, E>(event: Event<T, E>): string =>
64
64
  isError(event)
65
65
  ? "X"
66
66
  : isFailed(event)
67
- ? "!"
68
- : isCompleted(event)
69
- ? "|"
70
- : `(${display(event.value)})`;
67
+ ? "!"
68
+ : isCompleted(event)
69
+ ? "|"
70
+ : `(${display(event.value)})`;
71
71
 
72
72
  export const marbles = <T, E>(events: Event<T, E>[]): string =>
73
73
  `:${events.map(marble).join("-")}`;
@@ -1,5 +1,5 @@
1
- import { describe, expect, it } from "../scope/index.js"
2
- import { Observable, Subject, filter, map } from "./observable.js"
1
+ import { describe, expect, it } from "../scope/index.ts";
2
+ import { filter, map, Observable, Subject } from "./observable.ts";
3
3
 
4
4
  describe("Observables", () => {
5
5
  describe("basics", () => {
@@ -23,7 +23,7 @@ describe("Observables", () => {
23
23
  describe("creation", () => {
24
24
  it("builds an observable of items", async () => {
25
25
  const stream = Observable.of(2, 4, 8, 16);
26
- let values: number[] = [];
26
+ const values: number[] = [];
27
27
  await new Promise<void>((resolve) => {
28
28
  stream.subscribe({
29
29
  next: (n) => {
@@ -1,16 +1,18 @@
1
- import { DEFAULT_LOGGER, Logger } from "../log.js"
1
+ import { assertExists } from "../assert.ts";
2
+ import type { Display } from "../display.ts";
3
+ import { DEFAULT_LOGGER, type Logger } from "../log.ts";
2
4
 
3
5
  export interface FullSubscriber<T, E> {
4
6
  // (t: T): void | Promise<undefined>;
5
- next?: (t: T) => void | Promise<undefined>;
6
- error?: (e: E) => void | Promise<undefined>;
7
- complete?: () => void | Promise<undefined>;
7
+ next?: (t: T) => void | Promise<void>;
8
+ error?: (e: E) => void | Promise<void>;
9
+ complete?: () => void | Promise<void>;
8
10
  }
9
11
 
10
12
  export type Subscriber<T, E> =
11
13
  | FullSubscriber<T, E>
12
14
  // | EventSubscriber<T, E>
13
- | ((t: T) => void | Promise<undefined>);
15
+ | ((t: T) => void | Promise<void>);
14
16
 
15
17
  export interface Subscription {
16
18
  // (): void;
@@ -23,7 +25,7 @@ export interface Observable<T, E = unknown> {
23
25
  pipe<T1>(o1: Subscriber<T, E> & Observable<T1, E>): Observable<T1, E>;
24
26
  pipe<T1, T2>(
25
27
  o1: Subscriber<T, E> & Observable<T1, E>,
26
- o2: Subscriber<T1, E> & Observable<T2, E>
28
+ o2: Subscriber<T1, E> & Observable<T2, E>,
27
29
  ): Observable<T2, E>;
28
30
  filter(fn: (t: T) => boolean): Observable<T, E>;
29
31
  distinct(fn?: (t1: T, t2: T) => boolean): Observable<T, E>;
@@ -45,7 +47,7 @@ export const Observable = {
45
47
  subject.complete();
46
48
  return;
47
49
  }
48
- const t = ts.shift()!;
50
+ const t = assertExists(ts.shift());
49
51
  await subject.next(t);
50
52
  next();
51
53
  })();
@@ -53,9 +55,9 @@ export const Observable = {
53
55
  },
54
56
  combineLatest<T1, T2, E>(
55
57
  o1: Observable<T1, E>,
56
- o2: Observable<T2, E>
58
+ o2: Observable<T2, E>,
57
59
  ): Observable<[T1, T2], E> {
58
- let latestSubject = new Subject<[T1, T2], E>();
60
+ const latestSubject = new Subject<[T1, T2], E>();
59
61
  let o1LatestSet = false;
60
62
  let o1Latest: T1;
61
63
  let o2LatestSet = false;
@@ -77,7 +79,7 @@ export const Observable = {
77
79
  o2sub.unsubscribe();
78
80
  }
79
81
 
80
- let o1sub = o1.subscribe({
82
+ const o1sub = o1.subscribe({
81
83
  next(t: T1) {
82
84
  o1Latest = t;
83
85
  o1LatestSet = true;
@@ -87,7 +89,7 @@ export const Observable = {
87
89
  complete,
88
90
  });
89
91
 
90
- let o2sub = o2.subscribe({
92
+ const o2sub = o2.subscribe({
91
93
  next(t: T2) {
92
94
  o2Latest = t;
93
95
  o2LatestSet = true;
@@ -102,25 +104,31 @@ export const Observable = {
102
104
  };
103
105
 
104
106
  interface Scheduler {
105
- execute(fn: () => (void | Promise<undefined>)[]): void | Promise<undefined>;
107
+ execute(fn: () => (void | Promise<void>)[]): void | Promise<void>;
106
108
  }
107
109
 
108
110
  export const AsyncScheduler: Scheduler = {
109
- execute(fn: () => Promise<undefined>[]): Promise<undefined> {
111
+ execute(fn: () => Promise<void>[]): Promise<void> {
110
112
  return Promise.all(fn()).then(() => undefined);
111
113
  },
112
114
  };
113
115
 
114
116
  export const SyncScheduler: Scheduler = {
115
- execute(fn: () => void[]): void {
117
+ execute(fn: () => undefined[]): void {
116
118
  fn();
117
119
  },
118
120
  };
119
121
 
122
+ let DefaultScheduler = SyncScheduler;
123
+ export function setDefaultScheduler(scheduler: Scheduler) {
124
+ DefaultScheduler = scheduler;
125
+ }
126
+
120
127
  export class Subject<T, E = unknown, T2 = T>
121
128
  implements FullSubscriber<T, E>, Observable<T, E>
122
129
  {
123
- #coldWaiters = new Set<Function>();
130
+ private readonly scheduler: Scheduler;
131
+ #coldWaiters = new Set<CallableFunction>();
124
132
  #subscribers = new Set<FullSubscriber<T, E>>();
125
133
  #complete = false;
126
134
 
@@ -136,34 +144,36 @@ export class Subject<T, E = unknown, T2 = T>
136
144
  return !this.hot;
137
145
  }
138
146
 
139
- constructor(private readonly scheduler: Scheduler = AsyncScheduler) {}
147
+ constructor(scheduler: Scheduler = DefaultScheduler) {
148
+ this.scheduler = scheduler;
149
+ }
140
150
 
141
- onWarm(fn: Function) {
151
+ onWarm(fn: CallableFunction) {
142
152
  if (this.cold) this.#coldWaiters.add(fn);
143
153
  }
144
154
 
145
- next(t: T | T2): void | Promise<undefined> {
155
+ next(t: T | T2): void | Promise<void> {
146
156
  if (this.#complete)
147
157
  throw new Error("Cannot call next on a completed subject");
148
158
  return this.scheduler.execute(() =>
149
- [...this.#subscribers].map((s) => s.next?.(t as T))
159
+ [...this.#subscribers].map((s) => s.next?.(t as T)),
150
160
  );
151
161
  }
152
162
 
153
- error(e: E): void | Promise<undefined> {
163
+ error(e: E): void | Promise<void> {
154
164
  if (this.#complete)
155
165
  throw new Error("Cannot call error on a completed subject");
156
166
  return this.scheduler.execute(() =>
157
- [...this.#subscribers].map((s) => s.error?.(e))
167
+ [...this.#subscribers].map((s) => s.error?.(e)),
158
168
  );
159
169
  }
160
170
 
161
- complete(): void | Promise<undefined> {
171
+ complete(): void | Promise<void> {
162
172
  if (this.#complete)
163
173
  throw new Error("Cannot call complete on a completed subject");
164
174
  this.#complete = true;
165
175
  const finished = this.scheduler.execute(() =>
166
- [...this.#subscribers].map((s) => s.complete?.())
176
+ [...this.#subscribers].map((s) => s.complete?.()),
167
177
  );
168
178
  this.#subscribers.clear(); // Free subscribers for garbage collection
169
179
  return finished;
@@ -179,7 +189,7 @@ export class Subject<T, E = unknown, T2 = T>
179
189
 
180
190
  this.#subscribers.add(subscriber);
181
191
 
182
- [...this.#coldWaiters].forEach((w) => w());
192
+ for (const w of this.#coldWaiters) w();
183
193
  this.#coldWaiters.clear();
184
194
 
185
195
  return {
@@ -191,7 +201,7 @@ export class Subject<T, E = unknown, T2 = T>
191
201
  pipe<T1>(o1: Subscriber<T, E> & Observable<T1, E>): Observable<T1, E>;
192
202
  pipe<T1, T2>(
193
203
  o1: Subscriber<T, E> & Observable<T1, E>,
194
- o2: Subscriber<T1, E> & Observable<T2, E>
204
+ o2: Subscriber<T1, E> & Observable<T2, E>,
195
205
  ): Observable<T2, E>;
196
206
  pipe(
197
207
  ...os: (Subscriber<unknown, unknown> & Observable<unknown, unknown>)[]
@@ -232,7 +242,7 @@ export class BehaviorSubject<T, E = unknown, T2 = T> extends Subject<T, E, T2> {
232
242
  #current: T;
233
243
 
234
244
  constructor(t: T, scheduler?: Scheduler) {
235
- super(scheduler);
245
+ super(scheduler ?? AsyncScheduler);
236
246
  this.#current = t;
237
247
  }
238
248
 
@@ -255,10 +265,12 @@ export class BehaviorSubject<T, E = unknown, T2 = T> extends Subject<T, E, T2> {
255
265
  }
256
266
 
257
267
  export class ReplaySubject<T, E = unknown> extends Subject<T, E> {
268
+ readonly n: number;
258
269
  #history: T[] = [];
259
270
 
260
- constructor(private readonly n: number, scheduler?: Scheduler) {
261
- super(scheduler);
271
+ constructor(n: number, scheduler?: Scheduler) {
272
+ super(scheduler ?? SyncScheduler);
273
+ this.n = n;
262
274
  }
263
275
 
264
276
  next(t: T) {
@@ -275,8 +287,8 @@ export class ReplaySubject<T, E = unknown> extends Subject<T, E> {
275
287
  }
276
288
  const history = [...this.#history];
277
289
  (function send() {
278
- if (history.length == 0) return;
279
- const t = history.shift()!;
290
+ if (history.length === 0) return;
291
+ const t = assertExists(history.shift());
280
292
  subscriber.next?.(t);
281
293
  new Promise(send);
282
294
  })();
@@ -295,27 +307,28 @@ export function eventListener<E extends Event>() {
295
307
  }
296
308
 
297
309
  export class EventHandler<E extends Event> extends Subject<E> {
298
- constructor(private readonly eventFn: (e: E) => void | Promise<undefined>) {
299
- super();
310
+ constructor(eventFn: (e: E) => void | Promise<void>) {
311
+ super(AsyncScheduler);
312
+ this.eventFn = eventFn;
300
313
  }
301
314
 
302
- next(e: E) {
315
+ async next(e: E): Promise<undefined> {
303
316
  e.preventDefault();
304
317
  super.next(e);
305
318
  }
306
319
  }
307
320
 
308
321
  export const watch =
309
- <T, E>(logger: Logger = DEFAULT_LOGGER) =>
322
+ <T extends Display, E extends Display>(logger: Logger = DEFAULT_LOGGER) =>
310
323
  (observable: Observable<T, E>) => {
311
324
  observable.tap({
312
- next(t: T) {
325
+ async next(t: T) {
313
326
  logger.info(t);
314
327
  },
315
- complete() {
328
+ async complete() {
316
329
  logger.info("Observable completed");
317
330
  },
318
- error(e: E) {
331
+ async error(e: E) {
319
332
  logger.warn(e);
320
333
  },
321
334
  });
@@ -325,11 +338,13 @@ class MapOperator<T, U, E>
325
338
  extends Subject<U, E, T>
326
339
  implements FullSubscriber<T, E>, Observable<U, E>
327
340
  {
328
- constructor(private readonly mapFn: (t: T) => U) {
329
- super();
341
+ private readonly mapFn: (t: T) => U;
342
+ constructor(mapFn: (t: T) => U) {
343
+ super(SyncScheduler);
344
+ this.mapFn = mapFn;
330
345
  }
331
346
 
332
- next(t: T): void | Promise<undefined> {
347
+ next(t: T): void | Promise<void> {
333
348
  return super.next(this.mapFn(t));
334
349
  }
335
350
  }
@@ -338,11 +353,13 @@ class FilterOperator<T, E>
338
353
  extends Subject<T, E>
339
354
  implements FullSubscriber<T, E>, Observable<T, E>
340
355
  {
341
- constructor(private readonly filterFn: (t: T) => boolean) {
342
- super();
356
+ private readonly filterFn: (t: T) => boolean;
357
+ constructor(filterFn: (t: T) => boolean) {
358
+ super(SyncScheduler);
359
+ this.filterFn = filterFn;
343
360
  }
344
361
 
345
- next(t: T): void | Promise<undefined> {
362
+ next(t: T): void | Promise<void> {
346
363
  return this.filterFn(t) ? super.next(t) : undefined;
347
364
  }
348
365
  }
@@ -352,19 +369,19 @@ class DistinctOperator<T, E>
352
369
  implements FullSubscriber<T, E>, Observable<T, E>
353
370
  {
354
371
  #prior: T | undefined = undefined;
372
+ private readonly distinctFn: (t1: T, t2: T) => boolean;
355
373
 
356
- constructor(
357
- private readonly distinctFn: (t1: T, t2: T) => boolean = Object.is
358
- ) {
359
- super();
374
+ constructor(distinctFn: (t1: T, t2: T) => boolean = Object.is) {
375
+ super(SyncScheduler);
376
+ this.distinctFn = distinctFn;
360
377
  }
361
378
 
362
- next(t: T): void | Promise<undefined> {
379
+ next(t: T): void | Promise<void> {
363
380
  if (this.#prior === undefined) {
364
381
  this.#prior = t;
365
382
  return super.next(t);
366
383
  }
367
- const same = this.distinctFn(this.#prior!, t);
384
+ const same = this.distinctFn(assertExists(this.#prior), t);
368
385
  if (!same) {
369
386
  this.#prior = t;
370
387
  return super.next(t);
@@ -374,8 +391,10 @@ class DistinctOperator<T, E>
374
391
  }
375
392
 
376
393
  class ReduceOperator<A, T, E> extends BehaviorSubject<A, E, T> {
377
- constructor(private readonly fn: (acc: A, t: T) => A, init: A) {
394
+ private readonly fn: (acc: A, t: T) => A;
395
+ constructor(fn: (acc: A, t: T) => A, init: A) {
378
396
  super(init);
397
+ this.fn = fn;
379
398
  }
380
399
 
381
400
  next(t: T) {
@@ -413,7 +432,7 @@ export class TapOperator<T, E> extends Subject<T, E> {
413
432
  }
414
433
 
415
434
  class FirstOperator<T, E> extends Subject<T, E> {
416
- next(t: T): void | Promise<undefined> {
435
+ next(t: T): void | Promise<void> {
417
436
  const next = super.next(t);
418
437
  this.complete();
419
438
  return next;
@@ -427,7 +446,7 @@ class LastOperator<T, E = Error> extends Subject<T, E> {
427
446
  this.#latest = t;
428
447
  }
429
448
 
430
- complete(): void | Promise<undefined> {
449
+ complete(): void | Promise<void> {
431
450
  if (this.#latest !== undefined) {
432
451
  super.next(this.#latest);
433
452
  }
@@ -2,14 +2,14 @@ import {
2
2
  Err,
3
3
  None,
4
4
  Ok,
5
- Result,
5
+ type Result,
6
6
  Some,
7
7
  unwrap,
8
8
  unwrapOr,
9
9
  unwrapOrElse,
10
- } from "./result.js";
11
- import { describe, it } from "./scope/describe.js";
12
- import { expect } from "./scope/expect.js";
10
+ } from "./result.ts";
11
+ import { describe, it } from "./scope/describe.ts";
12
+ import { expect } from "./scope/expect.ts";
13
13
 
14
14
  describe("Result", () => {
15
15
  it("converts Nones", () => {
@@ -40,7 +40,7 @@ describe("Result", () => {
40
40
  expect(b).toMatchObject({ message: "a error" });
41
41
 
42
42
  // Assign Err to Result
43
- const c: Result<string> = a;
43
+ const _c: Result<string> = a;
44
44
  });
45
45
 
46
46
  it("converts Oks", () => {
@@ -49,7 +49,7 @@ describe("Result", () => {
49
49
  expect(b).toBe("a ok");
50
50
 
51
51
  // Assign ok to Result
52
- const c: Result<string> = a;
52
+ const _c: Result<string> = a;
53
53
  });
54
54
 
55
55
  it("unwraps", () => {
@@ -95,10 +95,7 @@ describe("Result", () => {
95
95
  });
96
96
 
97
97
  it("allows Result<void> with Ok()", () => {
98
- let a: Result<void>;
99
- a = Ok();
98
+ const a: Result<void> = Ok();
100
99
  expect(unwrap(a)).toBe(undefined);
101
100
  });
102
101
  });
103
-
104
- export {};