diff --git a/dist/platform/elc b/dist/platform/elc index 0b80847..37a9e73 100755 Binary files a/dist/platform/elc and b/dist/platform/elc differ diff --git a/el-compiler/src/codegen-js.el b/el-compiler/src/codegen-js.el index 1a9b03e..7374fe8 100644 --- a/el-compiler/src/codegen-js.el +++ b/el-compiler/src/codegen-js.el @@ -896,52 +896,75 @@ fn js_is_top_level_decl(stmt: Map) -> Bool { // ── Entry point ─────────────────────────────────────────────────────────────── fn codegen_js(stmts: [Map], source: String) -> String { + codegen_js_inner(stmts, source, false, "") +} + +fn codegen_js_bundle(stmts: [Map], source: String, runtime_content: String) -> String { + codegen_js_inner(stmts, source, true, runtime_content) +} + +fn codegen_js_inner(stmts: [Map], source: String, bundle_mode: Bool, runtime_content: String) -> String { // Reset per-compile state. state_set("__js_int_names", "") state_set("__js_match_counter", "") state_set("__js_async_fns", "") - // Preamble: inline the runtime via a single import that side-effects - // globalThis. The runtime path is resolved relative to the generated - // output; users running `elc --target=js` are responsible for ensuring - // el_runtime.js is reachable. For self-contained output, the runtime - // could be inlined; that is a follow-up. + // Preamble: in bundle mode, inline the runtime and wrap in IIFE. + // In module mode, emit a single import that side-effects globalThis. js_emit_line("// Generated by elc --target=js") - js_emit_line("// Runtime: foundation/el/el-compiler/runtime/el_runtime.js") - js_emit_line("import \"./el_runtime.js\";") - js_emit_line("const {") - js_emit_line(" println, print, el_str_concat, str_concat, str_eq, str_starts_with, str_ends_with,") - js_emit_line(" str_len, int_to_str, str_to_int, str_slice, str_contains, str_replace,") - js_emit_line(" str_to_upper, str_to_lower, str_trim, str_index_of, str_split, str_char_at,") - js_emit_line(" str_char_code, str_lower, str_upper, el_abs, el_max, el_min,") - js_emit_line(" el_list_new, el_list_len, el_list_get, el_list_append, el_list_empty, el_list_clone,") - js_emit_line(" list_push, list_join, list_range,") - js_emit_line(" el_map_new, el_get_field, el_map_get, el_map_set,") - js_emit_line(" http_get, http_post, http_post_json,") - js_emit_line(" fs_read, fs_write, fs_list,") - js_emit_line(" json_parse, json_stringify, json_get, json_get_string, json_get_int,") - js_emit_line(" time_now, time_now_utc, sleep_ms, bool_to_str, exit_program,") - js_emit_line(" el_retain, el_release,") - js_emit_line(" append, len, get, map_get, map_set,") - js_emit_line(" native_list_get, native_list_len, native_list_append, native_list_empty,") - js_emit_line(" native_list_clone, native_string_chars, native_int_to_str,") - js_emit_line(" args, state_set, state_get, state_del, state_keys, env,") - js_emit_line(" dharma_connect, dharma_send, dharma_emit, dharma_field, dharma_activate,") - js_emit_line(" engram_node, engram_search, engram_activate,") - js_emit_line(" llm_call, llm_call_system,") - js_emit_line(" dom_get_element, dom_get_value, dom_set_value, dom_get_text, dom_set_text,") - js_emit_line(" dom_set_prop, dom_get_prop, dom_set_style, dom_add_class, dom_remove_class,") - js_emit_line(" dom_show, dom_hide, dom_listen, dom_query, dom_query_all, dom_create,") - js_emit_line(" dom_append, dom_remove, dom_is_null,") - js_emit_line(" dom_set_attr, dom_get_attr, dom_remove_attr, dom_set_html, dom_get_html,") - js_emit_line(" dom_get_parent, dom_contains_class, dom_get_checked, dom_set_checked,") - js_emit_line(" set_timeout, set_interval, clear_interval,") - js_emit_line(" local_storage_get, local_storage_set, local_storage_remove,") - js_emit_line(" window_location, window_redirect, window_on_load,") - js_emit_line(" console_log,") - js_emit_line(" window_set, window_get, native_js, native_js_call,") - js_emit_line("} = globalThis.__el;") - js_emit_blank() + if bundle_mode { + js_emit_line("// Bundle mode: runtime inlined, no import statement needed.") + js_emit_line("// Drop directly into a