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.

typescript extension fallback

+62 -2
+1
include/utils.h
··· 19 19 20 20 char hex_char(int v); 21 21 char *resolve_js_file(const char *filename); 22 + char *resolve_typescript_source_fallback(const char *filename); 22 23 23 24 int hex_digit(char c); 24 25 int is_typescript_file(const char *filename);
+21 -2
src/esm/loader.c
··· 162 162 return esm_try_resolve_with_exts(dir, idx, false); 163 163 } 164 164 165 + static char *esm_try_resolve_relative_typescript_source_fallback( 166 + const char *dir, 167 + const char *spec, 168 + const char *base_path 169 + ) { 170 + if (!is_typescript_file(base_path)) return NULL; 171 + 172 + char *ts_spec = resolve_typescript_source_fallback(spec); 173 + if (!ts_spec) return NULL; 174 + 175 + char *resolved = esm_try_resolve(dir, ts_spec, ""); 176 + free(ts_spec); 177 + return resolved; 178 + } 179 + 165 180 static ant_value_t esm_default_export_or_namespace(ant_t *js, ant_value_t ns) { 166 181 ant_value_t default_val = js_get_slot(ns, SLOT_DEFAULT); 167 182 return vtype(default_val) != T_UNDEF ? default_val : ns; ··· 631 646 632 647 const char *spec = specifier; 633 648 if (strncmp(specifier, "./", 2) == 0) spec = specifier + 2; 649 + 634 650 bool has_ext = esm_has_extension(spec); 635 - 636 651 if ((result = esm_try_resolve(dir, spec, ""))) goto cleanup; 637 - if (has_ext) goto cleanup; 652 + 653 + if (has_ext) { 654 + result = esm_try_resolve_relative_typescript_source_fallback(dir, spec, base_path); 655 + goto cleanup; 656 + } 638 657 639 658 char *base_ext = esm_get_extension(base_path); 640 659 if (!base_ext) goto cleanup;
+26
src/utils.c
··· 252 252 return NULL; 253 253 } 254 254 255 + char *resolve_typescript_source_fallback(const char *filename) { 256 + if (!filename) return NULL; 257 + 258 + const char *mapped_ext = NULL; 259 + size_t trim_len = 0; 260 + 261 + size_t len = strlen(filename); 262 + if (len > 3 && strcmp(filename + len - 3, ".js") == 0) { 263 + mapped_ext = ".ts"; 264 + trim_len = 3; 265 + } else if (len > 4 && strcmp(filename + len - 4, ".mjs") == 0) { 266 + mapped_ext = ".mts"; 267 + trim_len = 4; 268 + } else if (len > 4 && strcmp(filename + len - 4, ".cjs") == 0) { 269 + mapped_ext = ".cts"; 270 + trim_len = 4; 271 + } else return NULL; 272 + 273 + size_t mapped_len = strlen(mapped_ext); 274 + char *mapped = try_oom(len - trim_len + mapped_len + 1); 275 + memcpy(mapped, filename, len - trim_len); 276 + memcpy(mapped + len - trim_len, mapped_ext, mapped_len + 1); 277 + 278 + return mapped; 279 + } 280 + 255 281 typedef struct { 256 282 const char *repl; size_t repl_len; size_t *ri; 257 283 const char *matched; size_t matched_len;
+10
tests/test_ts_js_extension_resolution.cjs
··· 1 + (async () => { 2 + const mod = await import('./ts_js_extension_resolution_main.ts'); 3 + if (mod.default !== 'ts-source-fallback-ok') { 4 + throw new Error(`expected ts-source-fallback-ok, got ${String(mod.default)}`); 5 + } 6 + console.log('ok'); 7 + })().catch(err => { 8 + console.error(err); 9 + process.exit(1); 10 + });
+1
tests/ts_js_extension_resolution_dep.ts
··· 1 + export const resolvedValue = 'ts-source-fallback-ok';
+3
tests/ts_js_extension_resolution_main.ts
··· 1 + import { resolvedValue } from './ts_js_extension_resolution_dep.js'; 2 + 3 + export default resolvedValue;