@@ -3,7 +3,6 @@ defmodule ElixirScript.Output do
33
44 alias ElixirScript.State , as: ModuleState
55 alias ESTree.Tools . { Builder , Generator }
6- @ generated_name "elixirscript.build.js"
76
87 @ doc """
98 Takes outputs the JavaScript code in the specified output
@@ -12,8 +11,8 @@ defmodule ElixirScript.Output do
1211 def execute ( modules , pid , opts ) do
1312 modules = modules
1413 |> Enum . filter ( fn { _ , info } -> Map . has_key? ( info , :js_ast ) end )
15- |> Enum . map ( fn { _module , info } ->
16- info . js_ast
14+ |> Enum . map ( fn { module , info } ->
15+ { module , info . js_ast , info . used_modules }
1716 end
1817 )
1918
@@ -28,31 +27,14 @@ defmodule ElixirScript.Output do
2827 { module , name , path , import_path }
2928 end )
3029
31- bundle ( modules , opts , js_modules )
32- |> output ( Map . get ( opts , :output ) , js_modules )
33- end
34-
35- defp bundle ( modules , opts , js_modules ) do
3630 modules
37- |> ElixirScript.Output.JSModule . compile ( opts , js_modules )
38- |> Task . async_stream ( fn ( js_part ) ->
39- js_part
40- |> List . wrap
41- |> Builder . program
42- |> prepare_js_ast
43- |> Generator . generate
44- end )
45- |> Stream . map ( fn { :ok , js_code } -> js_code end )
46- |> Enum . to_list
47- |> Enum . join ( "\n " )
48- |> concat
31+ |> create_modules ( opts , js_modules )
4932 end
5033
5134 defp concat ( code ) do
5235 """
5336 'use strict';
5437 import ElixirScript from './ElixirScript.Core.js';
55- const Elixir = ElixirScript.Core.initApp();
5638 #{ code }
5739 """
5840 end
@@ -68,17 +50,50 @@ defmodule ElixirScript.Output do
6850 end
6951 end
7052
71- defp output ( code , nil , _ ) do
53+ defp create_modules ( modules , opts , js_modules ) do
54+ modules
55+ |> Task . async_stream ( fn ( { module , [ body , exports ] , used_modules } ) ->
56+ modules = modules_to_import ( used_modules ) ++ js_modules
57+
58+ imports = opts . module_formatter . build_imports ( modules )
59+ exports = opts . module_formatter . build_export ( exports )
60+
61+ js_parts = List . wrap ( imports ) ++ body ++ List . wrap ( exports )
62+
63+ js_parts
64+ |> Builder . program
65+ |> prepare_js_ast
66+ |> Generator . generate
67+ |> concat
68+ |> output ( module , Map . get ( opts , :output ) , js_modules )
69+ end )
70+ |> Stream . run
71+ end
72+
73+ defp modules_to_import ( modules ) do
74+ Enum . map ( modules , & module_to_import ( & 1 ) )
75+ end
76+
77+ defp module_to_import ( module ) do
78+ { module , module_to_name ( module ) , "" , "./Elixir.#{ inspect module } .js" }
79+ end
80+
81+ def module_to_name ( module ) do
82+ "#{ inspect module } "
83+ |> String . replace ( "." , "$" )
84+ end
85+
86+ defp output ( code , _ , nil , _ ) do
7287 code
7388 end
7489
75- defp output ( code , :stdout , _ ) do
90+ defp output ( code , _ , :stdout , _ ) do
7691 IO . puts ( code )
7792 end
7893
79- defp output ( code , path , js_modules ) do
80- file_name = get_output_file_name ( path )
81- output_dir = Path . dirname ( file_name )
94+ defp output ( code , module , path , js_modules ) do
95+ output_dir = Path . dirname ( path )
96+ file_name = Path . join ( output_dir , "Elixir. #{ inspect module } .js" )
8297
8398 if ! File . exists? ( output_dir ) do
8499 File . mkdir_p! ( output_dir )
@@ -99,17 +114,6 @@ defmodule ElixirScript.Output do
99114 File . cp! ( path , Path . join ( [ directory , "ElixirScript.Core.js" ] ) )
100115 end
101116
102- def get_output_file_name ( path ) do
103- case Path . extname ( path ) do
104- ".js" ->
105- path
106- ".mjs" ->
107- path
108- _ ->
109- Path . join ( [ path , @ generated_name ] )
110- end
111- end
112-
113117 defp get_app_names ( ) do
114118 Mix.Project . config ( ) [ :app ]
115119 deps = Mix.Project . deps_paths ( )
0 commit comments