#!/usr/bin/env node

/**
 * This tiny wrapper file checks for known node flags and appends them
 * when found, before invoking the "real" _babel-node(1) executable.
 */

var args  = [__dirname + "/_babel-node"];

var babelArgs = process.argv.slice(2);
var userArgs;

// separate node arguments from script arguments
var argSeparator = babelArgs.indexOf("--");
if (argSeparator > -1) {
  userArgs  = babelArgs.slice(argSeparator); // including the  --
  babelArgs = babelArgs.slice(0, argSeparator);
}

babelArgs.forEach(function(arg){
  var flag = arg.split("=")[0];

  switch (flag) {
    case "-d":
      args.unshift("--debug");
      break;

    case "debug":
    case "--debug":
    case "--debug-brk":
      args.unshift(arg);
      break;

    case "-gc":
    case "--expose-gc":
      args.unshift("--expose-gc");
      break;

    case "--use_strict":
    case "--es_staging":
    case "--harmony":
    case "--harmony_shipping":
    case "--harmony_modules":
    case "--harmony_arrays":
    case "--harmony_array_includes":
    case "--harmony_regexps":
    case "--harmony_arrow_functions":
    case "--harmony_proxies":
    case "--harmony_sloppy":
    case "--harmony_unicode":
    case "--harmony_tostring":
    case "--harmony_numeric_literals":
    case "--harmony_strings":
    case "--harmony_scoping":
    case "--harmony_classes":
    case "--harmony_object_literals":
    case "--harmony_templates":
    case "--harmony_rest_parameters":
    case "--harmony_generators":
    case "--compiled_keyed_generic_loads":
    case "--pretenuring_call_new":
    case "--allocation_site_pretenuring":
    case "--trace_pretenuring":
    case "--trace_pretenuring_statistics":
    case "--track_fields":
    case "--track_double_fields":
    case "--track_heap_object_fields":
    case "--track_computed_fields":
    case "--track_field_types":
    case "--smi_binop":
    case "--vector_ics":
    case "--optimize_for_size":
    case "--unbox_double_arrays":
    case "--string_slices":
    case "--crankshaft":
    case "--hydrogen_filter":
    case "--use_gvn":
    case "--gvn_iterations":
    case "--use_canonicalizing":
    case "--use_inlining":
    case "--use_escape_analysis":
    case "--use_allocation_folding":
    case "--use_local_allocation_folding":
    case "--use_write_barrier_elimination":
    case "--max_inlining_levels":
    case "--max_inlined_source_size":
    case "--max_inlined_nodes":
    case "--max_inlined_nodes_cumulative":
    case "--loop_invariant_code_motion":
    case "--fast_math":
    case "--collect_megamorphic_maps_from_stub_cache":
    case "--hydrogen_stats":
    case "--trace_check_elimination":
    case "--trace_hydrogen":
    case "--trace_hydrogen_filter":
    case "--trace_hydrogen_stubs":
    case "--trace_hydrogen_file":
    case "--trace_phase":
    case "--trace_inlining":
    case "--trace_load_elimination":
    case "--trace_store_elimination":
    case "--trace_alloc":
    case "--trace_all_uses":
    case "--trace_range":
    case "--trace_gvn":
    case "--trace_representation":
    case "--trace_removable_simulates":
    case "--trace_escape_analysis":
    case "--trace_allocation_folding":
    case "--trace_track_allocation_sites":
    case "--trace_migration":
    case "--trace_generalization":
    case "--stress_pointer_maps":
    case "--stress_environments":
    case "--deopt_every_n_times":
    case "--deopt_every_n_garbage_collections":
    case "--print_deopt_stress":
    case "--trap_on_deopt":
    case "--trap_on_stub_deopt":
    case "--deoptimize_uncommon_cases":
    case "--polymorphic_inlining":
    case "--use_osr":
    case "--array_bounds_checks_elimination":
    case "--trace_bce":
    case "--array_bounds_checks_hoisting":
    case "--array_index_dehoisting":
    case "--analyze_environment_liveness":
    case "--load_elimination":
    case "--check_elimination":
    case "--store_elimination":
    case "--dead_code_elimination":
    case "--fold_constants":
    case "--trace_dead_code_elimination":
    case "--unreachable_code_elimination":
    case "--trace_osr":
    case "--stress_runs":
    case "--lookup_sample_by_shared":
    case "--cache_optimized_code":
    case "--flush_optimized_code_cache":
    case "--inline_construct":
    case "--inline_arguments":
    case "--inline_accessors":
    case "--escape_analysis_iterations":
    case "--optimize_for_in":
    case "--concurrent_recompilation":
    case "--job_based_recompilation":
    case "--trace_concurrent_recompilation":
    case "--concurrent_recompilation_queue_length":
    case "--concurrent_recompilation_delay":
    case "--block_concurrent_recompilation":
    case "--concurrent_osr":
    case "--omit_map_checks_for_leaf_maps":
    case "--turbo_filter":
    case "--trace_turbo":
    case "--trace_turbo_graph":
    case "--trace_turbo_cfg_file":
    case "--trace_turbo_types":
    case "--trace_turbo_scheduler":
    case "--trace_turbo_reduction":
    case "--trace_turbo_jt":
    case "--turbo_asm":
    case "--turbo_verify":
    case "--turbo_stats":
    case "--turbo_types":
    case "--turbo_source_positions":
    case "--context_specialization":
    case "--turbo_deoptimization":
    case "--turbo_inlining":
    case "--turbo_inlining_intrinsics":
    case "--trace_turbo_inlining":
    case "--loop_assignment_analysis":
    case "--turbo_profiling":
    case "--turbo_reuse_spill_slots":
    case "--turbo_delay_ssa_decon":
    case "--turbo_move_optimization":
    case "--turbo_jt":
    case "--typed_array_max_size_in_heap":
    case "--frame_count":
    case "--interrupt_budget":
    case "--type_info_threshold":
    case "--generic_ic_threshold":
    case "--self_opt_count":
    case "--trace_opt_verbose":
    case "--debug_code":
    case "--code_comments":
    case "--enable_sse3":
    case "--enable_sse4_1":
    case "--enable_sahf":
    case "--enable_avx":
    case "--enable_fma3":
    case "--enable_vfp3":
    case "--enable_armv7":
    case "--enable_armv8":
    case "--enable_neon":
    case "--enable_sudiv":
    case "--enable_mls":
    case "--enable_movw_movt":
    case "--enable_unaligned_accesses":
    case "--enable_32dregs":
    case "--enable_vldr_imm":
    case "--force_long_branches":
    case "--expose_natives_as":
    case "--expose_debug_as":
    case "--expose_free_buffer":
    case "--expose_gc":
    case "--expose_gc_as":
    case "--expose_externalize_string":
    case "--expose_trigger_failure":
    case "--stack_trace_limit":
    case "--builtins_in_stack_traces":
    case "--disable_native_files":
    case "--inline_new":
    case "--trace_codegen":
    case "--trace":
    case "--mask_constants_with_cookie":
    case "--lazy":
    case "--trace_opt":
    case "--trace_opt_stats":
    case "--opt":
    case "--always_opt":
    case "--always_osr":
    case "--prepare_always_opt":
    case "--trace_deopt":
    case "--trace_stub_failures":
    case "--serialize_toplevel":
    case "--serialize_inner":
    case "--trace_serializer":
    case "--min_preparse_length":
    case "--max_opt_count":
    case "--compilation_cache":
    case "--cache_prototype_transitions":
    case "--cpu_profiler_sampling_interval":
    case "--trace_debug_json":
    case "--trace_js_array_abuse":
    case "--trace_external_array_abuse":
    case "--trace_array_abuse":
    case "--enable_liveedit":
    case "--hard_abort":
    case "--stack_size":
    case "--max_stack_trace_source_length":
    case "--always_inline_smi_code":
    case "--min_semi_space_size":
    case "--target_semi_space_size":
    case "--max_semi_space_size":
    case "--semi_space_growth_factor":
    case "--experimental_new_space_growth_heuristic":
    case "--max_old_space_size":
    case "--initial_old_space_size":
    case "--max_executable_size":
    case "--gc_global":
    case "--gc_interval":
    case "--trace_gc":
    case "--trace_gc_nvp":
    case "--trace_gc_ignore_scavenger":
    case "--trace_idle_notification":
    case "--trace_idle_notification_verbose":
    case "--print_cumulative_gc_stat":
    case "--print_max_heap_committed":
    case "--trace_gc_verbose":
    case "--trace_fragmentation":
    case "--collect_maps":
    case "--weak_embedded_maps_in_optimized_code":
    case "--weak_embedded_objects_in_optimized_code":
    case "--flush_code":
    case "--flush_code_incrementally":
    case "--trace_code_flushing":
    case "--age_code":
    case "--incremental_marking":
    case "--incremental_marking_steps":
    case "--concurrent_sweeping":
    case "--trace_incremental_marking":
    case "--track_gc_object_stats":
    case "--heap_profiler_trace_objects":
    case "--use_idle_notification":
    case "--use_ic":
    case "--trace_ic":
    case "--native_code_counters":
    case "--always_compact":
    case "--never_compact":
    case "--compact_code_space":
    case "--incremental_code_compaction":
    case "--cleanup_code_caches_at_gc":
    case "--use_marking_progress_bar":
    case "--zap_code_space":
    case "--random_seed":
    case "--trace_weak_arrays":
    case "--track_prototype_users":
    case "--use_verbose_printer":
    case "--allow_natives_syntax":
    case "--trace_parse":
    case "--trace_sim":
    case "--debug_sim":
    case "--check_icache":
    case "--stop_sim_at":
    case "--sim_stack_alignment":
    case "--sim_stack_size":
    case "--log_regs_modified":
    case "--log_colour":
    case "--ignore_asm_unimplemented_break":
    case "--trace_sim_messages":
    case "--stack_trace_on_illegal":
    case "--abort_on_uncaught_exception":
    case "--randomize_hashes":
    case "--hash_seed":
    case "--profile_deserialization":
    case "--regexp_optimization":
    case "--testing_bool_flag":
    case "--testing_maybe_bool_flag":
    case "--testing_int_flag":
    case "--testing_float_flag":
    case "--testing_string_flag":
    case "--testing_prng_seed":
    case "--testing_serialization_file":
    case "--startup_blob":
    case "--profile_hydrogen_code_stub_compilation":
    case "--predictable":
    case "--help":
    case "--dump_counters":
    case "--debugger":
    case "--map_counters":
    case "--js_arguments":
    case "--gdbjit":
    case "--gdbjit_full":
    case "--gdbjit_dump":
    case "--gdbjit_dump_filter":
    case "--force_marking_deque_overflows":
    case "--stress_compaction":
    case "--log":
    case "--log_all":
    case "--log_api":
    case "--log_code":
    case "--log_gc":
    case "--log_handles":
    case "--log_snapshot_positions":
    case "--log_suspect":
    case "--prof":
    case "--prof_browser_mode":
    case "--log_regexp":
    case "--logfile":
    case "--logfile_per_isolate":
    case "--ll_prof":
    case "--perf_basic_prof":
    case "--perf_jit_prof":
    case "--gc_fake_mmap":
    case "--log_internal_timer_events":
    case "--log_timer_events":
    case "--log_instruction_stats":
    case "--log_instruction_file":
    case "--log_instruction_period":
    case "--redirect_code_traces":
    case "--redirect_code_traces_to":
    case "--hydrogen_track_positions":
    case "--trace_elements_transitions":
    case "--trace_creation_allocation_sites":
    case "--print_code_stubs":
    case "--test_secondary_stub_cache":
    case "--test_primary_stub_cache":
    case "--print_code":
    case "--print_opt_code":
    case "--print_unopt_code":
    case "--print_code_verbose":
    case "--print_builtin_code":
    case "--sodium":
    case "--print_all_code":
    case "--es5_readonly":
    case "--es52_globals":
    case "--harmony_typeof":
    case "--harmony_collections":
    case "--packed_arrays":
    case "--smi_only_arrays":
    case "--clever_optimizations":
    case "--use_range":
    case "--eliminate_dead_phis":
    case "--optimize_closures":
    case "--loop_weight":
    case "--opt_safe_uint32_operations":
    case "--parallel_recompilation":
    case "--trace_parallel_recompilation":
    case "--parallel_recompilation_queue_length":
    case "--experimental_profiler":
    case "--watch_ic_patching":
    case "--self_optimization":
    case "--direct_self_opt":
    case "--retry_self_opt":
    case "--count_based_interrupts":
    case "--interrupt_at_exit":
    case "--weighted_back_edges":
    case "--debug_code (generate extra code":
    case "--enable_sse2":
    case "--enable_cmov":
    case "--enable_rdtsc":
    case "--enable_vfp2":
    case "--enable_fpu":
    case "--stack_trace_on_abort":
    case "--always_full_compiler":
    case "--debugger_auto_break":
    case "--break_on_abort":
    case "--max_new_space_size":
    case "--trace_external_memory":
    case "--lazy_sweeping":
    case "--trace_exception":
    case "--preallocate_message_memory":
    case "--preemption":
    case "--extra_code":
    case "--remote_debugger":
    case "--debugger_agent":
    case "--debugger_port":
    case "--debug_compile_events":
    case "--debug_script_collected_events":
    case "--gdbjit":
    case "--log_runtime":
    case "--prof_auto":
    case "--prof_lazy":
    case "--sliding_state_window":
      args.unshift(arg);
      break;

    default:
      if (arg.indexOf("--trace") === 0) {
        args.unshift(arg);
      } else {
        args.push(arg);
      }
      break;
  }
});

// append arguments passed after --
if (argSeparator > -1) {
  args = args.concat(userArgs);
}

try {
  var kexec = require("kexec");
  kexec(process.argv[0], args);
} catch (err) {
  if (err.code !== "MODULE_NOT_FOUND") throw err;

  var child_process = require("child_process");
  var proc = child_process.spawn(process.argv[0], args, { stdio: "inherit" });
  proc.on("exit", function (code, signal) {
    process.on("exit", function () {
      if (signal) {
        process.kill(process.pid, signal);
      } else {
        process.exit(code);
      }
    })
  });
}
