jseption 0.0.3 → 0.0.4

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.
package/dist/qjs.js CHANGED
@@ -2,29 +2,43 @@
2
2
  /*
3
3
  * qjs: command line interpreter (port of qjs.c)
4
4
  */
5
- import { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_FLAG_STRICT, JS_EVAL_FLAG_COMPILE_ONLY, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize } from "./jseption.js";
6
- import { js_std_add_helpers, js_std_loop, js_std_dump_error } from "./std.js";
5
+ import { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_TYPE_MODULE, JS_EVAL_FLAG_STRICT, JS_EVAL_FLAG_COMPILE_ONLY, JS_EVAL_FLAG_STRIP_TYPES, JS_EVAL_FLAG_JSX, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException, JSModuleDef, JS_SetModuleLoader, JS_ImportModule, JS_EvalModule, JS_DetectModule, JS_PromiseState, JS_PromiseResult } from "./jseption.js";
6
+ import { js_std_add_helpers, js_std_loop, js_std_dump_error, js_std_module_loader } from "./std.js";
7
7
  import { dump_byte_code } from "./dump.js";
8
+ import { js_module_type_of, js_module_type_flags } from "./module.js";
8
9
  import { readFileSync } from 'node:fs';
10
+ import { resolve as path_resolve } from 'node:path';
9
11
  function help() {
10
12
  console.log(`usage: qjs [options] [file [args]]
11
13
  -h --help list options
12
14
  -e --eval EXPR evaluate EXPR
13
15
  -i --interactive go to interactive mode
14
16
  -d --dump dump the bytecode of the evaluated code
17
+ -m --module evaluate the file and -e as ES modules (.mjs, .mts, .jsx
18
+ and .tsx files always are; .js and .ts files are when they
19
+ start with import or export)
20
+ --script evaluate the file as a script
15
21
  --strict evaluate in strict mode
22
+ --strip-types run -e and the REPL as TypeScript (type syntax is stripped;
23
+ .ts, .mts, .cts and .tsx files always are)
24
+ --jsx compile JSX in -e and the REPL (.jsx and .tsx files always
25
+ are)
16
26
  -q --quit just instantiate the interpreter and quit`);
17
27
  process.exit(1);
18
28
  }
19
- function eval_buf(ctx, buf, filename, eval_flags, dump) {
20
- if (dump) {
21
- const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);
22
- if (JS_IsException(fn)) {
23
- js_std_dump_error(ctx);
24
- return -1;
25
- }
26
- process.stdout.write(dump_byte_code(ctx, JS_GetFunctionData(fn).function_bytecode));
29
+ function dump_buf(ctx, buf, filename, eval_flags) {
30
+ const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);
31
+ if (JS_IsException(fn)) {
32
+ js_std_dump_error(ctx);
33
+ return -1;
27
34
  }
35
+ const b = fn instanceof JSModuleDef ? fn.func_bytecode : JS_GetFunctionData(fn).function_bytecode;
36
+ process.stdout.write(dump_byte_code(ctx, b));
37
+ return 0;
38
+ }
39
+ function eval_buf(ctx, buf, filename, eval_flags, dump) {
40
+ if (dump && dump_buf(ctx, buf, filename, eval_flags))
41
+ return -1;
28
42
  const val = JS_Eval(ctx, buf, filename, eval_flags);
29
43
  if (JS_IsException(val)) {
30
44
  js_std_dump_error(ctx);
@@ -32,7 +46,26 @@ function eval_buf(ctx, buf, filename, eval_flags, dump) {
32
46
  }
33
47
  return 0;
34
48
  }
35
- async function repl(ctx) {
49
+ /* module evaluations whose promise is checked once the event loop is idle */
50
+ const module_promises = [];
51
+ /* report a module that failed to load, link or evaluate: 0, or -1 */
52
+ function check_module(ctx, p) {
53
+ if (JS_PromiseState(ctx, p) !== 2 /* JSPromiseState.REJECTED */)
54
+ return 0;
55
+ process.stderr.write(formatException(ctx, JS_PromiseResult(ctx, p)) + '\n');
56
+ return -1;
57
+ }
58
+ /* is `filename` (with source `buf`) a module? */
59
+ function is_module_file(filename, buf, force) {
60
+ if (force !== null)
61
+ return force === 'module';
62
+ if (/\.m[jt]s$/.test(filename) || /\.[jt]sx$/.test(filename))
63
+ return true;
64
+ if (/\.c[jt]s$/.test(filename))
65
+ return false;
66
+ return JS_DetectModule(buf);
67
+ }
68
+ async function repl(ctx, eval_flags) {
36
69
  const readline = await import('readline');
37
70
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'qjs > ' });
38
71
  rl.prompt();
@@ -41,7 +74,7 @@ async function repl(ctx) {
41
74
  rl.prompt();
42
75
  continue;
43
76
  }
44
- const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL);
77
+ const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL | eval_flags);
45
78
  if (JS_IsException(val)) {
46
79
  js_std_dump_error(ctx);
47
80
  }
@@ -60,7 +93,8 @@ async function main() {
60
93
  const argv = process.argv.slice(2);
61
94
  let optind = 0;
62
95
  const expr = [];
63
- let interactive = false, dump = false, strict = false, quit = false;
96
+ let interactive = false, dump = false, strict = false, quit = false, strip_types = false, jsx = false;
97
+ let force = null;
64
98
  while (optind < argv.length && argv[optind].startsWith('-')) {
65
99
  const arg = argv[optind++];
66
100
  if (arg === '-h' || arg === '--help')
@@ -76,6 +110,14 @@ async function main() {
76
110
  dump = true;
77
111
  else if (arg === '--strict')
78
112
  strict = true;
113
+ else if (arg === '-m' || arg === '--module')
114
+ force = 'module';
115
+ else if (arg === '--script')
116
+ force = 'script';
117
+ else if (arg === '--strip-types')
118
+ strip_types = true;
119
+ else if (arg === '--jsx')
120
+ jsx = true;
79
121
  else if (arg === '-q' || arg === '--quit')
80
122
  quit = true;
81
123
  else if (arg === '--')
@@ -89,13 +131,24 @@ async function main() {
89
131
  JS_SetMaxStackSize(rt, 1000);
90
132
  const ctx = JS_NewContext(rt);
91
133
  js_std_add_helpers(ctx, argv.slice(optind));
134
+ JS_SetModuleLoader(rt, js_std_module_loader());
92
135
  if (quit)
93
136
  return 0;
94
- const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0);
137
+ const lang_flags = (strip_types ? JS_EVAL_FLAG_STRIP_TYPES : 0) | (jsx ? JS_EVAL_FLAG_JSX : 0);
138
+ const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0) | lang_flags;
95
139
  let status = 0;
96
140
  for (const e of expr) {
97
- if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump))
141
+ if (force === 'module') {
142
+ const name = path_resolve('<cmdline>');
143
+ if (dump && dump_buf(ctx, e, name, (eval_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) {
144
+ status = 1;
145
+ continue;
146
+ }
147
+ module_promises.push(JS_EvalModule(ctx, e, name, eval_flags));
148
+ }
149
+ else if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) {
98
150
  status = 1;
151
+ }
99
152
  }
100
153
  if (optind < argv.length) {
101
154
  const filename = argv[optind];
@@ -107,15 +160,31 @@ async function main() {
107
160
  console.error(`qjs: cannot load '${filename}': ${e.message}`);
108
161
  return 1;
109
162
  }
110
- if (eval_buf(ctx, buf, filename, eval_flags, dump))
163
+ /* TypeScript files: erasable type syntax is stripped (Node's strip-only mode); JSX and TSX
164
+ files: JSX is compiled. Modules get the same flags from the loader */
165
+ const file_flags = eval_flags | js_module_type_flags(js_module_type_of(filename));
166
+ if (is_module_file(filename, buf, force)) {
167
+ /* through the loader, so that the module's id is its absolute path and import.meta.url
168
+ its file: URL */
169
+ const id = path_resolve(filename);
170
+ if (dump && dump_buf(ctx, buf, id, (file_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE))
171
+ status = 1;
172
+ else
173
+ module_promises.push(JS_ImportModule(ctx, id));
174
+ }
175
+ else if (eval_buf(ctx, buf, filename, file_flags, dump)) {
111
176
  status = 1;
177
+ }
112
178
  }
113
179
  else if (expr.length === 0) {
114
180
  interactive = true;
115
181
  }
116
182
  await js_std_loop(ctx);
183
+ for (const p of module_promises)
184
+ if (check_module(ctx, p))
185
+ status = 1;
117
186
  if (interactive)
118
- await repl(ctx);
187
+ await repl(ctx, lang_flags);
119
188
  return status;
120
189
  }
121
190
  main().then(code => process.exit(code), e => { console.error(e); process.exit(2); });
package/dist/qjs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"qjs.js","sourceRoot":"","sources":["../src/qjs.ts"],"names":[],"mappings":";AACA;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,EACtG,yBAAyB,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAClE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,SAAS,IAAI;IACX,OAAO,CAAC,GAAG,CAAC;;;;;;6DAM+C,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAc,EAAE,GAAW,EAAE,QAAgB,EAAE,UAAkB,EAAE,IAAa;IAChG,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,GAAG,yBAAyB,CAAC,CAAC;QAC/E,IAAI,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO,CAAC,CAAC,CAAC;QAAC,CAAC;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,EAAE,CAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAc;IAChC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxG,EAAE,CAAC,MAAM,EAAE,CAAC;IACZ,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QAC9D,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAChC,IAAI,cAAc,CAAC,CAAC,CAAC;gBAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;;gBACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvB,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC;IACpE,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,EAAE,CAAC;aACxC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAAC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM;gBAAE,IAAI,EAAE,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;aACvG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,eAAe;YAAE,WAAW,GAAG,IAAI,CAAC;aAChE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,GAAG,KAAK,UAAU;YAAE,MAAM,GAAG,IAAI,CAAC;aACtC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC;aAClD,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;aACxB,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,GAAG,CAAC,CAAC;YAAC,IAAI,EAAE,CAAC;QAAC,CAAC;IACjE,CAAC;IACD,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IAC9B,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IACnB,MAAM,UAAU,GAAG,mBAAmB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,qBAAqB,QAAQ,MAAO,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,WAAW;QAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\n/*\n * qjs: command line interpreter (port of qjs.c)\n */\nimport { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_FLAG_STRICT,\n JS_EVAL_FLAG_COMPILE_ONLY, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException,\n JS_GetException, JSContext } from './jseption.ts';\nimport { js_std_add_helpers, js_std_loop, js_std_dump_error } from './std.ts';\nimport { dump_byte_code } from './dump.ts';\nimport { readFileSync } from 'node:fs';\n\nfunction help(): never {\n console.log(`usage: qjs [options] [file [args]]\n-h --help list options\n-e --eval EXPR evaluate EXPR\n-i --interactive go to interactive mode\n-d --dump dump the bytecode of the evaluated code\n --strict evaluate in strict mode\n-q --quit just instantiate the interpreter and quit`);\n process.exit(1);\n}\n\nfunction eval_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number, dump: boolean): number {\n if (dump) {\n const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);\n if (JS_IsException(fn)) { js_std_dump_error(ctx); return -1; }\n process.stdout.write(dump_byte_code(ctx, JS_GetFunctionData(fn)!.function_bytecode));\n }\n const val = JS_Eval(ctx, buf, filename, eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n return -1;\n }\n return 0;\n}\n\nasync function repl(ctx: JSContext): Promise<void> {\n const readline = await import('readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'qjs > ' });\n rl.prompt();\n for await (const line of rl) {\n if (line.trim() === '') { rl.prompt(); continue; }\n const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n } else if (!JS_IsUndefined(val)) {\n const s = JS_ToString(ctx, val);\n if (JS_IsException(s)) js_std_dump_error(ctx);\n else console.log(s);\n }\n await js_std_loop(ctx);\n rl.prompt();\n }\n}\n\nasync function main(): Promise<number> {\n const argv = process.argv.slice(2);\n let optind = 0;\n const expr: string[] = [];\n let interactive = false, dump = false, strict = false, quit = false;\n while (optind < argv.length && argv[optind].startsWith('-')) {\n const arg = argv[optind++];\n if (arg === '-h' || arg === '--help') help();\n else if (arg === '-e' || arg === '--eval') { if (optind >= argv.length) help(); expr.push(argv[optind++]); }\n else if (arg === '-i' || arg === '--interactive') interactive = true;\n else if (arg === '-d' || arg === '--dump') dump = true;\n else if (arg === '--strict') strict = true;\n else if (arg === '-q' || arg === '--quit') quit = true;\n else if (arg === '--') break;\n else { console.error(`qjs: unknown option '${arg}'`); help(); }\n }\n const rt = JS_NewRuntime();\n JS_SetMaxStackSize(rt, 1000);\n const ctx = JS_NewContext(rt);\n js_std_add_helpers(ctx, argv.slice(optind));\n if (quit) return 0;\n const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0);\n let status = 0;\n for (const e of expr) {\n if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) status = 1;\n }\n if (optind < argv.length) {\n const filename = argv[optind];\n let buf: string;\n try {\n buf = readFileSync(filename, 'utf8');\n } catch (e) {\n console.error(`qjs: cannot load '${filename}': ${(e as Error).message}`);\n return 1;\n }\n if (eval_buf(ctx, buf, filename, eval_flags, dump)) status = 1;\n } else if (expr.length === 0) {\n interactive = true;\n }\n await js_std_loop(ctx);\n if (interactive) await repl(ctx);\n return status;\n}\n\nmain().then(code => process.exit(code), e => { console.error(e); process.exit(2); });\n"]}
1
+ {"version":3,"file":"qjs.js","sourceRoot":"","sources":["../src/qjs.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n/*\n * qjs: command line interpreter (port of qjs.c)\n */\nimport { JS_NewRuntime, JS_NewContext, JS_Eval, JS_IsException, JS_EVAL_TYPE_GLOBAL, JS_EVAL_TYPE_MODULE, JS_EVAL_FLAG_STRICT,\n JS_EVAL_FLAG_COMPILE_ONLY, JS_EVAL_FLAG_STRIP_TYPES, JS_EVAL_FLAG_JSX, JS_IsUndefined, JS_ToString, JS_GetFunctionData, JS_SetMaxStackSize, formatException,\n JS_GetException, JSContext, JSValue, JSModuleDef, JS_SetModuleLoader, JS_ImportModule, JS_EvalModule, JS_DetectModule,\n JS_PromiseState, JS_PromiseResult, JSPromiseState } from './jseption.ts';\nimport { js_std_add_helpers, js_std_loop, js_std_dump_error, js_std_module_loader } from './std.ts';\nimport { dump_byte_code } from './dump.ts';\nimport { js_module_type_of, js_module_type_flags } from './module.ts';\nimport { readFileSync } from 'node:fs';\nimport { resolve as path_resolve } from 'node:path';\n\nfunction help(): never {\n console.log(`usage: qjs [options] [file [args]]\n-h --help list options\n-e --eval EXPR evaluate EXPR\n-i --interactive go to interactive mode\n-d --dump dump the bytecode of the evaluated code\n-m --module evaluate the file and -e as ES modules (.mjs, .mts, .jsx\n and .tsx files always are; .js and .ts files are when they\n start with import or export)\n --script evaluate the file as a script\n --strict evaluate in strict mode\n --strip-types run -e and the REPL as TypeScript (type syntax is stripped;\n .ts, .mts, .cts and .tsx files always are)\n --jsx compile JSX in -e and the REPL (.jsx and .tsx files always\n are)\n-q --quit just instantiate the interpreter and quit`);\n process.exit(1);\n}\n\nfunction dump_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number): number {\n const fn = JS_Eval(ctx, buf, filename, eval_flags | JS_EVAL_FLAG_COMPILE_ONLY);\n if (JS_IsException(fn)) { js_std_dump_error(ctx); return -1; }\n const b = fn instanceof JSModuleDef ? fn.func_bytecode! : JS_GetFunctionData(fn)!.function_bytecode;\n process.stdout.write(dump_byte_code(ctx, b));\n return 0;\n}\n\nfunction eval_buf(ctx: JSContext, buf: string, filename: string, eval_flags: number, dump: boolean): number {\n if (dump && dump_buf(ctx, buf, filename, eval_flags)) return -1;\n const val = JS_Eval(ctx, buf, filename, eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n return -1;\n }\n return 0;\n}\n\n/* module evaluations whose promise is checked once the event loop is idle */\nconst module_promises: JSValue[] = [];\n\n/* report a module that failed to load, link or evaluate: 0, or -1 */\nfunction check_module(ctx: JSContext, p: JSValue): number {\n if (JS_PromiseState(ctx, p) !== JSPromiseState.REJECTED) return 0;\n process.stderr.write(formatException(ctx, JS_PromiseResult(ctx, p)) + '\\n');\n return -1;\n}\n\n/* is `filename` (with source `buf`) a module? */\nfunction is_module_file(filename: string, buf: string, force: 'module' | 'script' | null): boolean {\n if (force !== null) return force === 'module';\n if (/\\.m[jt]s$/.test(filename) || /\\.[jt]sx$/.test(filename)) return true;\n if (/\\.c[jt]s$/.test(filename)) return false;\n return JS_DetectModule(buf);\n}\n\nasync function repl(ctx: JSContext, eval_flags: number): Promise<void> {\n const readline = await import('readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: 'qjs > ' });\n rl.prompt();\n for await (const line of rl) {\n if (line.trim() === '') { rl.prompt(); continue; }\n const val = JS_Eval(ctx, line, '<repl>', JS_EVAL_TYPE_GLOBAL | eval_flags);\n if (JS_IsException(val)) {\n js_std_dump_error(ctx);\n } else if (!JS_IsUndefined(val)) {\n const s = JS_ToString(ctx, val);\n if (JS_IsException(s)) js_std_dump_error(ctx);\n else console.log(s);\n }\n await js_std_loop(ctx);\n rl.prompt();\n }\n}\n\nasync function main(): Promise<number> {\n const argv = process.argv.slice(2);\n let optind = 0;\n const expr: string[] = [];\n let interactive = false, dump = false, strict = false, quit = false, strip_types = false, jsx = false;\n let force: 'module' | 'script' | null = null;\n while (optind < argv.length && argv[optind].startsWith('-')) {\n const arg = argv[optind++];\n if (arg === '-h' || arg === '--help') help();\n else if (arg === '-e' || arg === '--eval') { if (optind >= argv.length) help(); expr.push(argv[optind++]); }\n else if (arg === '-i' || arg === '--interactive') interactive = true;\n else if (arg === '-d' || arg === '--dump') dump = true;\n else if (arg === '--strict') strict = true;\n else if (arg === '-m' || arg === '--module') force = 'module';\n else if (arg === '--script') force = 'script';\n else if (arg === '--strip-types') strip_types = true;\n else if (arg === '--jsx') jsx = true;\n else if (arg === '-q' || arg === '--quit') quit = true;\n else if (arg === '--') break;\n else { console.error(`qjs: unknown option '${arg}'`); help(); }\n }\n const rt = JS_NewRuntime();\n JS_SetMaxStackSize(rt, 1000);\n const ctx = JS_NewContext(rt);\n js_std_add_helpers(ctx, argv.slice(optind));\n JS_SetModuleLoader(rt, js_std_module_loader());\n if (quit) return 0;\n const lang_flags = (strip_types ? JS_EVAL_FLAG_STRIP_TYPES : 0) | (jsx ? JS_EVAL_FLAG_JSX : 0);\n const eval_flags = JS_EVAL_TYPE_GLOBAL | (strict ? JS_EVAL_FLAG_STRICT : 0) | lang_flags;\n let status = 0;\n for (const e of expr) {\n if (force === 'module') {\n const name = path_resolve('<cmdline>');\n if (dump && dump_buf(ctx, e, name, (eval_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) { status = 1; continue; }\n module_promises.push(JS_EvalModule(ctx, e, name, eval_flags));\n } else if (eval_buf(ctx, e, '<cmdline>', eval_flags, dump)) {\n status = 1;\n }\n }\n if (optind < argv.length) {\n const filename = argv[optind];\n let buf: string;\n try {\n buf = readFileSync(filename, 'utf8');\n } catch (e) {\n console.error(`qjs: cannot load '${filename}': ${(e as Error).message}`);\n return 1;\n }\n /* TypeScript files: erasable type syntax is stripped (Node's strip-only mode); JSX and TSX\n files: JSX is compiled. Modules get the same flags from the loader */\n const file_flags = eval_flags | js_module_type_flags(js_module_type_of(filename));\n if (is_module_file(filename, buf, force)) {\n /* through the loader, so that the module's id is its absolute path and import.meta.url\n its file: URL */\n const id = path_resolve(filename);\n if (dump && dump_buf(ctx, buf, id, (file_flags & ~JS_EVAL_TYPE_GLOBAL) | JS_EVAL_TYPE_MODULE)) status = 1;\n else module_promises.push(JS_ImportModule(ctx, id));\n } else if (eval_buf(ctx, buf, filename, file_flags, dump)) {\n status = 1;\n }\n } else if (expr.length === 0) {\n interactive = true;\n }\n await js_std_loop(ctx);\n for (const p of module_promises) if (check_module(ctx, p)) status = 1;\n if (interactive) await repl(ctx, lang_flags);\n return status;\n}\n\nmain().then(code => process.exit(code), e => { console.error(e); process.exit(2); });\n"]}
package/dist/quickjs.d.ts CHANGED
@@ -32,6 +32,8 @@ export declare function js_ensure_meta(obj: object, class_id?: JSClassID): JSObj
32
32
  export declare function JS_GetFunctionData(func: JSValue): JSFunctionData | null;
33
33
  export declare class JSRuntime {
34
34
  atoms: AtomTable;
35
+ module_loader: any;
36
+ module_async_evaluation_next_timestamp: number;
35
37
  class_array: (JSClass | null)[];
36
38
  class_count: number;
37
39
  current_exception: JSValue;
@@ -55,6 +57,8 @@ export declare class JSRuntime {
55
57
  }
56
58
  export declare class JSContext {
57
59
  rt: JSRuntime;
60
+ module_map: Map<string, any>;
61
+ module_inflight: Map<string, any>;
58
62
  class_proto: (JSObject | null)[];
59
63
  function_proto: JSObject | null;
60
64
  function_ctor: JSObject | null;
@@ -91,6 +95,10 @@ export interface JSHooks {
91
95
  js_regexp_constructor_internal: ((ctx: JSContext, ctor: JSValue, pattern: string, flags: string) => JSValue) | null;
92
96
  js_borrow_native: (ctx: JSContext, host: Function, name: string, length: number, fix: JSNativeFixer | null) => JSValue;
93
97
  init_runtime: ((rt: JSRuntime) => void)[];
98
+ js_module_compiled: ((ctx: JSContext, m: any, b: JSFunctionBytecode, flags: number) => JSValue) | null;
99
+ js_dynamic_import: ((ctx: JSContext, b: JSFunctionBytecode | null, specifier: JSValue, options: JSValue) => JSValue) | null;
100
+ js_import_meta: ((ctx: JSContext, b: JSFunctionBytecode | null) => JSValue) | null;
101
+ js_module_eval_function: ((ctx: JSContext, m: any) => JSValue) | null;
94
102
  }
95
103
  export declare const hooks: JSHooks;
96
104
  export declare function JS_NewClass1(rt: JSRuntime, class_id: JSClassID, def: JSClassDef): void;
package/dist/quickjs.js CHANGED
@@ -16,7 +16,7 @@
16
16
  */
17
17
  import { jit_hooks } from "./jit_hook.js";
18
18
  import { AtomTable, JS_ATOM_NULL, JS_ATOM_TYPE_STRING, JS_ATOM_TYPE_SYMBOL, __JS_AtomIsTaggedInt, __JS_AtomFromUInt32, __JS_AtomToUInt32, JS_ATOM_MAX_INT, JS_ATOM_length, JS_ATOM_prototype, JS_ATOM_constructor, JS_ATOM_message, JS_ATOM_stack, JS_ATOM_toString, JS_ATOM_valueOf, JS_ATOM_Symbol_toPrimitive, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_hasInstance, JS_ATOM_done, JS_ATOM_value, JS_ATOM_return, JS_ATOM_get, JS_ATOM_set, JS_ATOM_configurable, JS_ATOM_writable, JS_ATOM_enumerable, JS_ATOM_undefined, JS_ATOM_object, JS_ATOM_boolean, JS_ATOM_number, JS_ATOM_string, JS_ATOM_symbol, JS_ATOM_bigint, JS_ATOM_function, JS_ATOM_lineNumber, JS_ATOM_fileName, JS_ATOM_columnNumber, JS_ATOM_Error, JS_ATOM___proto__, JS_ATOM_Symbol_asyncIterator, JS_ATOM_null, JS_ATOM_false, JS_ATOM_true, JS_ATOM_Object, JS_ATOM_Function, JS_ATOM_Array, JS_ATOM_Number, JS_ATOM_String, JS_ATOM_Boolean, JS_ATOM_Symbol, JS_ATOM_Arguments, JS_ATOM_BigInt, JS_ATOM_Date, JS_ATOM_RegExp, JS_ATOM_Map, JS_ATOM_Set, JS_ATOM_WeakMap, JS_ATOM_WeakSet, JS_ATOM_Generator, JS_ATOM_Proxy, JS_ATOM_Promise, JS_ATOM_AsyncFunction, JS_ATOM_AsyncGenerator, JS_ATOM_GeneratorFunction, JS_ATOM_AsyncGeneratorFunction, JS_ATOM_ForInIterator, JS_ATOM_Map_Iterator, JS_ATOM_Set_Iterator, JS_ATOM_Array_Iterator, JS_ATOM_String_Iterator, JS_ATOM_RegExp_String_Iterator, JS_ATOM_PromiseResolveFunction, JS_ATOM_PromiseRejectFunction, JS_ATOM_AsyncFunctionResolve, JS_ATOM_AsyncFunctionReject, JS_ATOM_ArrayBuffer, JS_ATOM_SharedArrayBuffer, JS_ATOM_Uint8ClampedArray, JS_ATOM_Int8Array, JS_ATOM_Uint8Array, JS_ATOM_Int16Array, JS_ATOM_Uint16Array, JS_ATOM_Int32Array, JS_ATOM_Uint32Array, JS_ATOM_BigInt64Array, JS_ATOM_BigUint64Array, JS_ATOM_Float32Array, JS_ATOM_Float64Array, JS_ATOM_DataView, JS_ATOM_WeakRef, JS_ATOM_FinalizationRegistry, JS_ATOM_Module, } from "./atoms.js";
19
- import { JSSpecial, JS_EXCEPTION, JS_UNINITIALIZED, JS_MODE_BACKTRACE_BARRIER, JS_PROP_CONFIGURABLE, JS_PROP_WRITABLE, JS_PROP_ENUMERABLE, JS_PROP_C_W_E, JS_PROP_TMASK, JS_PROP_GETSET, JS_PROP_HAS_CONFIGURABLE, JS_PROP_HAS_WRITABLE, JS_PROP_HAS_ENUMERABLE, JS_PROP_HAS_GET, JS_PROP_HAS_SET, JS_PROP_HAS_VALUE, JS_PROP_THROW, JS_PROP_THROW_STRICT, JS_PROP_NO_ADD, JS_GPN_STRING_MASK, JS_GPN_SYMBOL_MASK, JS_GPN_ENUM_ONLY, JS_GPN_SET_ENUM, JS_IsException, JS_IsObject, JS_IsUndefined, JSCFunctionRecord, JSCFunctionDataRecord, JSStackFrame, JS_CALL_FLAG_CONSTRUCTOR, JS_CALL_FLAG_COPY_ARGV, JSForInState, JSObjectMeta, JS_MODE_STRICT, } from "./values.js";
19
+ import { JSSpecial, JS_EXCEPTION, JS_UNINITIALIZED, JS_MODE_BACKTRACE_BARRIER, JS_PROP_CONFIGURABLE, JS_PROP_WRITABLE, JS_PROP_ENUMERABLE, JS_PROP_C_W_E, JS_PROP_TMASK, JS_PROP_GETSET, JS_PROP_HAS_CONFIGURABLE, JS_PROP_HAS_WRITABLE, JS_PROP_HAS_ENUMERABLE, JS_PROP_HAS_GET, JS_PROP_HAS_SET, JS_PROP_HAS_VALUE, JS_PROP_THROW, JS_PROP_THROW_STRICT, JS_PROP_NO_ADD, JS_GPN_STRING_MASK, JS_GPN_SYMBOL_MASK, JS_GPN_ENUM_ONLY, JS_GPN_SET_ENUM, JS_IsException, JS_IsObject, JS_IsUndefined, JSCFunctionRecord, JSCFunctionDataRecord, JSStackFrame, JS_CALL_FLAG_CONSTRUCTOR, JS_CALL_FLAG_COPY_ARGV, JSForInState, JSObjectMeta, JS_MODE_STRICT, JSModuleDef, } from "./values.js";
20
20
  export * from "./values.js";
21
21
  export * from "./atoms.js";
22
22
  export class JSClass {
@@ -59,6 +59,9 @@ export function JS_GetFunctionData(func) {
59
59
  }
60
60
  export class JSRuntime {
61
61
  atoms = new AtomTable();
62
+ /* modules (src/module.ts): the embedder's loader, and the order of asynchronous evaluations */
63
+ module_loader = null;
64
+ module_async_evaluation_next_timestamp = 0;
62
65
  class_array = [];
63
66
  class_count = 0;
64
67
  current_exception = undefined;
@@ -83,6 +86,9 @@ export class JSRuntime {
83
86
  }
84
87
  export class JSContext {
85
88
  rt;
89
+ /* modules loaded in this context, by normalized id (and type), and those being fetched */
90
+ module_map = new Map();
91
+ module_inflight = new Map();
86
92
  class_proto = [];
87
93
  function_proto = null;
88
94
  function_ctor = null;
@@ -129,6 +135,10 @@ export const hooks = {
129
135
  js_regexp_constructor_internal: null,
130
136
  js_borrow_native: () => { throw new Error('native builtins not loaded'); },
131
137
  init_runtime: [],
138
+ js_module_compiled: null,
139
+ js_dynamic_import: null,
140
+ js_import_meta: null,
141
+ js_module_eval_function: null,
132
142
  };
133
143
  export function JS_NewClass1(rt, class_id, def) {
134
144
  while (rt.class_array.length <= class_id)
@@ -1719,10 +1729,15 @@ function js_set_failed(ctx, obj, key, prop, flags) {
1719
1729
  return 0;
1720
1730
  }
1721
1731
  /* SetProperty: -1 exception, 0 failed silently, 1 ok. 'this_obj' is the receiver. */
1732
+ /* host Proxies: guest proxies and module namespace objects. A refused store must be told
1733
+ apart from a throwing trap, which only Reflect.set can do */
1734
+ function js_is_proxy_class(class_id) {
1735
+ return class_id === 44 /* JSClassID.PROXY */ || class_id === 11 /* JSClassID.MODULE_NS */;
1736
+ }
1722
1737
  export function JS_SetPropertyInternal(ctx, obj, prop, val, this_obj, flags) {
1723
1738
  const key = JS_AtomToKey(ctx, prop);
1724
1739
  if (JS_IsObject(obj)) {
1725
- if (this_obj === obj && js_meta.get(obj)?.class_id !== 44 /* JSClassID.PROXY */) {
1740
+ if (this_obj === obj && !js_is_proxy_class(js_meta.get(obj)?.class_id)) {
1726
1741
  /* plain assignment (proxies use Reflect.set below, which tells a refused
1727
1742
  trap from an invariant violation): Reflect.set is ~50x slower than an inline-cached
1728
1743
  store in JSC (and ~600 ns when appending to an array). A strict
@@ -3316,6 +3331,10 @@ export function JS_Eval(ctx, input, filename, eval_flags) {
3316
3331
  }
3317
3332
  /* run the function object produced by JS_EVAL_FLAG_COMPILE_ONLY */
3318
3333
  export function JS_EvalFunction(ctx, fun_obj) {
3334
+ /* a compiled module (JS_TAG_MODULE in C): load its graph, link and evaluate it */
3335
+ if (hooks.js_module_eval_function !== null && fun_obj instanceof JSModuleDef) {
3336
+ return hooks.js_module_eval_function(ctx, fun_obj);
3337
+ }
3319
3338
  return JS_Call(ctx, fun_obj, ctx.global_obj, []);
3320
3339
  }
3321
3340
  export function JS_RunGC(_rt) { }