@adviser/cement 0.3.1 → 0.3.2

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 (138) hide show
  1. package/base-sys-abstraction-CR_Z-Ceg.d.ts +84 -0
  2. package/base-sys-abstraction-DWtPI7Kg.d.cts +84 -0
  3. package/cf/index.cjs +929 -0
  4. package/cf/index.cjs.map +1 -0
  5. package/cf/index.d.cts +26 -0
  6. package/cf/index.d.ts +26 -0
  7. package/cf/index.js +12 -0
  8. package/cf/index.js.map +1 -0
  9. package/{chunk-3RHIVQAA.js → chunk-A7OPSHUV.js} +6 -94
  10. package/chunk-A7OPSHUV.js.map +1 -0
  11. package/chunk-DZPKZQIT.js +1182 -0
  12. package/chunk-DZPKZQIT.js.map +1 -0
  13. package/chunk-HFP74WLI.js +96 -0
  14. package/chunk-HFP74WLI.js.map +1 -0
  15. package/chunk-R2EEZNZN.js +1742 -0
  16. package/chunk-R2EEZNZN.js.map +1 -0
  17. package/deno/index.cjs +940 -0
  18. package/deno/index.cjs.map +1 -0
  19. package/deno/index.d.cts +59 -0
  20. package/deno/index.d.ts +59 -0
  21. package/deno/index.js +16 -0
  22. package/deno/index.js.map +1 -0
  23. package/index-BfZxTAe_.d.cts +318 -0
  24. package/index-CfSl8Gmj.d.ts +318 -0
  25. package/index.cjs +393 -143
  26. package/index.cjs.map +1 -1
  27. package/index.d.cts +7 -317
  28. package/index.d.ts +7 -317
  29. package/index.js +34 -1729
  30. package/index.js.map +1 -1
  31. package/node/index.cjs +265 -217
  32. package/node/index.cjs.map +1 -1
  33. package/node/index.d.cts +16 -21
  34. package/node/index.d.ts +16 -21
  35. package/node/index.js +8 -352
  36. package/node/index.js.map +1 -1
  37. package/package.json +18 -11
  38. package/src/cf/cf-sys-abstraction.ts +78 -0
  39. package/src/cf/index.ts +1 -0
  40. package/src/{node → deno}/deno-file-service.ts +2 -2
  41. package/src/{node → deno}/deno-sys-abstraction.ts +64 -7
  42. package/src/deno/index.ts +2 -0
  43. package/src/index.ts +1 -2
  44. package/src/jsr.json +1 -1
  45. package/src/logger-impl.ts +2 -2
  46. package/src/logger.ts +10 -3
  47. package/src/node/index.ts +0 -1
  48. package/src/node/node-sys-abstraction.ts +45 -1
  49. package/src/runtime.ts +13 -3
  50. package/src/sys-env.ts +19 -113
  51. package/src/test/index.ts +2 -0
  52. package/src/web/web-sys-abstraction.ts +42 -2
  53. package/sys-abstraction-GNnBj2sz.d.cts +102 -0
  54. package/sys-abstraction-GNnBj2sz.d.ts +102 -0
  55. package/test/index.cjs +2681 -0
  56. package/test/index.cjs.map +1 -0
  57. package/test/index.d.cts +3 -0
  58. package/test/index.d.ts +3 -0
  59. package/test/index.js +14 -0
  60. package/test/index.js.map +1 -0
  61. package/ts/base-sys-abstraction.test.js +8 -2
  62. package/ts/base-sys-abstraction.test.js.map +1 -1
  63. package/ts/cf/cf-sys-abstraction.d.ts +24 -0
  64. package/ts/cf/cf-sys-abstraction.d.ts.map +1 -0
  65. package/ts/cf/cf-sys-abstraction.js +72 -0
  66. package/ts/cf/cf-sys-abstraction.js.map +1 -0
  67. package/ts/cf/index.d.ts +2 -0
  68. package/ts/cf/index.d.ts.map +1 -0
  69. package/ts/cf/index.js +2 -0
  70. package/ts/cf/index.js.map +1 -0
  71. package/ts/crypto.test.js +1 -1
  72. package/ts/crypto.test.js.map +1 -1
  73. package/ts/{node → deno}/deno-file-service.d.ts.map +1 -1
  74. package/ts/{node → deno}/deno-file-service.js +1 -1
  75. package/ts/{node → deno}/deno-file-service.js.map +1 -1
  76. package/ts/deno/deno-sys-abstraction.d.ts +43 -0
  77. package/ts/deno/deno-sys-abstraction.d.ts.map +1 -0
  78. package/ts/{node → deno}/deno-sys-abstraction.js +46 -2
  79. package/ts/deno/deno-sys-abstraction.js.map +1 -0
  80. package/ts/deno/index.d.ts +3 -0
  81. package/ts/deno/index.d.ts.map +1 -0
  82. package/ts/deno/index.js +3 -0
  83. package/ts/deno/index.js.map +1 -0
  84. package/ts/index.d.ts +1 -2
  85. package/ts/index.d.ts.map +1 -1
  86. package/ts/index.js +1 -2
  87. package/ts/index.js.map +1 -1
  88. package/ts/logger-impl.js +2 -2
  89. package/ts/logger-impl.js.map +1 -1
  90. package/ts/logger.d.ts.map +1 -1
  91. package/ts/logger.js +9 -3
  92. package/ts/logger.js.map +1 -1
  93. package/ts/logger.test.js +9 -9
  94. package/ts/logger.test.js.map +1 -1
  95. package/ts/node/index.d.ts +0 -1
  96. package/ts/node/index.d.ts.map +1 -1
  97. package/ts/node/index.js +0 -1
  98. package/ts/node/index.js.map +1 -1
  99. package/ts/node/node-sys-abstraction.d.ts +14 -1
  100. package/ts/node/node-sys-abstraction.d.ts.map +1 -1
  101. package/ts/node/node-sys-abstraction.js +43 -0
  102. package/ts/node/node-sys-abstraction.js.map +1 -1
  103. package/ts/runtime.d.ts +1 -0
  104. package/ts/runtime.d.ts.map +1 -1
  105. package/ts/runtime.js +10 -3
  106. package/ts/runtime.js.map +1 -1
  107. package/ts/sys-env.d.ts +0 -11
  108. package/ts/sys-env.d.ts.map +1 -1
  109. package/ts/sys-env.js +19 -104
  110. package/ts/sys-env.js.map +1 -1
  111. package/ts/sys-env.test.js +16 -3
  112. package/ts/sys-env.test.js.map +1 -1
  113. package/ts/test/index.d.ts +3 -0
  114. package/ts/test/index.d.ts.map +1 -0
  115. package/ts/test/index.js +3 -0
  116. package/ts/test/index.js.map +1 -0
  117. package/ts/test/test-exit-handler.js +1 -1
  118. package/ts/web/web-sys-abstraction.d.ts +27 -0
  119. package/ts/web/web-sys-abstraction.d.ts.map +1 -1
  120. package/ts/web/web-sys-abstraction.js +35 -1
  121. package/ts/web/web-sys-abstraction.js.map +1 -1
  122. package/utils/index.js +6 -4
  123. package/web/index.cjs +389 -67
  124. package/web/index.cjs.map +1 -1
  125. package/web/index.d.cts +28 -2
  126. package/web/index.d.ts +28 -2
  127. package/web/index.js +5 -2
  128. package/base-sys-abstraction-BPFyK8XL.d.ts +0 -195
  129. package/base-sys-abstraction-KYXfUGd6.d.cts +0 -195
  130. package/chunk-3RHIVQAA.js.map +0 -1
  131. package/chunk-PSPOGR2I.js +0 -627
  132. package/chunk-PSPOGR2I.js.map +0 -1
  133. package/chunk-STUPETPE.js +0 -87
  134. package/chunk-STUPETPE.js.map +0 -1
  135. package/ts/node/deno-sys-abstraction.d.ts +0 -22
  136. package/ts/node/deno-sys-abstraction.d.ts.map +0 -1
  137. package/ts/node/deno-sys-abstraction.js.map +0 -1
  138. /package/ts/{node → deno}/deno-file-service.d.ts +0 -0
package/node/index.js CHANGED
@@ -1,353 +1,11 @@
1
1
  import {
2
- BaseSysAbstraction,
3
- WrapperSysAbstraction,
4
- envFactory
5
- } from "../chunk-PSPOGR2I.js";
6
- import {
7
- Utf8EnDecoderSingleton
8
- } from "../chunk-PPS4L4VW.js";
9
-
10
- // src/node/node-file-service.ts
11
- import path from "node:path";
12
- import fs from "node:fs";
13
- import process from "node:process";
14
- var NodeFileService = class {
15
- constructor(baseDir = process.cwd()) {
16
- this.baseDir = this.abs(baseDir);
17
- }
18
- // nodeImport(fname: string): string {
19
- // // console.log('nodeImport:'+ fname);
20
- // if (path.isAbsolute(fname)) {
21
- // return fname;
22
- // } else {
23
- // return "./" + path.normalize(fname);
24
- // }
25
- // }
26
- readFileString(fname) {
27
- return fs.promises.readFile(fname, { encoding: "utf-8" });
28
- }
29
- dirname(fname) {
30
- return path.dirname(fname);
31
- }
32
- basename(fname) {
33
- return path.basename(fname);
34
- }
35
- join(...paths) {
36
- return path.join(...paths);
37
- }
38
- relative(from, to) {
39
- if (to === void 0) {
40
- to = from;
41
- from = process.cwd();
42
- }
43
- const ret = path.relative(from, to);
44
- return ret;
45
- }
46
- abs(fname) {
47
- if (path.isAbsolute(fname)) {
48
- return fname;
49
- } else {
50
- const cwd = process.cwd();
51
- return path.resolve(cwd, fname);
52
- }
53
- }
54
- isAbsolute(fname) {
55
- return path.isAbsolute(fname);
56
- }
57
- async writeFileString(fname, content, ende = Utf8EnDecoderSingleton()) {
58
- const o = await this.create(fname);
59
- const wr = o.stream.getWriter();
60
- await wr.write(ende.encode(content));
61
- await wr.close();
62
- }
63
- async create(fname) {
64
- let oName = fname;
65
- if (!path.isAbsolute(fname)) {
66
- oName = this.abs(fname);
67
- }
68
- const base = path.dirname(oName);
69
- await fs.promises.mkdir(base, { recursive: true });
70
- const out = fs.createWriteStream(oName);
71
- return {
72
- name: oName,
73
- stream: new WritableStream({
74
- write(chunk) {
75
- out.write(chunk);
76
- },
77
- close() {
78
- out.close();
79
- },
80
- abort() {
81
- throw new Error("not implemented");
82
- }
83
- })
84
- };
85
- }
86
- };
87
-
88
- // src/node/node-sys-abstraction.ts
89
- import process2 from "node:process";
90
- var NodeExitServiceImpl = class {
91
- constructor() {
92
- this._exitHandlers = [];
93
- this.invoked = false;
94
- this._handleExit = async () => {
95
- if (this.invoked) {
96
- return;
97
- }
98
- this.invoked = true;
99
- for (const h of this._exitHandlers) {
100
- try {
101
- const ret = h.hdl();
102
- if (typeof ret.then === "function") {
103
- await ret;
104
- }
105
- } finally {
106
- }
107
- }
108
- };
109
- process2.on("unhandledRejection", (reason, p) => {
110
- this.exit(19);
111
- });
112
- process2.on("uncaughtException", (error) => {
113
- this.exit(18);
114
- });
115
- process2.on("close", () => {
116
- this.exit(0);
117
- });
118
- process2.on("exit", () => {
119
- this.exit(0);
120
- });
121
- process2.on("SIGQUIT", () => {
122
- this.exit(3);
123
- });
124
- process2.on("SIGINT", () => {
125
- this.exit(2);
126
- });
127
- process2.on("SIGTERM", () => {
128
- this.exit(9);
129
- });
130
- }
131
- injectExitHandlers(hdls) {
132
- this._exitHandlers = hdls;
133
- }
134
- exit(code) {
135
- this._handleExit().then(() => {
136
- process2.exit(code);
137
- }).catch((err) => {
138
- console.error("ExitService: failed to handle exit", err);
139
- process2.exit(code);
140
- });
141
- }
142
- };
143
- var _NodeSystemService = class _NodeSystemService {
144
- constructor() {
145
- this._exitService = new NodeExitServiceImpl();
146
- this._exitService.injectExitHandlers(_NodeSystemService._exitHandlers);
147
- }
148
- Env() {
149
- return envFactory();
150
- }
151
- Args() {
152
- return process2.argv;
153
- }
154
- OnExit(hdl) {
155
- const id = crypto.randomUUID();
156
- _NodeSystemService._exitHandlers.push({ hdl, id });
157
- return () => {
158
- const idx = _NodeSystemService._exitHandlers.findIndex((h) => h.id === id);
159
- if (idx >= 0) {
160
- _NodeSystemService._exitHandlers.splice(idx, 1);
161
- }
162
- };
163
- }
164
- Exit(code) {
165
- this._exitService.exit(code);
166
- }
167
- };
168
- _NodeSystemService._exitHandlers = [];
169
- var NodeSystemService = _NodeSystemService;
170
- var my = void 0;
171
- function NodeSysAbstraction(param) {
172
- if (!my) {
173
- my = new BaseSysAbstraction({
174
- TxtEnDecoder: (param == null ? void 0 : param.TxtEnDecoder) || Utf8EnDecoderSingleton(),
175
- FileSystem: new NodeFileService(),
176
- SystemService: new NodeSystemService()
177
- });
178
- }
179
- return new WrapperSysAbstraction(my, param);
180
- }
181
-
182
- // src/node/deno-sys-abstraction.ts
183
- import * as process3 from "node:process";
184
-
185
- // src/node/deno-file-service.ts
186
- import * as path2 from "node:path";
187
- var Deno = globalThis.Deno;
188
- var DenoFileService = class {
189
- constructor(baseDir = Deno.cwd(), txtEnde = Utf8EnDecoderSingleton()) {
190
- this.baseDir = this.abs(baseDir);
191
- this.txtEnde = txtEnde;
192
- }
193
- // nodeImport(fname: string): string {
194
- // // console.log('nodeImport:'+ fname);
195
- // if (path.isAbsolute(fname)) {
196
- // return fname;
197
- // } else {
198
- // return "./" + path.normalize(fname);
199
- // }
200
- // }
201
- async readFileString(fname) {
202
- return this.txtEnde.decode(await Deno.readFile(fname));
203
- }
204
- dirname(fname) {
205
- return path2.dirname(fname);
206
- }
207
- basename(fname) {
208
- return path2.basename(fname);
209
- }
210
- join(...paths) {
211
- return path2.join(...paths);
212
- }
213
- relative(from, to) {
214
- if (to === void 0) {
215
- to = from;
216
- from = Deno.cwd();
217
- }
218
- const ret = path2.relative(from, to);
219
- return ret;
220
- }
221
- abs(fname) {
222
- if (path2.isAbsolute(fname)) {
223
- return fname;
224
- } else {
225
- const cwd = Deno.cwd();
226
- return path2.resolve(cwd, fname);
227
- }
228
- }
229
- isAbsolute(fname) {
230
- return path2.isAbsolute(fname);
231
- }
232
- async writeFileString(fname, content, ende = Utf8EnDecoderSingleton()) {
233
- const o = await this.create(fname);
234
- const wr = o.stream.getWriter();
235
- await wr.write(ende.encode(content));
236
- await wr.close();
237
- }
238
- async create(fname) {
239
- let oName = fname;
240
- if (!path2.isAbsolute(fname)) {
241
- oName = this.abs(fname);
242
- }
243
- const base = path2.dirname(oName);
244
- await Deno.mkdir(base, { recursive: true });
245
- const out = await Deno.open(oName, {
246
- write: true,
247
- create: true,
248
- truncate: true
249
- });
250
- return {
251
- name: oName,
252
- stream: out
253
- };
254
- }
255
- };
256
-
257
- // src/node/deno-sys-abstraction.ts
258
- var Deno2 = globalThis.Deno;
259
- var DenoExitServiceImpl = class {
260
- constructor() {
261
- this._exitHandlers = [];
262
- this.invoked = false;
263
- this._handleExit = async () => {
264
- if (this.invoked) {
265
- return;
266
- }
267
- this.invoked = true;
268
- for (const h of this._exitHandlers) {
269
- try {
270
- const ret = h.hdl();
271
- if (typeof ret.then === "function") {
272
- await ret;
273
- }
274
- } finally {
275
- }
276
- }
277
- };
278
- globalThis.addEventListener("unhandledrejection", (e) => {
279
- e.preventDefault();
280
- this.exit(19);
281
- });
282
- globalThis.addEventListener("error", () => {
283
- this.exit(19);
284
- });
285
- globalThis.addEventListener("uncaughtException", () => {
286
- this.exit(19);
287
- });
288
- globalThis.addEventListener("unload", () => {
289
- this.exit(0);
290
- });
291
- Deno2.addSignalListener("SIGQUIT", () => {
292
- this.exit(3);
293
- });
294
- Deno2.addSignalListener("SIGINT", () => {
295
- this.exit(2);
296
- });
297
- Deno2.addSignalListener("SIGTERM", () => {
298
- this.exit(9);
299
- });
300
- }
301
- injectExitHandlers(hdls) {
302
- this._exitHandlers = hdls;
303
- }
304
- exit(code) {
305
- this._handleExit().then(() => {
306
- Deno2.exit(code);
307
- }).catch((err) => {
308
- console.error("ExitService: failed to handle exit", err);
309
- Deno2.exit(code);
310
- });
311
- }
312
- };
313
- var _DenoSystemService = class _DenoSystemService {
314
- constructor() {
315
- this._exitService = new DenoExitServiceImpl();
316
- this._exitService.injectExitHandlers(_DenoSystemService._exitHandlers);
317
- }
318
- Env() {
319
- return envFactory();
320
- }
321
- Args() {
322
- return process3.argv;
323
- }
324
- OnExit(hdl) {
325
- const id = crypto.randomUUID();
326
- _DenoSystemService._exitHandlers.push({ hdl, id });
327
- return () => {
328
- const idx = _DenoSystemService._exitHandlers.findIndex((h) => h.id === id);
329
- if (idx >= 0) {
330
- _DenoSystemService._exitHandlers.splice(idx, 1);
331
- }
332
- };
333
- }
334
- Exit(code) {
335
- this._exitService.exit(code);
336
- }
337
- };
338
- _DenoSystemService._exitHandlers = [];
339
- var DenoSystemService = _DenoSystemService;
340
- var my2 = void 0;
341
- function DenoSysAbstraction(param) {
342
- if (!my2) {
343
- my2 = new BaseSysAbstraction({
344
- TxtEnDecoder: (param == null ? void 0 : param.TxtEnDecoder) || Utf8EnDecoderSingleton(),
345
- FileSystem: new DenoFileService(),
346
- SystemService: new DenoSystemService()
347
- });
348
- }
349
- return new WrapperSysAbstraction(my2, param);
350
- }
2
+ NodeEnvActions,
3
+ NodeExitServiceImpl,
4
+ NodeFileService,
5
+ NodeSysAbstraction,
6
+ NodeSystemService
7
+ } from "../chunk-DZPKZQIT.js";
8
+ import "../chunk-PPS4L4VW.js";
351
9
 
352
10
  // src/node/mock-file-service.ts
353
11
  var MockFileService = class extends NodeFileService {
@@ -386,10 +44,8 @@ var MockFileService = class extends NodeFileService {
386
44
  }
387
45
  };
388
46
  export {
389
- DenoExitServiceImpl,
390
- DenoSysAbstraction,
391
- DenoSystemService,
392
47
  MockFileService,
48
+ NodeEnvActions,
393
49
  NodeExitServiceImpl,
394
50
  NodeFileService,
395
51
  NodeSysAbstraction,
package/node/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/node/node-file-service.ts","../../../src/node/node-sys-abstraction.ts","../../../src/node/deno-sys-abstraction.ts","../../../src/node/deno-file-service.ts","../../../src/node/mock-file-service.ts"],"sourcesContent":["import path from \"node:path\";\nimport fs from \"node:fs\";\nimport process from \"node:process\";\nimport { FileService, NamedWritableStream } from \"../file-service.js\";\nimport { TxtEnDecoder, Utf8EnDecoderSingleton } from \"../txt-en-decoder.js\";\n\nexport class NodeFileService implements FileService {\n readonly baseDir: string;\n constructor(baseDir: string = process.cwd()) {\n this.baseDir = this.abs(baseDir);\n }\n\n // nodeImport(fname: string): string {\n // // console.log('nodeImport:'+ fname);\n // if (path.isAbsolute(fname)) {\n // return fname;\n // } else {\n // return \"./\" + path.normalize(fname);\n // }\n // }\n\n readFileString(fname: string): Promise<string> {\n return fs.promises.readFile(fname, { encoding: \"utf-8\" });\n }\n\n dirname(fname: string): string {\n return path.dirname(fname);\n }\n basename(fname: string): string {\n return path.basename(fname);\n }\n\n join(...paths: string[]): string {\n return path.join(...paths);\n }\n\n relative(from: string, to?: string): string {\n if (to === undefined) {\n to = from;\n from = process.cwd();\n }\n const ret = path.relative(from, to);\n // console.log('relative:'+ from + \" -> \" + to + \"= \" + ret);\n return ret;\n }\n\n abs(fname: string): string {\n if (path.isAbsolute(fname)) {\n return fname;\n } else {\n const cwd = process.cwd();\n return path.resolve(cwd, fname);\n }\n }\n\n isAbsolute(fname: string): boolean {\n return path.isAbsolute(fname);\n }\n\n async writeFileString(fname: string, content: string, ende: TxtEnDecoder = Utf8EnDecoderSingleton()): Promise<void> {\n const o = await this.create(fname);\n const wr = o.stream.getWriter();\n await wr.write(ende.encode(content));\n await wr.close();\n }\n\n async create(fname: string): Promise<NamedWritableStream> {\n let oName = fname;\n if (!path.isAbsolute(fname)) {\n oName = this.abs(fname);\n }\n\n const base = path.dirname(oName);\n await fs.promises.mkdir(base, { recursive: true });\n const out = fs.createWriteStream(oName);\n return {\n name: oName,\n stream: new WritableStream<Uint8Array>({\n write(chunk): void {\n out.write(chunk);\n },\n close(): void {\n out.close();\n },\n abort(): void {\n throw new Error(\"not implemented\");\n },\n }),\n };\n }\n}\n","import { SysAbstraction, SystemService, VoidFunc } from \"../sys-abstraction.js\";\nimport {\n BaseSysAbstraction,\n ExitHandler,\n ExitService,\n WrapperSysAbstraction,\n WrapperSysAbstractionParams,\n} from \"../base-sys-abstraction.js\";\nimport { NodeFileService } from \"./node-file-service.js\";\nimport { Env, envFactory } from \"../sys-env.js\";\nimport { Utf8EnDecoderSingleton } from \"../txt-en-decoder.js\";\nimport process from \"node:process\";\n\nexport class NodeExitServiceImpl implements ExitService {\n constructor() {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n process.on(\"unhandledRejection\", (reason: string, p: Promise<unknown>) => {\n this.exit(19);\n });\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n process.on(\"uncaughtException\", (error: Error) => {\n this.exit(18);\n });\n process.on(\"close\", () => {\n this.exit(0);\n });\n process.on(\"exit\", () => {\n this.exit(0);\n });\n process.on(\"SIGQUIT\", () => {\n this.exit(3);\n });\n process.on(\"SIGINT\", () => {\n this.exit(2);\n });\n process.on(\"SIGTERM\", () => {\n this.exit(9);\n });\n }\n _exitHandlers: ExitHandler[] = [];\n injectExitHandlers(hdls: ExitHandler[]): void {\n // console.log(\"ExitService: injecting exit handlers\", hdls)\n this._exitHandlers = hdls;\n }\n invoked = false;\n readonly _handleExit = async (): Promise<void> => {\n if (this.invoked) {\n // console.error(\"ExitService: already invoked\");\n return;\n }\n this.invoked = true;\n for (const h of this._exitHandlers) {\n try {\n // console.log(`ExitService: calling handler ${h.id}`)\n const ret = h.hdl();\n // console.log(`ExitService: called handler ${h.id}`, ret)\n if (typeof (ret as Promise<void>).then === \"function\") {\n await ret;\n }\n } finally {\n // ignore\n }\n }\n };\n\n exit(code: number): void {\n // console.log(\"ExitService: exit called\", code)\n this._handleExit()\n .then(() => {\n process.exit(code);\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.error(\"ExitService: failed to handle exit\", err);\n process.exit(code);\n });\n }\n}\n\nexport class NodeSystemService implements SystemService {\n static readonly _exitHandlers: ExitHandler[] = [];\n readonly _exitService: ExitService = new NodeExitServiceImpl();\n constructor() {\n this._exitService.injectExitHandlers(NodeSystemService._exitHandlers);\n }\n\n Env(): Env {\n return envFactory();\n }\n\n Args(): string[] {\n return process.argv;\n }\n\n OnExit(hdl: VoidFunc): VoidFunc {\n const id = crypto.randomUUID();\n NodeSystemService._exitHandlers.push({ hdl, id });\n return () => {\n const idx = NodeSystemService._exitHandlers.findIndex((h) => h.id === id);\n if (idx >= 0) {\n NodeSystemService._exitHandlers.splice(idx, 1);\n }\n };\n }\n\n Exit(code: number): void {\n this._exitService.exit(code);\n }\n}\n\nlet my: BaseSysAbstraction | undefined = undefined;\nexport function NodeSysAbstraction(param?: WrapperSysAbstractionParams): SysAbstraction {\n if (!my) {\n my = new BaseSysAbstraction({\n TxtEnDecoder: param?.TxtEnDecoder || Utf8EnDecoderSingleton(),\n FileSystem: new NodeFileService(),\n SystemService: new NodeSystemService(),\n });\n }\n return new WrapperSysAbstraction(my, param);\n}\n","import { SysAbstraction, SystemService, VoidFunc } from \"../sys-abstraction.js\";\nimport {\n BaseSysAbstraction,\n ExitHandler,\n ExitService,\n WrapperSysAbstraction,\n WrapperSysAbstractionParams,\n} from \"../base-sys-abstraction.js\";\nimport { Env, envFactory } from \"../sys-env.js\";\nimport { Utf8EnDecoderSingleton } from \"../txt-en-decoder.js\";\nimport * as process from \"node:process\";\nimport { DenoFileService } from \"./deno-file-service.js\";\n\nconst Deno = (globalThis as unknown as { Deno: unknown }).Deno as {\n addSignalListener(sig: string, hdl: () => void): void;\n exit(code?: number): void;\n};\n\nexport class DenoExitServiceImpl implements ExitService {\n constructor() {\n globalThis.addEventListener(\"unhandledrejection\", (e) => {\n e.preventDefault();\n this.exit(19);\n });\n globalThis.addEventListener(\"error\", () => {\n this.exit(19);\n });\n globalThis.addEventListener(\"uncaughtException\", () => {\n this.exit(19);\n });\n\n // process.on(\"close\", () => {\n // this.exit(0);\n // });\n globalThis.addEventListener(\"unload\", () => {\n this.exit(0);\n // console.log('goodbye!');\n });\n\n // process.on(\"exit\", () => {\n // });\n Deno.addSignalListener(\"SIGQUIT\", () => {\n this.exit(3);\n });\n Deno.addSignalListener(\"SIGINT\", () => {\n this.exit(2);\n });\n Deno.addSignalListener(\"SIGTERM\", () => {\n this.exit(9);\n });\n }\n _exitHandlers: ExitHandler[] = [];\n injectExitHandlers(hdls: ExitHandler[]): void {\n // console.log(\"ExitService: injecting exit handlers\", hdls)\n this._exitHandlers = hdls;\n }\n invoked = false;\n readonly _handleExit = async (): Promise<void> => {\n if (this.invoked) {\n // console.error(\"ExitService: already invoked\");\n return;\n }\n this.invoked = true;\n for (const h of this._exitHandlers) {\n try {\n // console.log(`ExitService: calling handler ${h.id}`)\n const ret = h.hdl();\n // console.log(`ExitService: called handler ${h.id}`, ret)\n if (typeof (ret as Promise<void>).then === \"function\") {\n await ret;\n }\n } finally {\n // ignore\n }\n }\n };\n\n exit(code: number): void {\n // console.log(\"ExitService: exit called\", code)\n this._handleExit()\n .then(() => {\n Deno.exit(code);\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.error(\"ExitService: failed to handle exit\", err);\n Deno.exit(code);\n });\n }\n}\n\nexport class DenoSystemService implements SystemService {\n static readonly _exitHandlers: ExitHandler[] = [];\n readonly _exitService: ExitService = new DenoExitServiceImpl();\n constructor() {\n this._exitService.injectExitHandlers(DenoSystemService._exitHandlers);\n }\n\n Env(): Env {\n return envFactory();\n }\n\n Args(): string[] {\n return process.argv;\n }\n\n OnExit(hdl: VoidFunc): VoidFunc {\n const id = crypto.randomUUID();\n DenoSystemService._exitHandlers.push({ hdl, id });\n return () => {\n const idx = DenoSystemService._exitHandlers.findIndex((h) => h.id === id);\n if (idx >= 0) {\n DenoSystemService._exitHandlers.splice(idx, 1);\n }\n };\n }\n\n Exit(code: number): void {\n this._exitService.exit(code);\n }\n}\n\nlet my: BaseSysAbstraction | undefined = undefined;\nexport function DenoSysAbstraction(param?: WrapperSysAbstractionParams): SysAbstraction {\n if (!my) {\n my = new BaseSysAbstraction({\n TxtEnDecoder: param?.TxtEnDecoder || Utf8EnDecoderSingleton(),\n FileSystem: new DenoFileService(),\n SystemService: new DenoSystemService(),\n });\n }\n return new WrapperSysAbstraction(my, param);\n}\n","import { FileService, NamedWritableStream } from \"../file-service.js\";\nimport { TxtEnDecoder, Utf8EnDecoderSingleton } from \"../txt-en-decoder.js\";\nimport * as path from \"node:path\";\n\nconst Deno = (globalThis as unknown as { Deno: unknown }).Deno as {\n cwd(): string;\n readFile(fname: string): Promise<Uint8Array>;\n mkdir(base: string, options: { recursive: boolean }): Promise<void>;\n open(fname: string, options: { write: boolean; create: boolean; truncate: boolean }): Promise<WritableStream>;\n};\n\nexport class DenoFileService implements FileService {\n readonly baseDir: string;\n readonly txtEnde: TxtEnDecoder;\n constructor(baseDir: string = Deno.cwd(), txtEnde: TxtEnDecoder = Utf8EnDecoderSingleton()) {\n this.baseDir = this.abs(baseDir);\n this.txtEnde = txtEnde;\n }\n\n // nodeImport(fname: string): string {\n // // console.log('nodeImport:'+ fname);\n // if (path.isAbsolute(fname)) {\n // return fname;\n // } else {\n // return \"./\" + path.normalize(fname);\n // }\n // }\n\n async readFileString(fname: string): Promise<string> {\n return this.txtEnde.decode(await Deno.readFile(fname));\n }\n\n dirname(fname: string): string {\n return path.dirname(fname);\n }\n basename(fname: string): string {\n return path.basename(fname);\n }\n\n join(...paths: string[]): string {\n return path.join(...paths);\n }\n\n relative(from: string, to?: string): string {\n if (to === undefined) {\n to = from;\n from = Deno.cwd();\n }\n const ret = path.relative(from, to);\n // console.log('relative:'+ from + \" -> \" + to + \"= \" + ret);\n return ret;\n }\n\n abs(fname: string): string {\n if (path.isAbsolute(fname)) {\n return fname;\n } else {\n const cwd = Deno.cwd();\n return path.resolve(cwd, fname);\n }\n }\n\n isAbsolute(fname: string): boolean {\n return path.isAbsolute(fname);\n }\n\n async writeFileString(fname: string, content: string, ende = Utf8EnDecoderSingleton()): Promise<void> {\n const o = await this.create(fname);\n const wr = o.stream.getWriter();\n await wr.write(ende.encode(content));\n await wr.close();\n }\n\n async create(fname: string): Promise<NamedWritableStream> {\n let oName = fname;\n if (!path.isAbsolute(fname)) {\n oName = this.abs(fname);\n }\n\n const base = path.dirname(oName);\n await Deno.mkdir(base, { recursive: true });\n const out = await Deno.open(oName, {\n write: true,\n create: true,\n truncate: true,\n });\n return {\n name: oName,\n stream: out,\n };\n }\n}\n","import { NamedWritableStream } from \"../file-service.js\";\nimport { NodeFileService } from \"./node-file-service.js\";\n\nexport interface FileCollector {\n readonly name: string;\n content: string;\n}\n\nexport class MockFileService extends NodeFileService {\n readonly files = {} as Record<string, FileCollector>;\n\n // override abs(fname: string): string {\n // return this.join(\"/mock/\", fname);\n // }\n\n override async create(fname: string): Promise<NamedWritableStream> {\n let oName = fname;\n if (!this.isAbsolute(fname)) {\n oName = await this.abs(fname);\n }\n\n const fc = {\n name: oName,\n content: \"\",\n };\n this.files[oName] = fc;\n this.files[fname] = fc;\n const decoder = new TextDecoder();\n\n return {\n name: oName,\n stream: new WritableStream<Uint8Array>({\n write(chunk): void {\n fc.content = fc.content + decoder.decode(chunk);\n },\n close(): void {\n // do nothing\n },\n abort(): void {\n throw new Error(\"not implemented\");\n },\n }),\n };\n }\n}\n"],"mappings":"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","names":["process","process","path","Deno","my"]}
1
+ {"version":3,"sources":["../../../src/node/mock-file-service.ts"],"sourcesContent":["import { NamedWritableStream } from \"../file-service.js\";\nimport { NodeFileService } from \"./node-file-service.js\";\n\nexport interface FileCollector {\n readonly name: string;\n content: string;\n}\n\nexport class MockFileService extends NodeFileService {\n readonly files = {} as Record<string, FileCollector>;\n\n // override abs(fname: string): string {\n // return this.join(\"/mock/\", fname);\n // }\n\n override async create(fname: string): Promise<NamedWritableStream> {\n let oName = fname;\n if (!this.isAbsolute(fname)) {\n oName = await this.abs(fname);\n }\n\n const fc = {\n name: oName,\n content: \"\",\n };\n this.files[oName] = fc;\n this.files[fname] = fc;\n const decoder = new TextDecoder();\n\n return {\n name: oName,\n stream: new WritableStream<Uint8Array>({\n write(chunk): void {\n fc.content = fc.content + decoder.decode(chunk);\n },\n close(): void {\n // do nothing\n },\n abort(): void {\n throw new Error(\"not implemented\");\n },\n }),\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAQO,IAAM,kBAAN,cAA8B,gBAAgB;AAAA,EAA9C;AAAA;AACL,SAAS,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlB,MAAe,OAAO,OAA6C;AACjE,QAAI,QAAQ;AACZ,QAAI,CAAC,KAAK,WAAW,KAAK,GAAG;AAC3B,cAAQ,MAAM,KAAK,IAAI,KAAK;AAAA,IAC9B;AAEA,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACA,SAAK,MAAM,KAAK,IAAI;AACpB,SAAK,MAAM,KAAK,IAAI;AACpB,UAAM,UAAU,IAAI,YAAY;AAEhC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,IAAI,eAA2B;AAAA,QACrC,MAAM,OAAa;AACjB,aAAG,UAAU,GAAG,UAAU,QAAQ,OAAO,KAAK;AAAA,QAChD;AAAA,QACA,QAAc;AAAA,QAEd;AAAA,QACA,QAAc;AACZ,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACnC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adviser/cement",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "better try/catch/finally handling",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -20,15 +20,20 @@
20
20
  "require": "./utils/index.cjs",
21
21
  "import": "./utils/index.js"
22
22
  },
23
+ "./cf": {
24
+ "types": "./cf/index.d.ts",
25
+ "require": "./cf/index.cjs",
26
+ "import": "./cf/index.js"
27
+ },
23
28
  "./node": {
24
29
  "types": "./node/index.d.ts",
25
30
  "require": "./node/index.cjs",
26
31
  "import": "./node/index.js"
27
32
  },
28
33
  "./deno": {
29
- "types": "./node/index.d.ts",
30
- "require": "./node/index.cjs",
31
- "import": "./node/index.js"
34
+ "types": "./deno/index.d.ts",
35
+ "require": "./deno/index.cjs",
36
+ "import": "./deno/index.js"
32
37
  }
33
38
  },
34
39
  "keywords": [],
@@ -43,10 +48,11 @@
43
48
  "yaml": "^2.5.1"
44
49
  },
45
50
  "devDependencies": {
46
- "@types/node": "^22.0.0",
51
+ "@cloudflare/vitest-pool-workers": "^0.5.40",
52
+ "@types/node": "^22.10.2",
47
53
  "@typescript-eslint/eslint-plugin": "^8.7.0",
48
54
  "@typescript-eslint/parser": "^8.7.0",
49
- "@vitest/browser": "^2.1.1",
55
+ "@vitest/browser": "^2.1.8",
50
56
  "esbuild-plugin-replace": "^1.4.0",
51
57
  "esbuild-plugin-resolve": "^2.0.0",
52
58
  "eslint": "9.17.0",
@@ -56,19 +62,20 @@
56
62
  "typescript": "^5.7.2",
57
63
  "typescript-eslint": "^8.18.2",
58
64
  "vite-tsconfig-paths": "^5.0.1",
59
- "vitest": "^2.1.1",
60
- "webdriverio": "^9.1.0"
65
+ "vitest": "^2.1.8",
66
+ "webdriverio": "^9.4.5"
61
67
  },
62
68
  "engines": {
63
- "node": ">=16"
69
+ "node": ">=20"
64
70
  },
65
71
  "scripts": {
66
72
  "clean": "rm -rf dist node_modules",
67
- "build": "pnpm run build:tsc; pnpm run build:js",
73
+ "build": "pnpm run build:tsc; pnpm run build:js; pnpm run build:deno",
68
74
  "build:tsc": "tsc",
69
75
  "xbuild:js": "tsup",
70
76
  "build:js": "tsup --out-dir dist/pkg src/index.ts src/*/index.ts --sourcemap --format cjs,esm --dts --clean --external node:fs --external node:path",
71
- "test": "pnpm run test:js",
77
+ "build:deno": "deno publish --dry-run --unstable-sloppy-imports --allow-dirty",
78
+ "test": "pnpm run test:js; pnpm run test:deno",
72
79
  "test:deno": "deno run --quiet --allow-net --allow-write --allow-run --allow-sys --allow-ffi --allow-read --allow-env ./node_modules/vitest/vitest.mjs --run --project node",
73
80
  "test:js": "vitest --run",
74
81
  "pubdir": "bash -xe ./prepare-pubdir.sh",
@@ -0,0 +1,78 @@
1
+ import { BaseSysAbstraction, WrapperSysAbstraction, WrapperSysAbstractionParams } from "../base-sys-abstraction.js";
2
+ import { ResolveOnce } from "../resolve-once.js";
3
+ import { runtimeFn } from "../runtime.js";
4
+ import { SysAbstraction, SystemService, VoidFunc } from "../sys-abstraction.js";
5
+ import { Env, EnvActions, envFactory, EnvFactoryOpts, EnvImpl } from "../sys-env.js";
6
+ import { Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
7
+ import { WebFileService } from "../web/web-sys-abstraction.js";
8
+
9
+ const once = new ResolveOnce<CFEnvActions>();
10
+ export class CFEnvActions implements EnvActions {
11
+ readonly cfEnv: Map<string, string>;
12
+ env?: EnvImpl;
13
+ static new(opts: Partial<EnvFactoryOpts>): EnvActions {
14
+ return once.once(() => new CFEnvActions(opts));
15
+ }
16
+ static inject(o: Record<string, string>): void {
17
+ const env = CFEnvActions.new({}) as CFEnvActions;
18
+ for (const key in o) {
19
+ const value = o[key];
20
+ if (typeof value === "string") {
21
+ env.env?.set(key, value);
22
+ }
23
+ }
24
+ }
25
+ private constructor(env: Partial<EnvFactoryOpts>) {
26
+ this.cfEnv = new Map<string, string>(Object.entries(env.presetEnv || {}));
27
+ }
28
+ active(): boolean {
29
+ return runtimeFn().isCFWorker;
30
+ }
31
+ register(env: Env): Env {
32
+ this.env = env as EnvImpl;
33
+ return env;
34
+ }
35
+ get(key: string): string | undefined {
36
+ return this.cfEnv.get(key);
37
+ }
38
+ set(key: string, value?: string): void {
39
+ if (value) {
40
+ this.cfEnv.set(key, value);
41
+ }
42
+ }
43
+ delete(key: string): void {
44
+ this.cfEnv.delete(key);
45
+ }
46
+ keys(): string[] {
47
+ return Array.from(this.cfEnv.keys());
48
+ }
49
+ }
50
+
51
+ export class CFSystemService implements SystemService {
52
+ Env(): Env {
53
+ return envFactory();
54
+ }
55
+ Args(): string[] {
56
+ throw new Error("Args-Method not implemented.");
57
+ }
58
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
59
+ OnExit(hdl: VoidFunc): VoidFunc {
60
+ throw new Error("OnExit-Method not implemented.");
61
+ }
62
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
+ Exit(code: number): void {
64
+ throw new Error("Exit-Method not implemented.");
65
+ }
66
+ }
67
+
68
+ let my: BaseSysAbstraction | undefined = undefined;
69
+ export function CFSysAbstraction(param?: WrapperSysAbstractionParams): SysAbstraction {
70
+ if (!my) {
71
+ my = new BaseSysAbstraction({
72
+ TxtEnDecoder: param?.TxtEnDecoder || Utf8EnDecoderSingleton(),
73
+ FileSystem: new WebFileService(),
74
+ SystemService: new CFSystemService(),
75
+ });
76
+ }
77
+ return new WrapperSysAbstraction(my, param);
78
+ }
@@ -0,0 +1 @@
1
+ export * from "./cf-sys-abstraction.js";
@@ -1,6 +1,6 @@
1
+ import * as path from "node:path";
1
2
  import { FileService, NamedWritableStream } from "../file-service.js";
2
3
  import { TxtEnDecoder, Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
3
- import * as path from "node:path";
4
4
 
5
5
  const Deno = (globalThis as unknown as { Deno: unknown }).Deno as {
6
6
  cwd(): string;
@@ -64,7 +64,7 @@ export class DenoFileService implements FileService {
64
64
  return path.isAbsolute(fname);
65
65
  }
66
66
 
67
- async writeFileString(fname: string, content: string, ende = Utf8EnDecoderSingleton()): Promise<void> {
67
+ async writeFileString(fname: string, content: string, ende: TxtEnDecoder = Utf8EnDecoderSingleton()): Promise<void> {
68
68
  const o = await this.create(fname);
69
69
  const wr = o.stream.getWriter();
70
70
  await wr.write(ende.encode(content));
@@ -1,21 +1,78 @@
1
- import { SysAbstraction, SystemService, VoidFunc } from "../sys-abstraction.js";
2
1
  import {
3
- BaseSysAbstraction,
4
- ExitHandler,
5
2
  ExitService,
6
- WrapperSysAbstraction,
3
+ ExitHandler,
4
+ BaseSysAbstraction,
7
5
  WrapperSysAbstractionParams,
6
+ WrapperSysAbstraction,
8
7
  } from "../base-sys-abstraction.js";
9
- import { Env, envFactory } from "../sys-env.js";
8
+ import { ResolveOnce } from "../resolve-once.js";
9
+ import { runtimeFn } from "../runtime.js";
10
+ import { SysAbstraction, SystemService, VoidFunc } from "../sys-abstraction.js";
11
+ import { Env, EnvActions, envFactory, EnvFactoryOpts } from "../sys-env.js";
10
12
  import { Utf8EnDecoderSingleton } from "../txt-en-decoder.js";
11
- import * as process from "node:process";
13
+ // import * as process from "node:process";
12
14
  import { DenoFileService } from "./deno-file-service.js";
13
15
 
14
16
  const Deno = (globalThis as unknown as { Deno: unknown }).Deno as {
15
17
  addSignalListener(sig: string, hdl: () => void): void;
16
18
  exit(code?: number): void;
19
+ args: string[];
17
20
  };
18
21
 
22
+ interface DenoEnv {
23
+ get: (key: string) => string | undefined;
24
+ toObject: () => Record<string, string>;
25
+ set: (key: string, value: string) => void;
26
+ has: (key: string) => boolean;
27
+ delete: (key: string) => void;
28
+ }
29
+
30
+ const once = new ResolveOnce<DenoEnvActions>();
31
+ export class DenoEnvActions implements EnvActions {
32
+ readonly #deno = globalThis as unknown as {
33
+ Deno: {
34
+ env: DenoEnv;
35
+ };
36
+ };
37
+
38
+ static new(opts: Partial<EnvFactoryOpts>): EnvActions {
39
+ return once.once(() => new DenoEnvActions(opts));
40
+ }
41
+
42
+ get _env(): DenoEnv {
43
+ return this.#deno.Deno.env;
44
+ }
45
+
46
+ readonly opts: Partial<EnvFactoryOpts>;
47
+ private constructor(opts: Partial<EnvFactoryOpts>) {
48
+ this.opts = opts;
49
+ }
50
+
51
+ register(env: Env): Env {
52
+ for (const key of env.keys()) {
53
+ this._env.set(key, env.get(key) || "");
54
+ }
55
+ return env;
56
+ }
57
+ active(): boolean {
58
+ return runtimeFn().isDeno;
59
+ }
60
+ keys(): string[] {
61
+ return Object.keys(this._env.toObject());
62
+ }
63
+ get(key: string): string | undefined {
64
+ return this._env.get(key);
65
+ }
66
+ set(key: string, value?: string): void {
67
+ if (value) {
68
+ this._env.set(key, value);
69
+ }
70
+ }
71
+ delete(key: string): void {
72
+ this._env.delete(key);
73
+ }
74
+ }
75
+
19
76
  export class DenoExitServiceImpl implements ExitService {
20
77
  constructor() {
21
78
  globalThis.addEventListener("unhandledrejection", (e) => {
@@ -101,7 +158,7 @@ export class DenoSystemService implements SystemService {
101
158
  }
102
159
 
103
160
  Args(): string[] {
104
- return process.argv;
161
+ return Deno.args;
105
162
  }
106
163
 
107
164
  OnExit(hdl: VoidFunc): VoidFunc {