diff options
Diffstat (limited to 'src/PursLoader/Loader.purs')
-rw-r--r-- | src/PursLoader/Loader.purs | 61 |
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 | ||
8 | import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), bind, const, id, pure, void, unit) | 8 | import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), (<<<), bind, const, id, pure, unit, void) |
9 | 9 | ||
10 | import Control.Apply ((*>)) | ||
11 | import Control.Bind (join) | 10 | import Control.Bind (join) |
12 | import Control.Monad.Eff (Eff(), foreachE) | 11 | import Control.Monad.Eff (Eff(), foreachE) |
13 | import Control.Monad.Eff.Console (CONSOLE()) | 12 | import Control.Monad.Eff.Console (CONSOLE()) |
14 | import Control.Monad.Eff.Exception (EXCEPTION(), Error(), error, message) | 13 | import Control.Monad.Eff.Exception (EXCEPTION(), Error(), error, message) |
15 | 14 | ||
16 | import Data.Array ((!!)) | 15 | import Data.Array ((!!)) |
17 | import Data.Bifunctor (lmap) | ||
18 | import Data.Either (Either(..), either) | 16 | import Data.Either (Either(..), either) |
19 | import Data.Foreign.Class (read) | ||
20 | import Data.Function (Fn2(), mkFn2) | 17 | import Data.Function (Fn2(), mkFn2) |
21 | import Data.Maybe (Maybe(), maybe) | 18 | import Data.Maybe (maybe) |
22 | import Data.Nullable (toMaybe) | 19 | import Data.Nullable (toMaybe) |
23 | import Data.String.Regex (Regex(), match, noFlags, regex) | 20 | import 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 | ||
43 | import PursLoader.Debug (debug) | 38 | import PursLoader.Debug (debug) |
44 | import PursLoader.LoaderUtil (parseQuery) | 39 | import PursLoader.Path (dirname, joinPath, relative) |
45 | import PursLoader.Options (Options(..)) | ||
46 | import PursLoader.Path (dirname, relative) | ||
47 | import PursLoader.Plugin as Plugin | 40 | import PursLoader.Plugin as Plugin |
48 | 41 | ||
49 | type Effects eff = (console :: CONSOLE, err :: EXCEPTION | eff) | 42 | type 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 | |||
124 | loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects_ eff) Unit) | 115 | loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects_ eff) Unit) |
125 | loaderFn = mkFn2 loader | 116 | loaderFn = mkFn2 loader |