MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add import.meta.(value)

+144 -3
+3 -1
include/ant.h
··· 73 73 jsval_t js_mkpromise(struct js *js); 74 74 void js_resolve_promise(struct js *js, jsval_t promise, jsval_t value); 75 75 void js_reject_promise(struct js *js, jsval_t promise, jsval_t value); 76 - void js_run_event_loop(struct js *js); 76 + 77 + void js_run_event_loop(struct js *js); 78 + void js_setup_import_meta(struct js *js, const char *filename);
+1 -1
meson.build
··· 42 42 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 43 43 44 44 version_conf = configuration_data() 45 - version_conf.set('ANT_VERSION', '0.0.6.10') 45 + version_conf.set('ANT_VERSION', '0.0.6.11') 46 46 version_conf.set('ANT_GIT_HASH', git_hash) 47 47 version_conf.set('ANT_BUILD_DATE', build_date) 48 48
+81 -1
src/ant.c
··· 241 241 static jsval_t js_import_stmt(struct js *js); 242 242 static jsval_t js_export_stmt(struct js *js); 243 243 static jsval_t builtin_import(struct js *js, jsval_t *args, int nargs); 244 + static jsval_t builtin_import_meta_resolve(struct js *js, jsval_t *args, int nargs); 244 245 static jsval_t builtin_string_indexOf(struct js *js, jsval_t *args, int nargs); 245 246 static jsval_t builtin_string_substring(struct js *js, jsval_t *args, int nargs); 246 247 static jsval_t builtin_string_split(struct js *js, jsval_t *args, int nargs); ··· 6956 6957 return builtin_Promise_resolve(js, promise_args, 1); 6957 6958 } 6958 6959 6960 + static jsval_t builtin_import_meta_resolve(struct js *js, jsval_t *args, int nargs) { 6961 + if (nargs < 1 || vtype(args[0]) != T_STR) { 6962 + return js_mkerr(js, "import.meta.resolve() requires a string specifier"); 6963 + } 6964 + 6965 + jsoff_t spec_len; 6966 + jsoff_t spec_off = vstr(js, args[0], &spec_len); 6967 + const char *specifier = (char *)&js->mem[spec_off]; 6968 + 6969 + const char *base_path = js->filename ? js->filename : "."; 6970 + char *resolved_path = esm_resolve_path(specifier, base_path); 6971 + if (!resolved_path) { 6972 + return js_mkerr(js, "Cannot resolve module: %.*s", (int)spec_len, specifier); 6973 + } 6974 + 6975 + size_t url_len = strlen(resolved_path) + 8; 6976 + char *url = malloc(url_len); 6977 + if (!url) { 6978 + free(resolved_path); 6979 + return js_mkerr(js, "oom"); 6980 + } 6981 + 6982 + snprintf(url, url_len, "file://%s", resolved_path); 6983 + free(resolved_path); 6984 + 6985 + jsval_t result = js_mkstr(js, url, strlen(url)); 6986 + free(url); 6987 + 6988 + return result; 6989 + } 6990 + 6991 + void js_setup_import_meta(struct js *js, const char *filename) { 6992 + if (!filename) return; 6993 + 6994 + jsval_t import_meta = mkobj(js, 0); 6995 + if (is_err(import_meta)) return; 6996 + 6997 + size_t url_len = strlen(filename) + 8; 6998 + char *url = malloc(url_len); 6999 + if (url) { 7000 + snprintf(url, url_len, "file://%s", filename); 7001 + jsval_t url_val = js_mkstr(js, url, strlen(url)); 7002 + if (!is_err(url_val)) setprop(js, import_meta, js_mkstr(js, "url", 3), url_val); 7003 + free(url); 7004 + } 7005 + 7006 + jsval_t filename_val = js_mkstr(js, filename, strlen(filename)); 7007 + if (!is_err(filename_val)) setprop(js, import_meta, js_mkstr(js, "filename", 8), filename_val); 7008 + 7009 + char *filename_copy = strdup(filename); 7010 + if (filename_copy) { 7011 + char *dir = dirname(filename_copy); 7012 + if (dir) { 7013 + jsval_t dirname_val = js_mkstr(js, dir, strlen(dir)); 7014 + if (!is_err(dirname_val)) setprop(js, import_meta, js_mkstr(js, "dirname", 7), dirname_val); 7015 + } 7016 + free(filename_copy); 7017 + } 7018 + 7019 + setprop(js, import_meta, js_mkstr(js, "main", 4), js_mktrue()); 7020 + jsval_t resolve_fn = js_mkfun(builtin_import_meta_resolve); 7021 + setprop(js, import_meta, js_mkstr(js, "resolve", 7), resolve_fn); 7022 + 7023 + jsval_t glob = js_glob(js); 7024 + jsoff_t import_off = lkp(js, glob, "import", 6); 7025 + 7026 + if (import_off != 0) { 7027 + jsval_t import_fn = resolveprop(js, mkval(T_PROP, import_off)); 7028 + if (vtype(import_fn) == T_FUNC) { 7029 + jsval_t import_obj = mkval(T_OBJ, vdata(import_fn)); 7030 + setprop(js, import_obj, js_mkstr(js, "meta", 4), import_meta); 7031 + } 7032 + } 7033 + } 7034 + 6959 7035 static jsval_t js_import_stmt(struct js *js) { 6960 7036 js->consumed = 1; 6961 7037 ··· 7337 7413 setprop(js, p_ctor_obj, js_mkstr(js, "prototype", 9), p_proto); 7338 7414 7339 7415 setprop(js, glob, js_mkstr(js, "Promise", 7), mkval(T_FUNC, vdata(p_ctor_obj))); 7340 - setprop(js, glob, js_mkstr(js, "import", 6), js_mkfun(builtin_import)); 7416 + 7417 + jsval_t import_obj = mkobj(js, 0); 7418 + setprop(js, import_obj, js_mkstr(js, "__native_func", 13), js_mkfun(builtin_import)); 7419 + setprop(js, glob, js_mkstr(js, "import", 6), mkval(T_FUNC, vdata(import_obj))); 7420 + 7341 7421 setprop(js, glob, js_mkstr(js, "__esm_module_scope", 18), js_mkundef()); 7342 7422 7343 7423 js->owns_mem = false;
+2
src/main.c
··· 45 45 size_t len = fread(buffer, 1, file_size, fp); 46 46 fclose(fp); 47 47 buffer[len] = '\0'; 48 + 48 49 js_set_filename(js, filename); 50 + js_setup_import_meta(js, filename); 49 51 50 52 jsval_t result = js_eval(js, buffer, len); 51 53 free(buffer);
+31
tests/test_import_meta.cjs
··· 1 + // Test: import.meta support 2 + // Tests import.meta.url, import.meta.dirname, and import.meta.resolve() 3 + 4 + console.log("=== Testing import.meta ===\n"); 5 + 6 + // Test 1: import.meta.url 7 + console.log("Test 1: import.meta.url"); 8 + console.log("import.meta.url:", import.meta.url); 9 + console.log("Type:", typeof import.meta.url); 10 + console.log("Starts with 'file://':", import.meta.url.startsWith("file://")); 11 + console.log("โœ“ import.meta.url is accessible\n"); 12 + 13 + // Test 2: import.meta.dirname 14 + console.log("Test 2: import.meta.dirname"); 15 + console.log("import.meta.dirname:", import.meta.dirname); 16 + console.log("Type:", typeof import.meta.dirname); 17 + console.log("โœ“ import.meta.dirname is accessible\n"); 18 + 19 + // Test 3: import.meta.resolve() 20 + console.log("Test 3: import.meta.resolve()"); 21 + try { 22 + const resolved = import.meta.resolve("./example.js"); 23 + console.log("Resolved './example.js':", resolved); 24 + console.log("Type:", typeof resolved); 25 + console.log("Starts with 'file://':", resolved.startsWith("file://")); 26 + console.log("โœ“ import.meta.resolve() works\n"); 27 + } catch (e) { 28 + console.log("โœ— import.meta.resolve() failed:", e, "\n"); 29 + } 30 + 31 + console.log("=== All import.meta tests complete ===");
+26
tests/test_import_meta_full.cjs
··· 1 + // Comprehensive import.meta test 2 + 3 + console.log("=== Testing all import.meta properties ===\n"); 4 + 5 + console.log("1. import.meta.url:", import.meta.url); 6 + console.log("2. import.meta.filename:", import.meta.filename); 7 + console.log("3. import.meta.dirname:", import.meta.dirname); 8 + console.log("4. import.meta.main:", import.meta.main); 9 + console.log("5. typeof import.meta.resolve:", typeof import.meta.resolve); 10 + 11 + console.log("\n=== Testing import.meta.resolve() ==="); 12 + const resolved = import.meta.resolve("./example.js"); 13 + console.log("Resolved './example.js':", resolved); 14 + 15 + console.log("\n=== Testing that import() still works ==="); 16 + async function testImport() { 17 + try { 18 + const mod = await import('./export-test.js'); 19 + console.log("Dynamic import successful!"); 20 + mod.hello('from import.meta test'); 21 + } catch (e) { 22 + console.log("Dynamic import failed:", e); 23 + } 24 + } 25 + 26 + void testImport();