@adviser/cement 0.2.28 → 0.2.30

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 (318) hide show
  1. package/{base-sys-abstraction-C9WW3w57.d.cts → base-sys-abstraction-BkEiLHl0.d.ts} +8 -4
  2. package/{base-sys-abstraction-C9WW3w57.d.ts → base-sys-abstraction-Qj7pkY1N.d.cts} +8 -4
  3. package/{chunk-OXD3YZZ7.js → chunk-7KFVMTOS.js} +3 -47
  4. package/chunk-7KFVMTOS.js.map +1 -0
  5. package/{chunk-P5RXA4C4.js → chunk-GES3MUGV.js} +24 -27
  6. package/{chunk-LCPYQVWT.js.map → chunk-GES3MUGV.js.map} +1 -1
  7. package/{chunk-YDIUMYIE.js → chunk-Q65HLCNL.js} +8 -7
  8. package/chunk-Q65HLCNL.js.map +1 -0
  9. package/{chunk-DPIL5UIL.js → chunk-WMMUXBDX.js} +6 -2
  10. package/chunk-WMMUXBDX.js.map +1 -0
  11. package/{index-Dhb2fQiw.d.cts → index-Q3phXzYr.d.cts} +2 -21
  12. package/{index-CcsGcehs.d.ts → index-tIGZMHTc.d.ts} +2 -21
  13. package/index.cjs +288 -7345
  14. package/index.cjs.map +1 -1
  15. package/index.d.cts +74 -12
  16. package/index.d.ts +74 -12
  17. package/index.js +239 -7266
  18. package/index.js.map +1 -1
  19. package/node/index.cjs +220 -39
  20. package/node/index.cjs.map +1 -1
  21. package/node/index.d.cts +22 -4
  22. package/node/index.d.ts +22 -4
  23. package/node/index.js +201 -25
  24. package/node/index.js.map +1 -1
  25. package/package.json +34 -23
  26. package/src/LICENSE +201 -0
  27. package/src/README.md +39 -0
  28. package/src/base-sys-abstraction.ts +242 -0
  29. package/src/bin2text.ts +47 -0
  30. package/src/crypto.ts +125 -0
  31. package/src/file-service.ts +24 -0
  32. package/src/future.ts +27 -0
  33. package/src/index.ts +23 -0
  34. package/src/jsr.json +22 -0
  35. package/src/log-level-impl.ts +87 -0
  36. package/src/log-writer-impl.ts +58 -0
  37. package/src/logger-impl.ts +498 -0
  38. package/src/logger.ts +208 -0
  39. package/src/node/deno-file-service.ts +92 -0
  40. package/src/node/deno-sys-abstraction.ts +133 -0
  41. package/src/node/index.ts +4 -0
  42. package/src/node/mock-file-service.ts +45 -0
  43. package/src/node/node-file-service.ts +91 -0
  44. package/src/node/node-sys-abstraction.ts +121 -0
  45. package/src/option.ts +60 -0
  46. package/src/refcounted.ts +23 -0
  47. package/src/resolve-once.ts +179 -0
  48. package/src/result.ts +165 -0
  49. package/src/runtime.ts +36 -0
  50. package/src/sys-abstraction.ts +53 -0
  51. package/src/sys-env.ts +216 -0
  52. package/src/test/log-write-stream.ts +95 -0
  53. package/src/test/mock-logger.ts +40 -0
  54. package/src/time.ts +20 -0
  55. package/src/tracer.ts +222 -0
  56. package/src/txt-en-decoder.ts +21 -0
  57. package/src/uri.ts +421 -0
  58. package/src/utils/console-write-stream.ts +72 -0
  59. package/src/utils/fanout-write-stream.ts +32 -0
  60. package/src/utils/index.ts +6 -0
  61. package/src/utils/rebuffer.ts +75 -0
  62. package/src/utils/stream-map.ts +67 -0
  63. package/src/utils/stream2string.ts +47 -0
  64. package/src/utils/string2stream.ts +14 -0
  65. package/src/version.ts +3 -0
  66. package/src/web/index.ts +1 -0
  67. package/src/web/web-sys-abstraction.ts +80 -0
  68. package/ts/base-sys-abstraction.d.ts +84 -0
  69. package/ts/base-sys-abstraction.d.ts.map +1 -0
  70. package/ts/base-sys-abstraction.js +178 -0
  71. package/ts/base-sys-abstraction.js.map +1 -0
  72. package/ts/base-sys-abstraction.test.d.ts +2 -0
  73. package/ts/base-sys-abstraction.test.d.ts.map +1 -0
  74. package/ts/base-sys-abstraction.test.js +82 -0
  75. package/ts/base-sys-abstraction.test.js.map +1 -0
  76. package/ts/bin2text.d.ts +3 -0
  77. package/ts/bin2text.d.ts.map +1 -0
  78. package/ts/bin2text.js +43 -0
  79. package/ts/bin2text.js.map +1 -0
  80. package/ts/bin2text.test.d.ts +2 -0
  81. package/ts/bin2text.test.d.ts.map +1 -0
  82. package/ts/bin2text.test.js +51 -0
  83. package/ts/bin2text.test.js.map +1 -0
  84. package/ts/crypto.d.ts +76 -0
  85. package/ts/crypto.d.ts.map +1 -0
  86. package/ts/crypto.js +22 -0
  87. package/ts/crypto.js.map +1 -0
  88. package/ts/crypto.test.d.ts +2 -0
  89. package/ts/crypto.test.d.ts.map +1 -0
  90. package/ts/crypto.test.js +14 -0
  91. package/ts/crypto.test.js.map +1 -0
  92. package/ts/file-service.d.ts +17 -0
  93. package/ts/file-service.d.ts.map +1 -0
  94. package/ts/file-service.js +2 -0
  95. package/ts/file-service.js.map +1 -0
  96. package/ts/future.d.ts +8 -0
  97. package/ts/future.d.ts.map +1 -0
  98. package/ts/future.js +38 -0
  99. package/ts/future.js.map +1 -0
  100. package/ts/future.test.d.ts +2 -0
  101. package/ts/future.test.d.ts.map +1 -0
  102. package/ts/future.test.js +28 -0
  103. package/ts/future.test.js.map +1 -0
  104. package/ts/index.d.ts +24 -0
  105. package/ts/index.d.ts.map +1 -0
  106. package/ts/index.js +24 -0
  107. package/ts/index.js.map +1 -0
  108. package/ts/log-level-impl.d.ts +14 -0
  109. package/ts/log-level-impl.d.ts.map +1 -0
  110. package/ts/log-level-impl.js +72 -0
  111. package/ts/log-level-impl.js.map +1 -0
  112. package/ts/log-writer-impl.d.ts +10 -0
  113. package/ts/log-writer-impl.d.ts.map +1 -0
  114. package/ts/log-writer-impl.js +45 -0
  115. package/ts/log-writer-impl.js.map +1 -0
  116. package/ts/logger-impl.d.ts +71 -0
  117. package/ts/logger-impl.d.ts.map +1 -0
  118. package/ts/logger-impl.js +412 -0
  119. package/ts/logger-impl.js.map +1 -0
  120. package/ts/logger.d.ts +84 -0
  121. package/ts/logger.d.ts.map +1 -0
  122. package/ts/logger.js +114 -0
  123. package/ts/logger.js.map +1 -0
  124. package/ts/logger.test.d.ts +2 -0
  125. package/ts/logger.test.d.ts.map +1 -0
  126. package/ts/logger.test.js +1023 -0
  127. package/ts/logger.test.js.map +1 -0
  128. package/ts/node/deno-file-service.d.ts +17 -0
  129. package/ts/node/deno-file-service.d.ts.map +1 -0
  130. package/ts/node/deno-file-service.js +65 -0
  131. package/ts/node/deno-file-service.js.map +1 -0
  132. package/ts/node/deno-sys-abstraction.d.ts +22 -0
  133. package/ts/node/deno-sys-abstraction.d.ts.map +1 -0
  134. package/ts/node/deno-sys-abstraction.js +101 -0
  135. package/ts/node/deno-sys-abstraction.js.map +1 -0
  136. package/ts/node/index.d.ts +5 -0
  137. package/ts/node/index.d.ts.map +1 -0
  138. package/ts/node/index.js +5 -0
  139. package/ts/node/index.js.map +1 -0
  140. package/ts/node/mock-file-service.d.ts +11 -0
  141. package/ts/node/mock-file-service.d.ts.map +1 -0
  142. package/ts/node/mock-file-service.js +34 -0
  143. package/ts/node/mock-file-service.js.map +1 -0
  144. package/ts/node/mock-file-service.test.d.ts +2 -0
  145. package/ts/node/mock-file-service.test.d.ts.map +1 -0
  146. package/ts/node/mock-file-service.test.js +31 -0
  147. package/ts/node/mock-file-service.test.js.map +1 -0
  148. package/ts/node/node-file-service.d.ts +16 -0
  149. package/ts/node/node-file-service.d.ts.map +1 -0
  150. package/ts/node/node-file-service.js +71 -0
  151. package/ts/node/node-file-service.js.map +1 -0
  152. package/ts/node/node-sys-abstraction.d.ts +22 -0
  153. package/ts/node/node-sys-abstraction.d.ts.map +1 -0
  154. package/ts/node/node-sys-abstraction.js +99 -0
  155. package/ts/node/node-sys-abstraction.js.map +1 -0
  156. package/ts/node/node-sys-abstraction.test.d.ts +2 -0
  157. package/ts/node/node-sys-abstraction.test.d.ts.map +1 -0
  158. package/ts/node/node-sys-abstraction.test.js +83 -0
  159. package/ts/node/node-sys-abstraction.test.js.map +1 -0
  160. package/ts/option.d.ts +25 -0
  161. package/ts/option.d.ts.map +1 -0
  162. package/ts/option.js +47 -0
  163. package/ts/option.js.map +1 -0
  164. package/ts/refcounted.d.ts +2 -0
  165. package/ts/refcounted.d.ts.map +1 -0
  166. package/ts/refcounted.js +19 -0
  167. package/ts/refcounted.js.map +1 -0
  168. package/ts/refcounted.test.d.ts +2 -0
  169. package/ts/refcounted.test.d.ts.map +1 -0
  170. package/ts/refcounted.test.js +39 -0
  171. package/ts/refcounted.test.js.map +1 -0
  172. package/ts/resolve-once.d.ts +46 -0
  173. package/ts/resolve-once.d.ts.map +1 -0
  174. package/ts/resolve-once.js +152 -0
  175. package/ts/resolve-once.js.map +1 -0
  176. package/ts/resolve-once.test.d.ts +2 -0
  177. package/ts/resolve-once.test.d.ts.map +1 -0
  178. package/ts/resolve-once.test.js +283 -0
  179. package/ts/resolve-once.test.js.map +1 -0
  180. package/ts/result.d.ts +34 -0
  181. package/ts/result.d.ts.map +1 -0
  182. package/ts/result.js +85 -0
  183. package/ts/result.js.map +1 -0
  184. package/ts/result.test.d.ts +2 -0
  185. package/ts/result.test.d.ts.map +1 -0
  186. package/ts/result.test.js +79 -0
  187. package/ts/result.test.js.map +1 -0
  188. package/ts/runtime.d.ts +8 -0
  189. package/ts/runtime.d.ts.map +1 -0
  190. package/ts/runtime.js +26 -0
  191. package/ts/runtime.js.map +1 -0
  192. package/ts/sys-abstraction.d.ts +36 -0
  193. package/ts/sys-abstraction.d.ts.map +1 -0
  194. package/ts/sys-abstraction.js +31 -0
  195. package/ts/sys-abstraction.js.map +1 -0
  196. package/ts/sys-env.d.ts +48 -0
  197. package/ts/sys-env.d.ts.map +1 -0
  198. package/ts/sys-env.js +176 -0
  199. package/ts/sys-env.js.map +1 -0
  200. package/ts/sys-env.test.d.ts +2 -0
  201. package/ts/sys-env.test.d.ts.map +1 -0
  202. package/ts/sys-env.test.js +51 -0
  203. package/ts/sys-env.test.js.map +1 -0
  204. package/ts/test/log-write-stream.d.ts +27 -0
  205. package/ts/test/log-write-stream.d.ts.map +1 -0
  206. package/ts/test/log-write-stream.js +74 -0
  207. package/ts/test/log-write-stream.js.map +1 -0
  208. package/ts/test/mock-logger.d.ts +14 -0
  209. package/ts/test/mock-logger.d.ts.map +1 -0
  210. package/ts/test/mock-logger.js +29 -0
  211. package/ts/test/mock-logger.js.map +1 -0
  212. package/ts/test/mock-logger.test.d.ts +2 -0
  213. package/ts/test/mock-logger.test.d.ts.map +1 -0
  214. package/ts/test/mock-logger.test.js +63 -0
  215. package/ts/test/mock-logger.test.js.map +1 -0
  216. package/ts/test/test-exit-handler.d.ts +2 -0
  217. package/ts/test/test-exit-handler.d.ts.map +1 -0
  218. package/ts/test/test-exit-handler.js +57 -0
  219. package/ts/test/test-exit-handler.js.map +1 -0
  220. package/ts/time.d.ts +13 -0
  221. package/ts/time.d.ts.map +1 -0
  222. package/ts/time.js +14 -0
  223. package/ts/time.js.map +1 -0
  224. package/ts/tracer.d.ts +59 -0
  225. package/ts/tracer.d.ts.map +1 -0
  226. package/ts/tracer.js +148 -0
  227. package/ts/tracer.js.map +1 -0
  228. package/ts/tracer.test.d.ts +2 -0
  229. package/ts/tracer.test.d.ts.map +1 -0
  230. package/ts/tracer.test.js +311 -0
  231. package/ts/tracer.test.js.map +1 -0
  232. package/ts/txt-en-decoder.d.ts +10 -0
  233. package/ts/txt-en-decoder.d.ts.map +1 -0
  234. package/ts/txt-en-decoder.js +15 -0
  235. package/ts/txt-en-decoder.js.map +1 -0
  236. package/ts/uri.d.ts +67 -0
  237. package/ts/uri.d.ts.map +1 -0
  238. package/ts/uri.js +283 -0
  239. package/ts/uri.js.map +1 -0
  240. package/ts/uri.test.d.ts +2 -0
  241. package/ts/uri.test.d.ts.map +1 -0
  242. package/ts/uri.test.js +119 -0
  243. package/ts/uri.test.js.map +1 -0
  244. package/ts/utils/console-write-stream.d.ts +21 -0
  245. package/ts/utils/console-write-stream.d.ts.map +1 -0
  246. package/ts/utils/console-write-stream.js +62 -0
  247. package/ts/utils/console-write-stream.js.map +1 -0
  248. package/ts/utils/fanout-write-stream.d.ts +12 -0
  249. package/ts/utils/fanout-write-stream.d.ts.map +1 -0
  250. package/ts/utils/fanout-write-stream.js +24 -0
  251. package/ts/utils/fanout-write-stream.js.map +1 -0
  252. package/ts/utils/index.d.ts +7 -0
  253. package/ts/utils/index.d.ts.map +1 -0
  254. package/ts/utils/index.js +7 -0
  255. package/ts/utils/index.js.map +1 -0
  256. package/ts/utils/rebuffer.d.ts +3 -0
  257. package/ts/utils/rebuffer.d.ts.map +1 -0
  258. package/ts/utils/rebuffer.js +60 -0
  259. package/ts/utils/rebuffer.js.map +1 -0
  260. package/ts/utils/rebuffer.test.d.ts +2 -0
  261. package/ts/utils/rebuffer.test.d.ts.map +1 -0
  262. package/ts/utils/rebuffer.test.js +77 -0
  263. package/ts/utils/rebuffer.test.js.map +1 -0
  264. package/ts/utils/stream-map.d.ts +9 -0
  265. package/ts/utils/stream-map.d.ts.map +1 -0
  266. package/ts/utils/stream-map.js +62 -0
  267. package/ts/utils/stream-map.js.map +1 -0
  268. package/ts/utils/stream-map.test.d.ts +2 -0
  269. package/ts/utils/stream-map.test.d.ts.map +1 -0
  270. package/ts/utils/stream-map.test.js +87 -0
  271. package/ts/utils/stream-map.test.js.map +1 -0
  272. package/ts/utils/stream-test-helper.d.ts +17 -0
  273. package/ts/utils/stream-test-helper.d.ts.map +1 -0
  274. package/ts/utils/stream-test-helper.js +37 -0
  275. package/ts/utils/stream-test-helper.js.map +1 -0
  276. package/ts/utils/stream2string.d.ts +3 -0
  277. package/ts/utils/stream2string.d.ts.map +1 -0
  278. package/ts/utils/stream2string.js +48 -0
  279. package/ts/utils/stream2string.js.map +1 -0
  280. package/ts/utils/stream2string.test.d.ts +2 -0
  281. package/ts/utils/stream2string.test.d.ts.map +1 -0
  282. package/ts/utils/stream2string.test.js +29 -0
  283. package/ts/utils/stream2string.test.js.map +1 -0
  284. package/ts/utils/string2stream.d.ts +4 -0
  285. package/ts/utils/string2stream.d.ts.map +1 -0
  286. package/ts/utils/string2stream.js +13 -0
  287. package/ts/utils/string2stream.js.map +1 -0
  288. package/ts/utils/string2stream.test.d.ts +2 -0
  289. package/ts/utils/string2stream.test.d.ts.map +1 -0
  290. package/ts/utils/string2stream.test.js +6 -0
  291. package/ts/utils/string2stream.test.js.map +1 -0
  292. package/ts/version.d.ts +2 -0
  293. package/ts/version.d.ts.map +1 -0
  294. package/ts/version.js +4 -0
  295. package/ts/version.js.map +1 -0
  296. package/ts/web/index.d.ts +2 -0
  297. package/ts/web/index.d.ts.map +1 -0
  298. package/ts/web/index.js +2 -0
  299. package/ts/web/index.js.map +1 -0
  300. package/ts/web/web-sys-abstraction.d.ts +4 -0
  301. package/ts/web/web-sys-abstraction.d.ts.map +1 -0
  302. package/ts/web/web-sys-abstraction.js +64 -0
  303. package/ts/web/web-sys-abstraction.js.map +1 -0
  304. package/utils/index.cjs +0 -42
  305. package/utils/index.cjs.map +1 -1
  306. package/utils/index.d.cts +1 -2
  307. package/utils/index.d.ts +1 -2
  308. package/utils/index.js +2 -7
  309. package/web/index.cjs +25 -7
  310. package/web/index.cjs.map +1 -1
  311. package/web/index.d.cts +2 -1
  312. package/web/index.d.ts +2 -1
  313. package/web/index.js +3 -3
  314. package/chunk-DPIL5UIL.js.map +0 -1
  315. package/chunk-LCPYQVWT.js +0 -21
  316. package/chunk-OXD3YZZ7.js.map +0 -1
  317. package/chunk-P5RXA4C4.js.map +0 -1
  318. package/chunk-YDIUMYIE.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { FileService, NamedWritableStream } from "../file-service.js";
2
+ import { TxtEnDecoder, Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
3
+ import * as path from "node:path";
4
+
5
+ const Deno = (globalThis as unknown as { Deno: unknown }).Deno as {
6
+ cwd(): string;
7
+ readFile(fname: string): Promise<Uint8Array>;
8
+ mkdir(base: string, options: { recursive: boolean }): Promise<void>;
9
+ open(fname: string, options: { write: boolean; create: boolean; truncate: boolean }): Promise<WritableStream>;
10
+ };
11
+
12
+ export class DenoFileService implements FileService {
13
+ readonly baseDir: string;
14
+ readonly txtEnde: TxtEnDecoder;
15
+ constructor(baseDir: string = Deno.cwd(), txtEnde: TxtEnDecoder = Utf8EnDecoderSingleton()) {
16
+ this.baseDir = this.abs(baseDir);
17
+ this.txtEnde = txtEnde;
18
+ }
19
+
20
+ // nodeImport(fname: string): string {
21
+ // // console.log('nodeImport:'+ fname);
22
+ // if (path.isAbsolute(fname)) {
23
+ // return fname;
24
+ // } else {
25
+ // return "./" + path.normalize(fname);
26
+ // }
27
+ // }
28
+
29
+ async readFileString(fname: string): Promise<string> {
30
+ return this.txtEnde.decode(await Deno.readFile(fname));
31
+ }
32
+
33
+ dirname(fname: string): string {
34
+ return path.dirname(fname);
35
+ }
36
+ basename(fname: string): string {
37
+ return path.basename(fname);
38
+ }
39
+
40
+ join(...paths: string[]): string {
41
+ return path.join(...paths);
42
+ }
43
+
44
+ relative(from: string, to?: string): string {
45
+ if (to === undefined) {
46
+ to = from;
47
+ from = Deno.cwd();
48
+ }
49
+ const ret = path.relative(from, to);
50
+ // console.log('relative:'+ from + " -> " + to + "= " + ret);
51
+ return ret;
52
+ }
53
+
54
+ abs(fname: string): string {
55
+ if (path.isAbsolute(fname)) {
56
+ return fname;
57
+ } else {
58
+ const cwd = Deno.cwd();
59
+ return path.resolve(cwd, fname);
60
+ }
61
+ }
62
+
63
+ isAbsolute(fname: string): boolean {
64
+ return path.isAbsolute(fname);
65
+ }
66
+
67
+ async writeFileString(fname: string, content: string, ende = Utf8EnDecoderSingleton()): Promise<void> {
68
+ const o = await this.create(fname);
69
+ const wr = o.stream.getWriter();
70
+ await wr.write(ende.encode(content));
71
+ await wr.close();
72
+ }
73
+
74
+ async create(fname: string): Promise<NamedWritableStream> {
75
+ let oName = fname;
76
+ if (!path.isAbsolute(fname)) {
77
+ oName = this.abs(fname);
78
+ }
79
+
80
+ const base = path.dirname(oName);
81
+ await Deno.mkdir(base, { recursive: true });
82
+ const out = await Deno.open(oName, {
83
+ write: true,
84
+ create: true,
85
+ truncate: true,
86
+ });
87
+ return {
88
+ name: oName,
89
+ stream: out,
90
+ };
91
+ }
92
+ }
@@ -0,0 +1,133 @@
1
+ import { SysAbstraction, SystemService, VoidFunc } from "../sys-abstraction.js";
2
+ import {
3
+ BaseSysAbstraction,
4
+ ExitHandler,
5
+ ExitService,
6
+ WrapperSysAbstraction,
7
+ WrapperSysAbstractionParams,
8
+ } from "../base-sys-abstraction.js";
9
+ import { Env, envFactory } from "../sys-env.js";
10
+ import { Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
11
+ import * as process from "node:process";
12
+ import { DenoFileService } from "./deno-file-service.js";
13
+
14
+ const Deno = (globalThis as unknown as { Deno: unknown }).Deno as {
15
+ addSignalListener(sig: string, hdl: () => void): void;
16
+ exit(code?: number): void;
17
+ };
18
+
19
+ export class DenoExitServiceImpl implements ExitService {
20
+ constructor() {
21
+ globalThis.addEventListener("unhandledrejection", (e) => {
22
+ e.preventDefault();
23
+ this.exit(19);
24
+ });
25
+ globalThis.addEventListener("error", () => {
26
+ this.exit(19);
27
+ });
28
+ globalThis.addEventListener("uncaughtException", () => {
29
+ this.exit(19);
30
+ });
31
+
32
+ // process.on("close", () => {
33
+ // this.exit(0);
34
+ // });
35
+ globalThis.addEventListener("unload", () => {
36
+ this.exit(0);
37
+ // console.log('goodbye!');
38
+ });
39
+
40
+ // process.on("exit", () => {
41
+ // });
42
+ Deno.addSignalListener("SIGQUIT", () => {
43
+ this.exit(3);
44
+ });
45
+ Deno.addSignalListener("SIGINT", () => {
46
+ this.exit(2);
47
+ });
48
+ Deno.addSignalListener("SIGTERM", () => {
49
+ this.exit(9);
50
+ });
51
+ }
52
+ _exitHandlers: ExitHandler[] = [];
53
+ injectExitHandlers(hdls: ExitHandler[]): void {
54
+ // console.log("ExitService: injecting exit handlers", hdls)
55
+ this._exitHandlers = hdls;
56
+ }
57
+ invoked = false;
58
+ readonly _handleExit = async (): Promise<void> => {
59
+ if (this.invoked) {
60
+ // console.error("ExitService: already invoked");
61
+ return;
62
+ }
63
+ this.invoked = true;
64
+ for (const h of this._exitHandlers) {
65
+ try {
66
+ // console.log(`ExitService: calling handler ${h.id}`)
67
+ const ret = h.hdl();
68
+ // console.log(`ExitService: called handler ${h.id}`, ret)
69
+ if (typeof (ret as Promise<void>).then === "function") {
70
+ await ret;
71
+ }
72
+ } finally {
73
+ // ignore
74
+ }
75
+ }
76
+ };
77
+
78
+ exit(code: number): void {
79
+ // console.log("ExitService: exit called", code)
80
+ this._handleExit()
81
+ .then(() => {
82
+ Deno.exit(code);
83
+ })
84
+ .catch((err) => {
85
+ // eslint-disable-next-line no-console
86
+ console.error("ExitService: failed to handle exit", err);
87
+ Deno.exit(code);
88
+ });
89
+ }
90
+ }
91
+
92
+ export class DenoSystemService implements SystemService {
93
+ static readonly _exitHandlers: ExitHandler[] = [];
94
+ readonly _exitService: ExitService = new DenoExitServiceImpl();
95
+ constructor() {
96
+ this._exitService.injectExitHandlers(DenoSystemService._exitHandlers);
97
+ }
98
+
99
+ Env(): Env {
100
+ return envFactory();
101
+ }
102
+
103
+ Args(): string[] {
104
+ return process.argv;
105
+ }
106
+
107
+ OnExit(hdl: VoidFunc): VoidFunc {
108
+ const id = crypto.randomUUID();
109
+ DenoSystemService._exitHandlers.push({ hdl, id });
110
+ return () => {
111
+ const idx = DenoSystemService._exitHandlers.findIndex((h) => h.id === id);
112
+ if (idx >= 0) {
113
+ DenoSystemService._exitHandlers.splice(idx, 1);
114
+ }
115
+ };
116
+ }
117
+
118
+ Exit(code: number): void {
119
+ this._exitService.exit(code);
120
+ }
121
+ }
122
+
123
+ let my: BaseSysAbstraction | undefined = undefined;
124
+ export function DenoSysAbstraction(param?: WrapperSysAbstractionParams): SysAbstraction {
125
+ if (!my) {
126
+ my = new BaseSysAbstraction({
127
+ TxtEnDecoder: param?.TxtEnDecoder || Utf8EnDecoderSingleton(),
128
+ FileSystem: new DenoFileService(),
129
+ SystemService: new DenoSystemService(),
130
+ });
131
+ }
132
+ return new WrapperSysAbstraction(my, param);
133
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./node-file-service.js";
2
+ export * from "./node-sys-abstraction.js";
3
+ export * from "./deno-sys-abstraction.js";
4
+ export * from "./mock-file-service.js";
@@ -0,0 +1,45 @@
1
+ import { NamedWritableStream } from "../file-service.js";
2
+ import { NodeFileService } from "./node-file-service.js";
3
+
4
+ export interface FileCollector {
5
+ readonly name: string;
6
+ content: string;
7
+ }
8
+
9
+ export class MockFileService extends NodeFileService {
10
+ readonly files = {} as Record<string, FileCollector>;
11
+
12
+ // override abs(fname: string): string {
13
+ // return this.join("/mock/", fname);
14
+ // }
15
+
16
+ override async create(fname: string): Promise<NamedWritableStream> {
17
+ let oName = fname;
18
+ if (!this.isAbsolute(fname)) {
19
+ oName = await this.abs(fname);
20
+ }
21
+
22
+ const fc = {
23
+ name: oName,
24
+ content: "",
25
+ };
26
+ this.files[oName] = fc;
27
+ this.files[fname] = fc;
28
+ const decoder = new TextDecoder();
29
+
30
+ return {
31
+ name: oName,
32
+ stream: new WritableStream<Uint8Array>({
33
+ write(chunk): void {
34
+ fc.content = fc.content + decoder.decode(chunk);
35
+ },
36
+ close(): void {
37
+ // do nothing
38
+ },
39
+ abort(): void {
40
+ throw new Error("not implemented");
41
+ },
42
+ }),
43
+ };
44
+ }
45
+ }
@@ -0,0 +1,91 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ import process from "node:process";
4
+ import { FileService, NamedWritableStream } from "../file-service.js";
5
+ import { TxtEnDecoder, Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
6
+
7
+ export class NodeFileService implements FileService {
8
+ readonly baseDir: string;
9
+ constructor(baseDir: string = process.cwd()) {
10
+ this.baseDir = this.abs(baseDir);
11
+ }
12
+
13
+ // nodeImport(fname: string): string {
14
+ // // console.log('nodeImport:'+ fname);
15
+ // if (path.isAbsolute(fname)) {
16
+ // return fname;
17
+ // } else {
18
+ // return "./" + path.normalize(fname);
19
+ // }
20
+ // }
21
+
22
+ readFileString(fname: string): Promise<string> {
23
+ return fs.promises.readFile(fname, { encoding: "utf-8" });
24
+ }
25
+
26
+ dirname(fname: string): string {
27
+ return path.dirname(fname);
28
+ }
29
+ basename(fname: string): string {
30
+ return path.basename(fname);
31
+ }
32
+
33
+ join(...paths: string[]): string {
34
+ return path.join(...paths);
35
+ }
36
+
37
+ relative(from: string, to?: string): string {
38
+ if (to === undefined) {
39
+ to = from;
40
+ from = process.cwd();
41
+ }
42
+ const ret = path.relative(from, to);
43
+ // console.log('relative:'+ from + " -> " + to + "= " + ret);
44
+ return ret;
45
+ }
46
+
47
+ abs(fname: string): string {
48
+ if (path.isAbsolute(fname)) {
49
+ return fname;
50
+ } else {
51
+ const cwd = process.cwd();
52
+ return path.resolve(cwd, fname);
53
+ }
54
+ }
55
+
56
+ isAbsolute(fname: string): boolean {
57
+ return path.isAbsolute(fname);
58
+ }
59
+
60
+ async writeFileString(fname: string, content: string, ende: TxtEnDecoder = Utf8EnDecoderSingleton()): Promise<void> {
61
+ const o = await this.create(fname);
62
+ const wr = o.stream.getWriter();
63
+ await wr.write(ende.encode(content));
64
+ await wr.close();
65
+ }
66
+
67
+ async create(fname: string): Promise<NamedWritableStream> {
68
+ let oName = fname;
69
+ if (!path.isAbsolute(fname)) {
70
+ oName = this.abs(fname);
71
+ }
72
+
73
+ const base = path.dirname(oName);
74
+ await fs.promises.mkdir(base, { recursive: true });
75
+ const out = fs.createWriteStream(oName);
76
+ return {
77
+ name: oName,
78
+ stream: new WritableStream<Uint8Array>({
79
+ write(chunk): void {
80
+ out.write(chunk);
81
+ },
82
+ close(): void {
83
+ out.close();
84
+ },
85
+ abort(): void {
86
+ throw new Error("not implemented");
87
+ },
88
+ }),
89
+ };
90
+ }
91
+ }
@@ -0,0 +1,121 @@
1
+ import { SysAbstraction, SystemService, VoidFunc } from "../sys-abstraction.js";
2
+ import {
3
+ BaseSysAbstraction,
4
+ ExitHandler,
5
+ ExitService,
6
+ WrapperSysAbstraction,
7
+ WrapperSysAbstractionParams,
8
+ } from "../base-sys-abstraction.js";
9
+ import { NodeFileService } from "./node-file-service.js";
10
+ import { Env, envFactory } from "../sys-env.js";
11
+ import { Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
12
+ import process from "node:process";
13
+
14
+ export class NodeExitServiceImpl implements ExitService {
15
+ constructor() {
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ process.on("unhandledRejection", (reason: string, p: Promise<unknown>) => {
18
+ this.exit(19);
19
+ });
20
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
21
+ process.on("uncaughtException", (error: Error) => {
22
+ this.exit(18);
23
+ });
24
+ process.on("close", () => {
25
+ this.exit(0);
26
+ });
27
+ process.on("exit", () => {
28
+ this.exit(0);
29
+ });
30
+ process.on("SIGQUIT", () => {
31
+ this.exit(3);
32
+ });
33
+ process.on("SIGINT", () => {
34
+ this.exit(2);
35
+ });
36
+ process.on("SIGTERM", () => {
37
+ this.exit(9);
38
+ });
39
+ }
40
+ _exitHandlers: ExitHandler[] = [];
41
+ injectExitHandlers(hdls: ExitHandler[]): void {
42
+ // console.log("ExitService: injecting exit handlers", hdls)
43
+ this._exitHandlers = hdls;
44
+ }
45
+ invoked = false;
46
+ readonly _handleExit = async (): Promise<void> => {
47
+ if (this.invoked) {
48
+ // console.error("ExitService: already invoked");
49
+ return;
50
+ }
51
+ this.invoked = true;
52
+ for (const h of this._exitHandlers) {
53
+ try {
54
+ // console.log(`ExitService: calling handler ${h.id}`)
55
+ const ret = h.hdl();
56
+ // console.log(`ExitService: called handler ${h.id}`, ret)
57
+ if (typeof (ret as Promise<void>).then === "function") {
58
+ await ret;
59
+ }
60
+ } finally {
61
+ // ignore
62
+ }
63
+ }
64
+ };
65
+
66
+ exit(code: number): void {
67
+ // console.log("ExitService: exit called", code)
68
+ this._handleExit()
69
+ .then(() => {
70
+ process.exit(code);
71
+ })
72
+ .catch((err) => {
73
+ // eslint-disable-next-line no-console
74
+ console.error("ExitService: failed to handle exit", err);
75
+ process.exit(code);
76
+ });
77
+ }
78
+ }
79
+
80
+ export class NodeSystemService implements SystemService {
81
+ static readonly _exitHandlers: ExitHandler[] = [];
82
+ readonly _exitService: ExitService = new NodeExitServiceImpl();
83
+ constructor() {
84
+ this._exitService.injectExitHandlers(NodeSystemService._exitHandlers);
85
+ }
86
+
87
+ Env(): Env {
88
+ return envFactory();
89
+ }
90
+
91
+ Args(): string[] {
92
+ return process.argv;
93
+ }
94
+
95
+ OnExit(hdl: VoidFunc): VoidFunc {
96
+ const id = crypto.randomUUID();
97
+ NodeSystemService._exitHandlers.push({ hdl, id });
98
+ return () => {
99
+ const idx = NodeSystemService._exitHandlers.findIndex((h) => h.id === id);
100
+ if (idx >= 0) {
101
+ NodeSystemService._exitHandlers.splice(idx, 1);
102
+ }
103
+ };
104
+ }
105
+
106
+ Exit(code: number): void {
107
+ this._exitService.exit(code);
108
+ }
109
+ }
110
+
111
+ let my: BaseSysAbstraction | undefined = undefined;
112
+ export function NodeSysAbstraction(param?: WrapperSysAbstractionParams): SysAbstraction {
113
+ if (!my) {
114
+ my = new BaseSysAbstraction({
115
+ TxtEnDecoder: param?.TxtEnDecoder || Utf8EnDecoderSingleton(),
116
+ FileSystem: new NodeFileService(),
117
+ SystemService: new NodeSystemService(),
118
+ });
119
+ }
120
+ return new WrapperSysAbstraction(my, param);
121
+ }
package/src/option.ts ADDED
@@ -0,0 +1,60 @@
1
+ export abstract class Option<T> {
2
+ static Some<T>(t: T): Option<T> {
3
+ return new Some(t);
4
+ }
5
+
6
+ static None<T>(): Option<T> {
7
+ return new None();
8
+ }
9
+
10
+ static Is<T>(t: unknown): t is Option<T> {
11
+ return t instanceof Option;
12
+ }
13
+
14
+ IsNone(): boolean {
15
+ return this.is_none();
16
+ }
17
+
18
+ IsSome(): boolean {
19
+ return this.is_some();
20
+ }
21
+ Unwrap(): T {
22
+ return this.unwrap();
23
+ }
24
+
25
+ abstract is_none(): boolean;
26
+ abstract is_some(): boolean;
27
+ abstract unwrap(): T;
28
+ }
29
+
30
+ export class Some<T> extends Option<T> {
31
+ private _t: T;
32
+ constructor(_t: T) {
33
+ super();
34
+ this._t = _t;
35
+ }
36
+
37
+ is_none(): boolean {
38
+ return false;
39
+ }
40
+ is_some(): boolean {
41
+ return true;
42
+ }
43
+ unwrap(): T {
44
+ return this._t;
45
+ }
46
+ }
47
+
48
+ export class None<T> extends Option<T> {
49
+ is_none(): boolean {
50
+ return true;
51
+ }
52
+ is_some(): boolean {
53
+ return false;
54
+ }
55
+ unwrap(): T {
56
+ throw new Error("None.unwrap");
57
+ }
58
+ }
59
+
60
+ export type WithoutOption<T> = T extends Option<infer U> ? U : T;
@@ -0,0 +1,23 @@
1
+ type Refcounted<T, M extends string> = T & {
2
+ __refcounted: number;
3
+ __unrefcounted: () => void;
4
+ } & Record<M, () => void>;
5
+
6
+ export function wrapRefcounted<T, M extends string>(t: T, method: M): T {
7
+ const my = t as Refcounted<T, M>;
8
+ my.__refcounted = (my.__refcounted || 0) + 1;
9
+ if (my.__refcounted === 1) {
10
+ my.__unrefcounted = my[method];
11
+ const mRec = my as Record<string, () => void>;
12
+ mRec[method] = function (this: Refcounted<T, M>): void {
13
+ this.__refcounted--;
14
+ if (this.__refcounted === 0) {
15
+ this.__unrefcounted();
16
+ }
17
+ if (this.__refcounted < 0) {
18
+ throw new Error("already closed");
19
+ }
20
+ };
21
+ }
22
+ return t;
23
+ }