jseption 0.0.0-stage → 0.0.1

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 (114) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +191 -2
  3. package/dist/atoms.d.ts +255 -0
  4. package/dist/atoms.js +445 -0
  5. package/dist/atoms.js.map +1 -0
  6. package/dist/builtins/array.d.ts +3 -0
  7. package/dist/builtins/array.js +116 -0
  8. package/dist/builtins/array.js.map +1 -0
  9. package/dist/builtins/bigint.d.ts +3 -0
  10. package/dist/builtins/bigint.js +122 -0
  11. package/dist/builtins/bigint.js.map +1 -0
  12. package/dist/builtins/boolean.d.ts +2 -0
  13. package/dist/builtins/boolean.js +26 -0
  14. package/dist/builtins/boolean.js.map +1 -0
  15. package/dist/builtins/date.d.ts +3 -0
  16. package/dist/builtins/date.js +1046 -0
  17. package/dist/builtins/date.js.map +1 -0
  18. package/dist/builtins/error.d.ts +2 -0
  19. package/dist/builtins/error.js +154 -0
  20. package/dist/builtins/error.js.map +1 -0
  21. package/dist/builtins/function.d.ts +5 -0
  22. package/dist/builtins/function.js +164 -0
  23. package/dist/builtins/function.js.map +1 -0
  24. package/dist/builtins/global.d.ts +2 -0
  25. package/dist/builtins/global.js +29 -0
  26. package/dist/builtins/global.js.map +1 -0
  27. package/dist/builtins/index.d.ts +3 -0
  28. package/dist/builtins/index.js +139 -0
  29. package/dist/builtins/index.js.map +1 -0
  30. package/dist/builtins/json.d.ts +6 -0
  31. package/dist/builtins/json.js +984 -0
  32. package/dist/builtins/json.js.map +1 -0
  33. package/dist/builtins/mapset.d.ts +4 -0
  34. package/dist/builtins/mapset.js +234 -0
  35. package/dist/builtins/mapset.js.map +1 -0
  36. package/dist/builtins/math.d.ts +2 -0
  37. package/dist/builtins/math.js +62 -0
  38. package/dist/builtins/math.js.map +1 -0
  39. package/dist/builtins/native.d.ts +22 -0
  40. package/dist/builtins/native.js +250 -0
  41. package/dist/builtins/native.js.map +1 -0
  42. package/dist/builtins/number.d.ts +4 -0
  43. package/dist/builtins/number.js +76 -0
  44. package/dist/builtins/number.js.map +1 -0
  45. package/dist/builtins/object.d.ts +12 -0
  46. package/dist/builtins/object.js +575 -0
  47. package/dist/builtins/object.js.map +1 -0
  48. package/dist/builtins/promise.d.ts +13 -0
  49. package/dist/builtins/promise.js +582 -0
  50. package/dist/builtins/promise.js.map +1 -0
  51. package/dist/builtins/proxy.d.ts +3 -0
  52. package/dist/builtins/proxy.js +226 -0
  53. package/dist/builtins/proxy.js.map +1 -0
  54. package/dist/builtins/reflect.d.ts +2 -0
  55. package/dist/builtins/reflect.js +109 -0
  56. package/dist/builtins/reflect.js.map +1 -0
  57. package/dist/builtins/regexp.d.ts +2 -0
  58. package/dist/builtins/regexp.js +203 -0
  59. package/dist/builtins/regexp.js.map +1 -0
  60. package/dist/builtins/string.d.ts +4 -0
  61. package/dist/builtins/string.js +135 -0
  62. package/dist/builtins/string.js.map +1 -0
  63. package/dist/builtins/symbol.d.ts +3 -0
  64. package/dist/builtins/symbol.js +98 -0
  65. package/dist/builtins/symbol.js.map +1 -0
  66. package/dist/builtins/typedarray.d.ts +15 -0
  67. package/dist/builtins/typedarray.js +1838 -0
  68. package/dist/builtins/typedarray.js.map +1 -0
  69. package/dist/builtins/weakref.d.ts +18 -0
  70. package/dist/builtins/weakref.js +130 -0
  71. package/dist/builtins/weakref.js.map +1 -0
  72. package/dist/dump.d.ts +2 -0
  73. package/dist/dump.js +124 -0
  74. package/dist/dump.js.map +1 -0
  75. package/dist/embed.d.ts +18 -0
  76. package/dist/embed.js +286 -0
  77. package/dist/embed.js.map +1 -0
  78. package/dist/interpreter.d.ts +81 -0
  79. package/dist/interpreter.js +3768 -0
  80. package/dist/interpreter.js.map +1 -0
  81. package/dist/jit.d.ts +59 -0
  82. package/dist/jit.js +3429 -0
  83. package/dist/jit.js.map +1 -0
  84. package/dist/jit_hook.d.ts +21 -0
  85. package/dist/jit_hook.js +4 -0
  86. package/dist/jit_hook.js.map +1 -0
  87. package/dist/jit_runtime.d.ts +101 -0
  88. package/dist/jit_runtime.js +690 -0
  89. package/dist/jit_runtime.js.map +1 -0
  90. package/dist/jit_stack.d.ts +24 -0
  91. package/dist/jit_stack.js +227 -0
  92. package/dist/jit_stack.js.map +1 -0
  93. package/dist/jseption.d.ts +15 -0
  94. package/dist/jseption.js +61 -0
  95. package/dist/jseption.js.map +1 -0
  96. package/dist/opcodes.d.ts +347 -0
  97. package/dist/opcodes.js +322 -0
  98. package/dist/opcodes.js.map +1 -0
  99. package/dist/parser.d.ts +283 -0
  100. package/dist/parser.js +9752 -0
  101. package/dist/parser.js.map +1 -0
  102. package/dist/qjs.d.ts +2 -0
  103. package/dist/qjs.js +122 -0
  104. package/dist/qjs.js.map +1 -0
  105. package/dist/quickjs.d.ts +460 -0
  106. package/dist/quickjs.js +3408 -0
  107. package/dist/quickjs.js.map +1 -0
  108. package/dist/std.d.ts +4 -0
  109. package/dist/std.js +273 -0
  110. package/dist/std.js.map +1 -0
  111. package/dist/values.d.ts +447 -0
  112. package/dist/values.js +461 -0
  113. package/dist/values.js.map +1 -0
  114. package/package.json +59 -4
package/dist/std.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { JSContext } from './quickjs.ts';
2
+ export declare function js_std_add_helpers(ctx: JSContext, args: string[]): void;
3
+ export declare function js_std_dump_error(ctx: JSContext): void;
4
+ export declare function js_std_loop(ctx: JSContext): Promise<void>;
package/dist/std.js ADDED
@@ -0,0 +1,273 @@
1
+ /*
2
+ * Minimal host bindings for the command line interpreter: port of a subset
3
+ * of quickjs-libc.c (print, console, scriptArgs, std.*, os.*).
4
+ */
5
+ import { JS_IsException, JS_ToString, JS_GetException, JS_NewObject, JS_NewCFunction, JS_DefinePropertyValueStr, JS_PROP_WRITABLE, JS_PROP_CONFIGURABLE, JS_NewArrayFrom, JS_SetPropertyFunctionList, JS_CFUNC_DEF, JS_CFUNC_MAGIC_DEF, JS_Call, JS_ThrowTypeError, JS_Eval, JS_EVAL_TYPE_GLOBAL, JS_ToFloat64, JS_IsFunction, JS_ExecutePendingJob, JS_NewObjectProto, JS_EXCEPTION, JS_GetAnyOpaque, JS_SetOpaque, } from "./quickjs.js";
6
+ import { formatException } from "./jseption.js";
7
+ import { readFileSync, writeFileSync } from 'node:fs';
8
+ const enc = new TextEncoder();
9
+ function write_out(fd, s) {
10
+ if (fd === 2)
11
+ process.stderr.write(s);
12
+ else
13
+ process.stdout.write(s);
14
+ }
15
+ function js_print_internal(ctx, argv, fd) {
16
+ let out = '';
17
+ for (let i = 0; i < argv.length; i++) {
18
+ if (i !== 0)
19
+ out += ' ';
20
+ const str = JS_ToString(ctx, argv[i]);
21
+ if (JS_IsException(str))
22
+ return str;
23
+ out += str;
24
+ }
25
+ write_out(fd, out + '\n');
26
+ return undefined;
27
+ }
28
+ function js_print(ctx, this_val, argv) {
29
+ return js_print_internal(ctx, argv, 1);
30
+ }
31
+ function js_console_log(ctx, this_val, argv, magic) {
32
+ return js_print_internal(ctx, argv, magic);
33
+ }
34
+ /* std.evalScript(str) */
35
+ function js_std_evalScript(ctx, this_val, argv) {
36
+ const str = JS_ToString(ctx, argv[0]);
37
+ if (JS_IsException(str))
38
+ return str;
39
+ return JS_Eval(ctx, str, '<evalScript>', JS_EVAL_TYPE_GLOBAL);
40
+ }
41
+ function js_std_loadFile(ctx, this_val, argv) {
42
+ const str = JS_ToString(ctx, argv[0]);
43
+ if (JS_IsException(str))
44
+ return str;
45
+ try {
46
+ return readFileSync(str, 'utf8');
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function js_std_writeFile(ctx, this_val, argv) {
53
+ const name = JS_ToString(ctx, argv[0]);
54
+ if (JS_IsException(name))
55
+ return name;
56
+ const data = JS_ToString(ctx, argv[1]);
57
+ if (JS_IsException(data))
58
+ return data;
59
+ writeFileSync(name, data);
60
+ return undefined;
61
+ }
62
+ function js_std_exit(ctx, this_val, argv) {
63
+ const code = JS_ToFloat64(ctx, argv[0]);
64
+ process.exit(JS_IsException(code) ? 1 : code | 0);
65
+ }
66
+ function js_std_gc(ctx, this_val, argv) {
67
+ return undefined;
68
+ }
69
+ function js_std_getenv(ctx, this_val, argv) {
70
+ const name = JS_ToString(ctx, argv[0]);
71
+ if (JS_IsException(name))
72
+ return name;
73
+ const v = process.env[name];
74
+ return v === undefined ? undefined : v;
75
+ }
76
+ const os_timers = [];
77
+ let os_timer_id = 1;
78
+ function js_os_setTimeout(ctx, this_val, argv) {
79
+ const func = argv[0];
80
+ if (!JS_IsFunction(ctx, func))
81
+ return JS_ThrowTypeError(ctx, 'not a function');
82
+ const delay = JS_ToFloat64(ctx, argv[1]);
83
+ if (JS_IsException(delay))
84
+ return delay;
85
+ const th = { id: os_timer_id++, func, timeout: Date.now() + Math.max(0, delay) };
86
+ os_timers.push(th);
87
+ return th.id;
88
+ }
89
+ function js_os_clearTimeout(ctx, this_val, argv) {
90
+ const id = JS_ToFloat64(ctx, argv[0]);
91
+ if (JS_IsException(id))
92
+ return id;
93
+ const i = os_timers.findIndex(t => t.id === id);
94
+ if (i >= 0)
95
+ os_timers.splice(i, 1);
96
+ return undefined;
97
+ }
98
+ function js_os_now(ctx, this_val, argv) {
99
+ return performance.now();
100
+ }
101
+ /* std.open(filename, mode): minimal FILE object (in-memory buffer) */
102
+ class StdFile {
103
+ name;
104
+ mode;
105
+ data;
106
+ pos = 0;
107
+ constructor(name, mode, data) {
108
+ this.name = name;
109
+ this.mode = mode;
110
+ this.data = data;
111
+ }
112
+ }
113
+ function std_file_get(ctx, this_val) {
114
+ const f = JS_GetAnyOpaque(this_val);
115
+ if (f instanceof StdFile)
116
+ return f;
117
+ JS_ThrowTypeError(ctx, 'not a FILE object');
118
+ return null;
119
+ }
120
+ function js_std_file_puts(ctx, this_val, argv) {
121
+ const f = std_file_get(ctx, this_val);
122
+ if (!f)
123
+ return JS_EXCEPTION;
124
+ for (const a of argv) {
125
+ const str = JS_ToString(ctx, a);
126
+ if (JS_IsException(str))
127
+ return str;
128
+ f.data += str;
129
+ }
130
+ return undefined;
131
+ }
132
+ function js_std_file_getline(ctx, this_val, argv) {
133
+ const f = std_file_get(ctx, this_val);
134
+ if (!f)
135
+ return JS_EXCEPTION;
136
+ if (f.pos >= f.data.length)
137
+ return null;
138
+ let end = f.data.indexOf('\n', f.pos);
139
+ if (end < 0)
140
+ end = f.data.length;
141
+ const line = f.data.substring(f.pos, end);
142
+ f.pos = end + 1;
143
+ return line;
144
+ }
145
+ function js_std_file_readAsString(ctx, this_val, argv) {
146
+ const f = std_file_get(ctx, this_val);
147
+ if (!f)
148
+ return JS_EXCEPTION;
149
+ const r = f.data.substring(f.pos);
150
+ f.pos = f.data.length;
151
+ return r;
152
+ }
153
+ function js_std_file_eof(ctx, this_val, argv) {
154
+ const f = std_file_get(ctx, this_val);
155
+ if (!f)
156
+ return JS_EXCEPTION;
157
+ return f.pos >= f.data.length;
158
+ }
159
+ function js_std_file_close(ctx, this_val, argv) {
160
+ const f = std_file_get(ctx, this_val);
161
+ if (!f)
162
+ return JS_EXCEPTION;
163
+ if (f.mode.includes('w') || f.mode.includes('a')) {
164
+ try {
165
+ writeFileSync(f.name, f.data);
166
+ }
167
+ catch {
168
+ return -1;
169
+ }
170
+ }
171
+ return 0;
172
+ }
173
+ let std_file_proto = undefined;
174
+ function js_std_open(ctx, this_val, argv) {
175
+ const name = JS_ToString(ctx, argv[0]);
176
+ if (JS_IsException(name))
177
+ return name;
178
+ const mode = JS_ToString(ctx, argv[1]);
179
+ if (JS_IsException(mode))
180
+ return mode;
181
+ let data = '';
182
+ if (mode.includes('r') || mode.includes('a')) {
183
+ try {
184
+ data = readFileSync(name, 'utf8');
185
+ }
186
+ catch {
187
+ if (!mode.includes('a'))
188
+ return null;
189
+ }
190
+ }
191
+ if (std_file_proto === undefined) {
192
+ std_file_proto = JS_NewObject(ctx);
193
+ JS_SetPropertyFunctionList(ctx, std_file_proto, [
194
+ JS_CFUNC_DEF('puts', 1, js_std_file_puts),
195
+ JS_CFUNC_DEF('getline', 0, js_std_file_getline),
196
+ JS_CFUNC_DEF('readAsString', 0, js_std_file_readAsString),
197
+ JS_CFUNC_DEF('eof', 0, js_std_file_eof),
198
+ JS_CFUNC_DEF('close', 0, js_std_file_close),
199
+ ]);
200
+ }
201
+ const obj = JS_NewObjectProto(ctx, std_file_proto);
202
+ JS_SetOpaque(obj, new StdFile(name, mode, data));
203
+ return obj;
204
+ }
205
+ const js_std_funcs = [
206
+ JS_CFUNC_DEF('open', 2, js_std_open),
207
+ JS_CFUNC_DEF('evalScript', 1, js_std_evalScript),
208
+ JS_CFUNC_DEF('loadFile', 1, js_std_loadFile),
209
+ JS_CFUNC_DEF('writeFile', 2, js_std_writeFile),
210
+ JS_CFUNC_DEF('exit', 1, js_std_exit),
211
+ JS_CFUNC_DEF('gc', 0, js_std_gc),
212
+ JS_CFUNC_DEF('getenv', 1, js_std_getenv),
213
+ ];
214
+ const js_os_funcs = [
215
+ JS_CFUNC_DEF('setTimeout', 2, js_os_setTimeout),
216
+ JS_CFUNC_DEF('clearTimeout', 1, js_os_clearTimeout),
217
+ JS_CFUNC_DEF('now', 0, js_os_now),
218
+ ];
219
+ export function js_std_add_helpers(ctx, args) {
220
+ const global = ctx.global_obj;
221
+ /* scriptArgs */
222
+ JS_DefinePropertyValueStr(ctx, global, 'scriptArgs', JS_NewArrayFrom(ctx, args.slice()), JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
223
+ JS_DefinePropertyValueStr(ctx, global, 'print', JS_NewCFunction(ctx, js_print, 'print', 1), JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
224
+ const console = JS_NewObject(ctx);
225
+ JS_SetPropertyFunctionList(ctx, console, [
226
+ JS_CFUNC_MAGIC_DEF('log', 1, js_console_log, 1),
227
+ JS_CFUNC_MAGIC_DEF('info', 1, js_console_log, 1),
228
+ JS_CFUNC_MAGIC_DEF('debug', 1, js_console_log, 1),
229
+ JS_CFUNC_MAGIC_DEF('warn', 1, js_console_log, 2),
230
+ JS_CFUNC_MAGIC_DEF('error', 1, js_console_log, 2),
231
+ ]);
232
+ JS_DefinePropertyValueStr(ctx, global, 'console', console, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
233
+ const std = JS_NewObject(ctx);
234
+ JS_SetPropertyFunctionList(ctx, std, js_std_funcs);
235
+ JS_DefinePropertyValueStr(ctx, global, 'std', std, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
236
+ const os = JS_NewObject(ctx);
237
+ JS_SetPropertyFunctionList(ctx, os, js_os_funcs);
238
+ JS_DefinePropertyValueStr(ctx, os, 'platform', process.platform, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
239
+ JS_DefinePropertyValueStr(ctx, global, 'os', os, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
240
+ }
241
+ export function js_std_dump_error(ctx) {
242
+ const exc = JS_GetException(ctx);
243
+ process.stderr.write(formatException(ctx, exc) + '\n');
244
+ }
245
+ /* main loop: run pending jobs and timers until none is left */
246
+ export async function js_std_loop(ctx) {
247
+ const rt = ctx.rt;
248
+ for (;;) {
249
+ /* execute the pending jobs */
250
+ const pctx = { ctx: null };
251
+ for (;;) {
252
+ const r = JS_ExecutePendingJob(rt, pctx);
253
+ if (r <= 0) {
254
+ if (r < 0 && pctx.ctx)
255
+ js_std_dump_error(pctx.ctx);
256
+ break;
257
+ }
258
+ }
259
+ if (os_timers.length === 0)
260
+ break;
261
+ /* run the earliest timer */
262
+ os_timers.sort((a, b) => a.timeout - b.timeout);
263
+ const th = os_timers[0];
264
+ const delay = th.timeout - Date.now();
265
+ if (delay > 0)
266
+ await new Promise(res => setTimeout(res, delay));
267
+ os_timers.shift();
268
+ const ret = JS_Call(ctx, th.func, undefined, []);
269
+ if (JS_IsException(ret))
270
+ js_std_dump_error(ctx);
271
+ }
272
+ }
273
+ //# sourceMappingURL=std.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"std.js","sourceRoot":"","sources":["../src/std.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACe,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAC9E,yBAAyB,EAAiB,gBAAgB,EAAE,oBAAoB,EAAE,eAAe,EAClH,0BAA0B,EAAE,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,EACxF,OAAO,EAAE,mBAAmB,EAAiC,YAAY,EAAE,aAAa,EACxF,oBAAoB,EAA8C,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAClH,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9B,SAAS,SAAS,CAAC,EAAU,EAAE,CAAS;IACtC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;QAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAc,EAAE,IAAe,EAAE,EAAU;IACpE,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC;YAAE,GAAG,IAAI,GAAG,CAAC;QACxB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,cAAc,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACpC,GAAG,IAAI,GAAa,CAAC;IACvB,CAAC;IACD,SAAS,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;IAC1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAClE,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,cAAc,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe,EAAE,KAAa;IACvF,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,yBAAyB;AACzB,SAAS,iBAAiB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC3E,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,EAAE,GAAa,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACzE,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAa,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,aAAa,CAAC,IAAc,EAAE,IAAc,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACrE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,IAAe,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,SAAS,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACnE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAID,MAAM,SAAS,GAAgB,EAAE,CAAC;AAClC,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,SAAS,gBAAgB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC;QAAE,OAAO,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,EAAE,GAAc,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAe,CAAC,EAAE,CAAC;IACtG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC5E,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,cAAc,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC;QAAE,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACnE,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED,sEAAsE;AACtE,MAAM,OAAO;IAGQ;IAAqB;IAFxC,IAAI,CAAS;IACb,GAAG,GAAG,CAAC,CAAC;IACR,YAAmB,IAAY,EAAS,IAAY,EAAE,IAAY;QAA/C,SAAI,GAAJ,IAAI,CAAQ;QAAS,SAAI,GAAJ,IAAI,CAAQ;QAAkB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAC,CAAC;CAC1F;AAED,SAAS,YAAY,CAAC,GAAc,EAAE,QAAiB;IACrD,MAAM,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,YAAY,OAAO;QAAE,OAAO,CAAC,CAAC;IACnC,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC1E,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,cAAc,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACpC,CAAC,CAAC,IAAI,IAAI,GAAa,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC7E,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5B,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC;QAAE,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAClF,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACtB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,eAAe,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACzE,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IAC3E,MAAM,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5B,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC;YAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,CAAC,CAAC,CAAC;QAAC,CAAC;IAC7D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,IAAI,cAAc,GAAY,SAAS,CAAC;AAExC,SAAS,WAAW,CAAC,GAAc,EAAE,QAAiB,EAAE,IAAe;IACrE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAK,IAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAK,IAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC;YAAC,IAAI,GAAG,YAAY,CAAC,IAAc,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,IAAI,CAAE,IAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;QAAC,CAAC;IAClH,CAAC;IACD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACnC,0BAA0B,CAAC,GAAG,EAAE,cAAc,EAAE;YAC9C,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC;YACzC,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,mBAAmB,CAAC;YAC/C,YAAY,CAAC,cAAc,EAAE,CAAC,EAAE,wBAAwB,CAAC;YACzD,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC;YACvC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,iBAAiB,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,YAAY,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,IAAc,EAAE,IAAc,EAAE,IAAI,CAAC,CAAC,CAAC;IACrE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC;IACpC,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAChD,YAAY,CAAC,UAAU,EAAE,CAAC,EAAE,eAAe,CAAC;IAC5C,YAAY,CAAC,WAAW,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC9C,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC;IACpC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC;IAChC,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,CAAC;CACzC,CAAC;AAEF,MAAM,WAAW,GAAG;IAClB,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC/C,YAAY,CAAC,cAAc,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACnD,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,GAAc,EAAE,IAAc;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;IAC9B,gBAAgB;IAChB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;IAClI,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;IACrI,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE;QACvC,kBAAkB,CAAC,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/C,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAChD,kBAAkB,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QACjD,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAChD,kBAAkB,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;KAClD,CAAC,CAAC;IACH,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;IACpG,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IACnD,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;IAC5F,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC7B,0BAA0B,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;IACjD,yBAAyB,CAAC,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;IAC1G,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAc;IAC9C,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAc;IAC9C,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;IAClB,SAAS,CAAC;QACR,8BAA8B;QAC9B,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,IAAwB,EAAE,CAAC;QAC/C,SAAS,CAAC;YACR,MAAM,CAAC,GAAG,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG;oBAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnD,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM;QAClC,4BAA4B;QAC5B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAChE,SAAS,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,cAAc,CAAC,GAAG,CAAC;YAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC","sourcesContent":["/*\n * Minimal host bindings for the command line interpreter: port of a subset\n * of quickjs-libc.c (print, console, scriptArgs, std.*, os.*).\n */\nimport {\n JSContext, JSValue, JS_IsException, JS_ToString, JS_GetException, JS_NewObject, JS_NewCFunction, JS_NewCFunctionMagic,\n JSCFunctionEnum, JS_DefinePropertyValueStr, JS_PROP_C_W_E, JS_PROP_WRITABLE, JS_PROP_CONFIGURABLE, JS_NewArrayFrom,\n JS_SetPropertyFunctionList, JS_CFUNC_DEF, JS_CFUNC_MAGIC_DEF, JS_Call, JS_ThrowTypeError, JS_ThrowReferenceError,\n JS_Eval, JS_EVAL_TYPE_GLOBAL, JS_IsError, JS_GetPropertyStr, JS_ToFloat64, JS_IsFunction, JS_NewError,\n JS_ExecutePendingJob, JS_IsJobPending, JSRuntime, JS_IsUndefined, JS_NewObjectProto, JS_EXCEPTION, JS_GetAnyOpaque,\n JS_SetOpaque,\n} from './quickjs.ts';\nimport { formatException } from './jseption.ts';\nimport { readFileSync, writeFileSync } from 'node:fs';\n\nconst enc = new TextEncoder();\n\nfunction write_out(fd: number, s: string): void {\n if (fd === 2) process.stderr.write(s); else process.stdout.write(s);\n}\n\nfunction js_print_internal(ctx: JSContext, argv: JSValue[], fd: number): JSValue {\n let out = '';\n for (let i = 0; i < argv.length; i++) {\n if (i !== 0) out += ' ';\n const str = JS_ToString(ctx, argv[i]);\n if (JS_IsException(str)) return str;\n out += str as string;\n }\n write_out(fd, out + '\\n');\n return undefined;\n}\n\nfunction js_print(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n return js_print_internal(ctx, argv, 1);\n}\n\nfunction js_console_log(ctx: JSContext, this_val: JSValue, argv: JSValue[], magic: number): JSValue {\n return js_print_internal(ctx, argv, magic);\n}\n\n/* std.evalScript(str) */\nfunction js_std_evalScript(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const str = JS_ToString(ctx, argv[0]);\n if (JS_IsException(str)) return str;\n return JS_Eval(ctx, str as string, '<evalScript>', JS_EVAL_TYPE_GLOBAL);\n}\n\nfunction js_std_loadFile(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const str = JS_ToString(ctx, argv[0]);\n if (JS_IsException(str)) return str;\n try {\n return readFileSync(str as string, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction js_std_writeFile(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const name = JS_ToString(ctx, argv[0]);\n if (JS_IsException(name)) return name;\n const data = JS_ToString(ctx, argv[1]);\n if (JS_IsException(data)) return data;\n writeFileSync(name as string, data as string);\n return undefined;\n}\n\nfunction js_std_exit(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const code = JS_ToFloat64(ctx, argv[0]);\n process.exit(JS_IsException(code) ? 1 : (code as number) | 0);\n}\n\nfunction js_std_gc(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n return undefined;\n}\n\nfunction js_std_getenv(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const name = JS_ToString(ctx, argv[0]);\n if (JS_IsException(name)) return name;\n const v = process.env[name as string];\n return v === undefined ? undefined : v;\n}\n\n/* timers: os.setTimeout(func, delay) / os.clearTimeout(id) */\ninterface JSOSTimer { id: number; func: JSValue; timeout: number }\nconst os_timers: JSOSTimer[] = [];\nlet os_timer_id = 1;\n\nfunction js_os_setTimeout(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const func = argv[0];\n if (!JS_IsFunction(ctx, func)) return JS_ThrowTypeError(ctx, 'not a function');\n const delay = JS_ToFloat64(ctx, argv[1]);\n if (JS_IsException(delay)) return delay;\n const th: JSOSTimer = { id: os_timer_id++, func, timeout: Date.now() + Math.max(0, delay as number) };\n os_timers.push(th);\n return th.id;\n}\n\nfunction js_os_clearTimeout(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const id = JS_ToFloat64(ctx, argv[0]);\n if (JS_IsException(id)) return id;\n const i = os_timers.findIndex(t => t.id === id);\n if (i >= 0) os_timers.splice(i, 1);\n return undefined;\n}\n\nfunction js_os_now(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n return performance.now();\n}\n\n/* std.open(filename, mode): minimal FILE object (in-memory buffer) */\nclass StdFile {\n data: string;\n pos = 0;\n constructor(public name: string, public mode: string, data: string) { this.data = data; }\n}\n\nfunction std_file_get(ctx: JSContext, this_val: JSValue): StdFile | null {\n const f = JS_GetAnyOpaque(this_val);\n if (f instanceof StdFile) return f;\n JS_ThrowTypeError(ctx, 'not a FILE object');\n return null;\n}\n\nfunction js_std_file_puts(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const f = std_file_get(ctx, this_val);\n if (!f) return JS_EXCEPTION;\n for (const a of argv) {\n const str = JS_ToString(ctx, a);\n if (JS_IsException(str)) return str;\n f.data += str as string;\n }\n return undefined;\n}\n\nfunction js_std_file_getline(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const f = std_file_get(ctx, this_val);\n if (!f) return JS_EXCEPTION;\n if (f.pos >= f.data.length) return null;\n let end = f.data.indexOf('\\n', f.pos);\n if (end < 0) end = f.data.length;\n const line = f.data.substring(f.pos, end);\n f.pos = end + 1;\n return line;\n}\n\nfunction js_std_file_readAsString(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const f = std_file_get(ctx, this_val);\n if (!f) return JS_EXCEPTION;\n const r = f.data.substring(f.pos);\n f.pos = f.data.length;\n return r;\n}\n\nfunction js_std_file_eof(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const f = std_file_get(ctx, this_val);\n if (!f) return JS_EXCEPTION;\n return f.pos >= f.data.length;\n}\n\nfunction js_std_file_close(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const f = std_file_get(ctx, this_val);\n if (!f) return JS_EXCEPTION;\n if (f.mode.includes('w') || f.mode.includes('a')) {\n try { writeFileSync(f.name, f.data); } catch { return -1; }\n }\n return 0;\n}\n\nlet std_file_proto: JSValue = undefined;\n\nfunction js_std_open(ctx: JSContext, this_val: JSValue, argv: JSValue[]): JSValue {\n const name = JS_ToString(ctx, argv[0]);\n if (JS_IsException(name)) return name;\n const mode = JS_ToString(ctx, argv[1]);\n if (JS_IsException(mode)) return mode;\n let data = '';\n if ((mode as string).includes('r') || (mode as string).includes('a')) {\n try { data = readFileSync(name as string, 'utf8'); } catch { if (!(mode as string).includes('a')) return null; }\n }\n if (std_file_proto === undefined) {\n std_file_proto = JS_NewObject(ctx);\n JS_SetPropertyFunctionList(ctx, std_file_proto, [\n JS_CFUNC_DEF('puts', 1, js_std_file_puts),\n JS_CFUNC_DEF('getline', 0, js_std_file_getline),\n JS_CFUNC_DEF('readAsString', 0, js_std_file_readAsString),\n JS_CFUNC_DEF('eof', 0, js_std_file_eof),\n JS_CFUNC_DEF('close', 0, js_std_file_close),\n ]);\n }\n const obj = JS_NewObjectProto(ctx, std_file_proto);\n JS_SetOpaque(obj, new StdFile(name as string, mode as string, data));\n return obj;\n}\n\nconst js_std_funcs = [\n JS_CFUNC_DEF('open', 2, js_std_open),\n JS_CFUNC_DEF('evalScript', 1, js_std_evalScript),\n JS_CFUNC_DEF('loadFile', 1, js_std_loadFile),\n JS_CFUNC_DEF('writeFile', 2, js_std_writeFile),\n JS_CFUNC_DEF('exit', 1, js_std_exit),\n JS_CFUNC_DEF('gc', 0, js_std_gc),\n JS_CFUNC_DEF('getenv', 1, js_std_getenv),\n];\n\nconst js_os_funcs = [\n JS_CFUNC_DEF('setTimeout', 2, js_os_setTimeout),\n JS_CFUNC_DEF('clearTimeout', 1, js_os_clearTimeout),\n JS_CFUNC_DEF('now', 0, js_os_now),\n];\n\nexport function js_std_add_helpers(ctx: JSContext, args: string[]): void {\n const global = ctx.global_obj;\n /* scriptArgs */\n JS_DefinePropertyValueStr(ctx, global, 'scriptArgs', JS_NewArrayFrom(ctx, args.slice()), JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);\n JS_DefinePropertyValueStr(ctx, global, 'print', JS_NewCFunction(ctx, js_print, 'print', 1), JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);\n const console = JS_NewObject(ctx);\n JS_SetPropertyFunctionList(ctx, console, [\n JS_CFUNC_MAGIC_DEF('log', 1, js_console_log, 1),\n JS_CFUNC_MAGIC_DEF('info', 1, js_console_log, 1),\n JS_CFUNC_MAGIC_DEF('debug', 1, js_console_log, 1),\n JS_CFUNC_MAGIC_DEF('warn', 1, js_console_log, 2),\n JS_CFUNC_MAGIC_DEF('error', 1, js_console_log, 2),\n ]);\n JS_DefinePropertyValueStr(ctx, global, 'console', console, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);\n const std = JS_NewObject(ctx);\n JS_SetPropertyFunctionList(ctx, std, js_std_funcs);\n JS_DefinePropertyValueStr(ctx, global, 'std', std, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);\n const os = JS_NewObject(ctx);\n JS_SetPropertyFunctionList(ctx, os, js_os_funcs);\n JS_DefinePropertyValueStr(ctx, os, 'platform', process.platform, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);\n JS_DefinePropertyValueStr(ctx, global, 'os', os, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);\n}\n\nexport function js_std_dump_error(ctx: JSContext): void {\n const exc = JS_GetException(ctx);\n process.stderr.write(formatException(ctx, exc) + '\\n');\n}\n\n/* main loop: run pending jobs and timers until none is left */\nexport async function js_std_loop(ctx: JSContext): Promise<void> {\n const rt = ctx.rt;\n for (;;) {\n /* execute the pending jobs */\n const pctx = { ctx: null as JSContext | null };\n for (;;) {\n const r = JS_ExecutePendingJob(rt, pctx);\n if (r <= 0) {\n if (r < 0 && pctx.ctx) js_std_dump_error(pctx.ctx);\n break;\n }\n }\n if (os_timers.length === 0) break;\n /* run the earliest timer */\n os_timers.sort((a, b) => a.timeout - b.timeout);\n const th = os_timers[0];\n const delay = th.timeout - Date.now();\n if (delay > 0) await new Promise(res => setTimeout(res, delay));\n os_timers.shift();\n const ret = JS_Call(ctx, th.func, undefined, []);\n if (JS_IsException(ret)) js_std_dump_error(ctx);\n }\n}\n"]}