@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,10 +1,7 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { contentResponse } from "./response.js";
4
- import { MiddlewareFactory } from "./index.js";
5
- // @ts-ignore
6
- import sass from "sass";
7
- const { compileStringAsync } = sass;
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import type { MiddlewareFactory } from "./index.ts";
4
+ import { contentResponse } from "./response.ts";
8
5
 
9
6
  function render(source: string) {
10
7
  // Replace `from "@scope` with `from "/@scope`, for browsers
@@ -14,17 +11,6 @@ function render(source: string) {
14
11
  return contentResponse(source, "text/css");
15
12
  }
16
13
 
17
- async function compile(
18
- filename: string,
19
- root: string,
20
- vars: string
21
- ): Promise<string> {
22
- vars = vars.substring(1).replaceAll("=", ":");
23
- filename = filename.replaceAll("\\", "/"); // Normalize for dart-sass
24
- const sassString = `// Using variables: ${vars}\n${vars};\n@import "${filename}";`;
25
- return (await compileStringAsync(sassString, { loadPaths: [root] })).css;
26
- }
27
-
28
14
  /**
29
15
  * Serves .css files statically. Finds .sass files and transpiles them to css.
30
16
  */
@@ -33,12 +19,14 @@ export const cssFileServer: MiddlewareFactory =
33
19
  async (req) => {
34
20
  const Url = new URL(req.url ?? "/", `http://${req.headers.host}`);
35
21
  if (Url.pathname.endsWith(".css")) {
36
- let scope = Object.entries(scopes).find(([s]) =>
37
- Url.pathname.startsWith(`/${s}`)
22
+ const scope = Object.entries(scopes).find(([s]) =>
23
+ Url.pathname.startsWith(`/${s}`),
38
24
  );
39
25
  // Expand url with found scope
40
26
  Url.protocol = "file";
41
- let url = scope ? Url.pathname.replace(scope[0], scope[1]) : Url.pathname;
27
+ const url = scope
28
+ ? Url.pathname.replace(scope[0], scope[1])
29
+ : Url.pathname;
42
30
  let filename = path.join(root, url);
43
31
  try {
44
32
  const stat = await fs.stat(filename);
@@ -52,11 +40,7 @@ export const cssFileServer: MiddlewareFactory =
52
40
  try {
53
41
  const stat = await fs.stat(filename);
54
42
  if (stat.isFile()) {
55
- const css = await compile(
56
- filename.replace(root, "."),
57
- root,
58
- Url.search
59
- );
43
+ const css = (await fs.readFile(filename)).toString();
60
44
  return render(css);
61
45
  }
62
46
  } catch {}
@@ -2,25 +2,26 @@
2
2
 
3
3
  import {
4
4
  createServer,
5
- IncomingMessage,
6
- RequestListener,
7
- ServerResponse,
8
- } from "http";
9
- import { AddressInfo } from "net";
10
- import * as path from "path";
11
- import { info } from "../../log.js";
12
- import { findIndex } from "./apps.js";
13
- import { cssFileServer } from "./css.js";
14
- import { fileResponse } from "./response.js";
15
- import { sitemap } from "./sitemap.js";
16
- import { staticFileServer } from "./static.js";
17
- import { tsFileServer } from "./typescript.js";
5
+ type IncomingMessage,
6
+ type RequestListener,
7
+ type ServerResponse,
8
+ } from "node:http";
9
+ import type { AddressInfo } from "node:net";
10
+ import * as path from "node:path";
11
+ import { info } from "../../log.ts";
12
+ import { findIndex } from "./apps.ts";
13
+ import { cssFileServer } from "./css.ts";
14
+ import { fileResponse } from "./response.ts";
15
+ import { sitemap } from "./sitemap.ts";
16
+ import { staticFileServer } from "./static.ts";
17
+ import { tsFileServer } from "./typescript.ts";
18
18
 
19
19
  export interface StaticResponse {
20
20
  status: 200 | 404 | 500;
21
21
  content: Buffer;
22
22
  contentType: string;
23
23
  contentLength?: number;
24
+ headers?: Map<string, string>;
24
25
  }
25
26
 
26
27
  export interface ServerConfig {
@@ -28,13 +29,13 @@ export interface ServerConfig {
28
29
  scopes?: Record<`@${string}`, string>;
29
30
  }
30
31
 
31
- export interface MiddlewareFactory {
32
- (config: ServerConfig): Promise<StaticMiddleware>;
33
- }
32
+ export type MiddlewareFactory = (
33
+ config: ServerConfig,
34
+ ) => Promise<StaticMiddleware>;
34
35
 
35
- export interface StaticMiddleware {
36
- (req: IncomingMessage): Promise<undefined | (() => Promise<StaticResponse>)>;
37
- }
36
+ export type StaticMiddleware = (
37
+ req: IncomingMessage,
38
+ ) => Promise<undefined | (() => Promise<StaticResponse>)>;
38
39
 
39
40
  const notFound: MiddlewareFactory =
40
41
  async ({ root }) =>
@@ -43,7 +44,7 @@ const notFound: MiddlewareFactory =
43
44
  // path.join(path.dirname(FLAGS.argv0), "404.html"),
44
45
  path.join(root, "404.html"),
45
46
  undefined,
46
- 404
47
+ 404,
47
48
  );
48
49
 
49
50
  const BASE_MIDDLEWARES: MiddlewareFactory[] = [
@@ -65,10 +66,15 @@ const error = (res: ServerResponse, message: string) => {
65
66
 
66
67
  const sendContent = async (
67
68
  res: ServerResponse,
68
- { content, contentType, contentLength }: StaticResponse
69
+ { content, contentType, contentLength, headers }: StaticResponse,
69
70
  ) => {
70
71
  res.setHeader("Content-Length", `${contentLength}`);
71
72
  res.setHeader("Content-Type", contentType);
73
+ if (headers) {
74
+ for (const [header, value] of headers.entries()) {
75
+ res.setHeader(header.toLowerCase(), value);
76
+ }
77
+ }
72
78
  await res.write(content);
73
79
  res.end();
74
80
  return true;
@@ -84,10 +90,10 @@ const log = (req: IncomingMessage) => {
84
90
 
85
91
  export const makeServer = async (
86
92
  config: ServerConfig,
87
- middlewares: MiddlewareFactory[] = []
93
+ middlewares: MiddlewareFactory[] = [],
88
94
  ) => {
89
95
  const handlers = await Promise.all(
90
- [...middlewares, ...BASE_MIDDLEWARES].map(async (m) => m(config))
96
+ [...middlewares, ...BASE_MIDDLEWARES].map(async (m) => m(config)),
91
97
  );
92
98
  const middlewareHandler: RequestListener = async (req, res) => {
93
99
  log(req);
@@ -105,7 +111,7 @@ export const makeServer = async (
105
111
  res.end();
106
112
  }
107
113
  } catch (e) {
108
- error(res, (e as Error).message + "\n" + (e as Error).stack);
114
+ error(res, `${(e as Error).message}\n${(e as Error).stack}`);
109
115
  }
110
116
  };
111
117
 
@@ -1,9 +1,10 @@
1
- import { Stats } from "fs";
2
- import * as fs from "fs/promises";
3
- import { StaticResponse } from ".";
1
+ import type { Stats } from "node:fs";
2
+ import * as fs from "node:fs/promises";
3
+ import type { StaticResponse } from ".";
4
4
 
5
5
  const MIME_TYPES: Record<string, string> = {
6
6
  js: "text/javascript",
7
+ ts: "text/javascript",
7
8
  json: "text/javascript",
8
9
  css: "text/css",
9
10
  html: "text/html",
@@ -38,13 +39,19 @@ export const fileResponse =
38
39
 
39
40
  const CHARSET = "utf-8";
40
41
  export const contentResponse =
41
- (content: string, contentType: string, status: 200 | 404 | 500 = 200) =>
42
+ (
43
+ content: string,
44
+ contentType: string,
45
+ status: 200 | 404 | 500 = 200,
46
+ headers: Map<string, string> = new Map(),
47
+ ) =>
42
48
  async (): Promise<StaticResponse> => {
43
49
  const contentBuffer = Buffer.from(content, CHARSET);
44
50
  return {
45
51
  content: contentBuffer,
46
- contentType: contentType.split(";")[0] + "; charset=" + CHARSET,
52
+ contentType: `${contentType.split(";")[0]}; charset=${CHARSET}`,
47
53
  status,
48
54
  contentLength: contentBuffer.length,
55
+ headers,
49
56
  };
50
57
  };
@@ -1,8 +1,8 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { info } from "../../log.js";
4
- import { MiddlewareFactory } from "./index.js";
5
- import { contentResponse } from "./response.js";
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { info } from "../../log.ts";
4
+ import type { MiddlewareFactory } from "./index.ts";
5
+ import { contentResponse } from "./response.ts";
6
6
 
7
7
  const findSiteMap = async (root: string, prefix = root) => {
8
8
  if (root.startsWith("node_modules")) {
@@ -16,8 +16,8 @@ const findSiteMap = async (root: string, prefix = root) => {
16
16
  .replaceAll(path.sep, "/");
17
17
  if (entry.isFile()) {
18
18
  if (entry.name === "index.html") {
19
- let index = next.replace(prefix, "");
20
- info(`Adding to sitemap`, { index });
19
+ const index = next.replace(prefix, "");
20
+ info("Adding to sitemap", { index });
21
21
  return [index];
22
22
  }
23
23
  } else if (entry.isDirectory()) {
@@ -30,7 +30,7 @@ const findSiteMap = async (root: string, prefix = root) => {
30
30
  return flattened;
31
31
  }
32
32
  return [];
33
- }
33
+ },
34
34
  );
35
35
  return children;
36
36
  };
@@ -1,15 +1,15 @@
1
- import * as path from "path";
2
- import * as fs from "fs/promises";
3
- import { fileResponse } from "./response.js";
4
- import type { MiddlewareFactory } from "./index.js";
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import type { MiddlewareFactory } from "./index.ts";
4
+ import { fileResponse } from "./response.ts";
5
5
 
6
6
  export const staticFileServer: MiddlewareFactory =
7
7
  async ({ root, scopes = {} }) =>
8
8
  async (req) => {
9
9
  const scope = Object.entries(scopes).find(([s]) =>
10
- req.url?.startsWith(`/${s}`)
10
+ req.url?.startsWith(`/${s}`),
11
11
  );
12
- const url = new URL(req.url ?? "", `http://localhost`);
12
+ const url = new URL(req.url ?? "", "http://localhost");
13
13
  const pathname = scope
14
14
  ? url.pathname.replace(scope[0], scope[1])
15
15
  : url.pathname;
@@ -21,6 +21,9 @@ export const staticFileServer: MiddlewareFactory =
21
21
  const stat = await fs.stat(filename);
22
22
  return stat.isDirectory() ? undefined : fileResponse(filename, stat);
23
23
  } catch (e) {
24
+ if ((e as { code?: string }).code === "ENOENT") {
25
+ return fileResponse(filename, undefined, 404);
26
+ }
24
27
  console.error(e);
25
28
  return undefined;
26
29
  }
@@ -1,15 +1,15 @@
1
- import * as fs from "fs/promises";
2
- import * as path from "path";
3
- import { contentResponse } from "./response.js";
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
4
3
  import { transpile } from "../../transpile.mjs";
5
- import { MiddlewareFactory } from "./index.js";
4
+ import type { MiddlewareFactory } from "./index.ts";
5
+ import { contentResponse } from "./response.ts";
6
6
 
7
- function render(source: string) {
7
+ function render(source: string, headers: Map<string, string>) {
8
8
  // Replace `from "@scope` with `from "/@scope`, for browsers
9
9
  source = source
10
10
  .replaceAll(`from "@`, 'from "/@')
11
11
  .replaceAll(`import("@`, 'import("/@');
12
- return contentResponse(source, "application/javascript");
12
+ return contentResponse(source, "application/javascript", 200, headers);
13
13
  }
14
14
 
15
15
  /**
@@ -18,29 +18,29 @@ function render(source: string) {
18
18
  export const tsFileServer: MiddlewareFactory =
19
19
  async ({ root, scopes = {} }) =>
20
20
  async (req) => {
21
- if (req.url?.endsWith(".js")) {
22
- let scope = Object.entries(scopes).find(([s]) =>
23
- req.url?.startsWith(`/${s}`)
21
+ if (req.url?.endsWith(".js") || req.url?.endsWith(".ts")) {
22
+ const scope = Object.entries(scopes).find(([s]) =>
23
+ req.url?.startsWith(`/${s}`),
24
24
  );
25
25
  // Expand url with found scope
26
- let url = scope ? req.url.replace(scope[0], scope[1]) : req.url;
26
+ const url = scope ? req.url.replace(scope[0], scope[1]) : req.url;
27
27
  let filename = path.join(root, url);
28
- try {
29
- const stat = await fs.stat(filename);
30
- if (stat.isFile()) {
31
- const js = (await fs.readFile(filename)).toString("utf-8");
32
- return render(js);
28
+ const stat = await fs.stat(filename);
29
+ if (stat.isFile()) {
30
+ let js: string;
31
+ const headers: Map<string, string> = new Map();
32
+ if (filename.endsWith(".ts")) {
33
+ js = await transpile(filename, () => fs.readFile(filename));
34
+ headers.set("SourceMap", `${url}.map`);
35
+ js += `\n//# sourceURL=${url}`;
36
+ } else {
37
+ if (url.endsWith(".ts.map")) {
38
+ filename = filename.replace(/\.map$/, "");
39
+ }
40
+ js = (await fs.readFile(filename)).toString("utf-8");
33
41
  }
34
- } catch {}
35
-
36
- filename = filename.replace(/\.js$/, ".ts");
37
- try {
38
- const stat = await fs.stat(filename);
39
- if (stat.isFile()) {
40
- const js = await transpile(filename, () => fs.readFile(filename));
41
- return render(js);
42
- }
43
- } catch {}
42
+ return render(js, headers);
43
+ }
44
44
  }
45
45
  return undefined;
46
46
  };
@@ -1,19 +1,22 @@
1
1
  #!/usr/bin/env node --experimental-loader ../loader.mjs
2
+ import * as process from "node:process";
3
+
4
+ import { info } from "../log.ts";
2
5
 
3
- import { info } from "../log.js";
4
6
  info("Starting server", { cwd: process.cwd() });
5
7
 
6
- import { parse } from "../flags.js";
8
+ import { parse } from "../flags.ts";
9
+
7
10
  const FLAGS = parse(process.argv);
8
11
 
9
- import { makeServer } from "./http/index.js";
10
12
  import * as path from "node:path";
13
+ import { makeServer } from "./http/index.ts";
11
14
 
12
15
  async function main() {
13
16
  const server = await makeServer({ root: path.join(process.cwd(), "src") });
14
17
  server.listen(
15
18
  FLAGS.asNumber("port", 8080),
16
- FLAGS.asString("host", "0.0.0.0")
19
+ FLAGS.asString("host", "0.0.0.0"),
17
20
  );
18
21
  }
19
22
 
package/src/test.mjs CHANGED
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { parse } from "./flags.js";
4
- import { execute } from "./scope/execute.js";
5
- import { asXML } from "./scope/display/junit.js";
6
- import { onConsole } from "./scope/display/console.js";
3
+ import { parse } from "./flags.ts";
4
+ import { onConsole } from "./scope/display/console.ts";
5
+ import { asXML } from "./scope/display/junit.ts";
6
+ import { execute } from "./scope/execute.ts";
7
7
 
8
8
  async function main() {
9
- await import("./test_all.js");
9
+ await import("./test_all.ts");
10
10
 
11
- (async function () {
11
+ (async () => {
12
12
  const results = await execute();
13
13
 
14
14
  const FLAGS = parse(process.argv);
15
15
 
16
16
  switch (FLAGS.asString("mode", "console")) {
17
- case "junit":
17
+ case "junit": {
18
18
  const xml = asXML(results);
19
19
  console.log(xml);
20
20
  break;
21
- case "console":
21
+ }
22
22
  default:
23
23
  onConsole(results);
24
24
  break;
package/src/test_all.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  // This file must be .js for imports to run. Unused imports in .ts files are
2
2
  // discarded during transpilation.
3
- import { describe, expect, it } from "./scope/index.js";
3
+ import { describe, expect, it } from "./scope/index.ts";
4
4
 
5
5
  describe("Test executor", () => {
6
6
  it("matches equality", () => {
@@ -12,20 +12,23 @@ describe("Test executor", () => {
12
12
  });
13
13
  });
14
14
 
15
- import "./context.test.js";
16
- import "./diff.test.js";
17
- import "./equal.test.js";
18
- import "./flags.test.js";
19
- import "./fs.test.js";
20
- import "./generator.test.js";
21
- import "./lock.test.js";
22
- import "./result.test.js";
23
- import "./observable/observable.test.js";
15
+ import "./context.test.ts";
16
+ import "./diff.test.ts";
17
+ import "./equal.test.ts";
18
+ import "./flags.test.ts";
19
+ import "./fs.test.ts";
20
+ import "./generator.test.ts";
21
+ import "./lock.test.ts";
22
+ import "./result.test.ts";
23
+ import "./observable/observable.test.ts";
24
24
 
25
- if (typeof process != "undefined" && process.env.CI?.toLowerCase() !== "true") {
25
+ if (
26
+ typeof process !== "undefined" &&
27
+ process.env.CI?.toLowerCase() !== "true"
28
+ ) {
26
29
  (async () => {
27
- const components = await import("./components/test.js");
28
- const dom = await import("./dom/test.js");
30
+ const components = await import("./components/test.ts");
31
+ const dom = await import("./dom/test.ts");
29
32
  await components.loadTests();
30
33
  await dom.loadTests();
31
34
  })();
package/src/transpile.mjs CHANGED
@@ -1,28 +1,16 @@
1
- // @ts-ignore
2
- import ts from "typescript";
3
-
4
- const compilerOptions = {
5
- target: ts.ScriptTarget.ESNext,
6
- module: ts.ModuleKind.ESNext,
7
- inlineSourceMap: true,
8
- inlineSources: true,
9
- };
1
+ // @ts-expect-error
2
+ import tsBlankSpace from "ts-blank-space";
10
3
 
11
4
  const tsmap = new Map();
12
5
 
13
6
  export async function transpile(
14
7
  /** @type string */ url,
15
- /** @type {() => Promise<{toString(): string}>} */ get
8
+ /** @type {() => Promise<{toString(): string}>} */ get,
16
9
  ) {
17
10
  if (!tsmap.has(url)) {
18
- const source = ts.transpile(
19
- (await get()).toString(),
20
- compilerOptions,
21
- url,
22
- undefined,
23
- url
24
- );
25
- tsmap.set(url, source);
11
+ const source = (await get()).toString();
12
+ const js = tsBlankSpace(source);
13
+ tsmap.set(url, js);
26
14
  }
27
15
 
28
16
  return tsmap.get(url);