aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/PursLoader/Loader.purs
diff options
context:
space:
mode:
Diffstat (limited to 'src/PursLoader/Loader.purs')
-rw-r--r--src/PursLoader/Loader.purs61
1 files changed, 26 insertions, 35 deletions
diff --git a/src/PursLoader/Loader.purs b/src/PursLoader/Loader.purs
index e1b9e0f..c50c63c 100644
--- a/src/PursLoader/Loader.purs
+++ b/src/PursLoader/Loader.purs
@@ -5,20 +5,17 @@ module PursLoader.Loader
5 , loaderFn 5 , loaderFn
6 ) where 6 ) where
7 7
8import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), bind, const, id, pure, void, unit) 8import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), (<<<), bind, const, id, pure, unit, void)
9 9
10import Control.Apply ((*>))
11import Control.Bind (join) 10import Control.Bind (join)
12import Control.Monad.Eff (Eff(), foreachE) 11import Control.Monad.Eff (Eff(), foreachE)
13import Control.Monad.Eff.Console (CONSOLE()) 12import Control.Monad.Eff.Console (CONSOLE())
14import Control.Monad.Eff.Exception (EXCEPTION(), Error(), error, message) 13import Control.Monad.Eff.Exception (EXCEPTION(), Error(), error, message)
15 14
16import Data.Array ((!!)) 15import Data.Array ((!!))
17import Data.Bifunctor (lmap)
18import Data.Either (Either(..), either) 16import Data.Either (Either(..), either)
19import Data.Foreign.Class (read)
20import Data.Function (Fn2(), mkFn2) 17import Data.Function (Fn2(), mkFn2)
21import Data.Maybe (Maybe(), maybe) 18import Data.Maybe (maybe)
22import Data.Nullable (toMaybe) 19import Data.Nullable (toMaybe)
23import Data.String.Regex (Regex(), match, noFlags, regex) 20import Data.String.Regex (Regex(), match, noFlags, regex)
24 21
@@ -34,16 +31,12 @@ import PursLoader.LoaderRef
34 , Loader() 31 , Loader()
35 , async 32 , async
36 , cacheable 33 , cacheable
37 , query
38 , clearDependencies
39 , addDependency 34 , addDependency
40 , resourcePath 35 , resourcePath
41 ) 36 )
42 37
43import PursLoader.Debug (debug) 38import PursLoader.Debug (debug)
44import PursLoader.LoaderUtil (parseQuery) 39import PursLoader.Path (dirname, joinPath, relative)
45import PursLoader.Options (Options(..))
46import PursLoader.Path (dirname, relative)
47import PursLoader.Plugin as Plugin 40import PursLoader.Plugin as Plugin
48 41
49type Effects eff = (console :: CONSOLE, err :: EXCEPTION | eff) 42type Effects eff = (console :: CONSOLE, err :: EXCEPTION | eff)
@@ -64,9 +57,7 @@ loader ref source = do
64 pluginContext = (unsafeCoerce ref).purescriptWebpackPluginContext 57 pluginContext = (unsafeCoerce ref).purescriptWebpackPluginContext
65 58
66 compile :: AsyncCallback (Effects eff) -> Plugin.Compile (Effects_ eff) 59 compile :: AsyncCallback (Effects eff) -> Plugin.Compile (Effects_ eff)
67 compile callback error' { srcMap, ffiMap, graph, output } = do 60 compile callback error' graph output = do
68 clearDependencies ref
69
70 either (const $ pure unit) (\a -> debug ("Adding PureScript dependency " ++ a)) name 61 either (const $ pure unit) (\a -> debug ("Adding PureScript dependency " ++ a)) name
71 62
72 addDependency ref (resourcePath ref) 63 addDependency ref (resourcePath ref)
@@ -83,24 +74,35 @@ loader ref source = do
83 74
84 handle :: String -> Array String -> String -> Eff (Effects_ eff) Unit 75 handle :: String -> Array String -> String -> Eff (Effects_ eff) Unit
85 handle name' deps res = do 76 handle name' deps res = do
86 debug ("Adding PureScript transitive dependencies for " ++ name') 77 debug ("Adding PureScript dependencies for " ++ name')
87 addTransitive name' 78 foreachE deps (addDependency ref)
88 foreachE deps addTransitive
89 debug "Generated loader result" 79 debug "Generated loader result"
90 debug res 80 debug res
91 callback (const fixedError <$> toMaybe error') res 81 callback (const fixedError <$> toMaybe error') res
92 82
93 exports :: Either Error String 83 exports :: Either Error String
94 exports = (\a b -> "module.exports = require('" ++ a ++ "')['" ++ b ++ "'];") <$> path <*> name 84 exports =
85 if pluginContext.options.bundle
86 then bundleExport <$> name
87 else moduleExport <<< modulePath <$> name
88 where
89 bundleExport :: String -> String
90 bundleExport name' = "module.exports = require('" ++ path ++ "')['" ++ name' ++ "'];"
91 where
92 path :: String
93 path = relative resourceDir pluginContext.options.bundleOutput
95 94
96 dependencies :: Either Error (Array String) 95 moduleExport :: String -> String
97 dependencies = name >>= Plugin.dependenciesOf graph 96 moduleExport path = "module.exports = require('" ++ path ++ "');"
98 97
99 addTransitive :: String -> Eff (Effects_ eff) Unit 98 modulePath :: String -> String
100 addTransitive dep = addDep (Plugin.get srcMap dep) *> addDep (Plugin.get ffiMap dep) 99 modulePath = relative resourceDir <<< joinPath pluginContext.options.output
101 where 100
102 addDep :: Maybe String -> Eff (Effects_ eff) Unit 101 resourceDir :: String
103 addDep = maybe (pure unit) (addDependency ref) 102 resourceDir = dirname (resourcePath ref)
103
104 dependencies :: Either Error (Array String)
105 dependencies = Plugin.dependenciesOf graph (resourcePath ref)
104 106
105 name :: Either Error String 107 name :: Either Error String
106 name = 108 name =
@@ -110,16 +112,5 @@ loader ref source = do
110 re :: Regex 112 re :: Regex
111 re = regex "(?:^|\\n)module\\s+([\\w\\.]+)" noFlags { ignoreCase = true } 113 re = regex "(?:^|\\n)module\\s+([\\w\\.]+)" noFlags { ignoreCase = true }
112 114
113 path :: Either Error String
114 path = (\(Options opts) -> relative resourceDir opts.bundleOutput) <$> options
115 where
116 options :: Either Error Options
117 options =
118 lmap (const $ error "Failed to parse loader query")
119 (read $ parseQuery (query ref))
120
121 resourceDir :: String
122 resourceDir = dirname (resourcePath ref)
123
124loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects_ eff) Unit) 115loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects_ eff) Unit)
125loaderFn = mkFn2 loader 116loaderFn = mkFn2 loader