diff options
Diffstat (limited to 'src/PursLoader')
-rw-r--r-- | src/PursLoader/Loader.purs | 61 | ||||
-rw-r--r-- | src/PursLoader/LoaderRef.js | 6 | ||||
-rw-r--r-- | src/PursLoader/LoaderRef.purs | 3 | ||||
-rw-r--r-- | src/PursLoader/LoaderUtil.js | 7 | ||||
-rw-r--r-- | src/PursLoader/LoaderUtil.purs | 7 | ||||
-rw-r--r-- | src/PursLoader/Options.purs | 30 | ||||
-rw-r--r-- | src/PursLoader/Plugin.js | 6 | ||||
-rw-r--r-- | src/PursLoader/Plugin.purs | 25 |
8 files changed, 31 insertions, 114 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 |
diff --git a/src/PursLoader/LoaderRef.js b/src/PursLoader/LoaderRef.js index 3ce0970..a5d8e1f 100644 --- a/src/PursLoader/LoaderRef.js +++ b/src/PursLoader/LoaderRef.js | |||
@@ -21,10 +21,6 @@ function cacheable(ref){ | |||
21 | }; | 21 | }; |
22 | } | 22 | } |
23 | 23 | ||
24 | function query(ref){ | ||
25 | return ref.query; | ||
26 | } | ||
27 | |||
28 | function clearDependencies(ref){ | 24 | function clearDependencies(ref){ |
29 | return function(){ | 25 | return function(){ |
30 | return ref.clearDependencies(); | 26 | return ref.clearDependencies(); |
@@ -47,8 +43,6 @@ exports.asyncFn = asyncFn; | |||
47 | 43 | ||
48 | exports.cacheable = cacheable; | 44 | exports.cacheable = cacheable; |
49 | 45 | ||
50 | exports.query = query; | ||
51 | |||
52 | exports.clearDependencies = clearDependencies; | 46 | exports.clearDependencies = clearDependencies; |
53 | 47 | ||
54 | exports.resourcePath = resourcePath; | 48 | exports.resourcePath = resourcePath; |
diff --git a/src/PursLoader/LoaderRef.purs b/src/PursLoader/LoaderRef.purs index 87d6006..140d94a 100644 --- a/src/PursLoader/LoaderRef.purs +++ b/src/PursLoader/LoaderRef.purs | |||
@@ -4,7 +4,6 @@ module PursLoader.LoaderRef | |||
4 | , AsyncCallback() | 4 | , AsyncCallback() |
5 | , async | 5 | , async |
6 | , cacheable | 6 | , cacheable |
7 | , query | ||
8 | , clearDependencies | 7 | , clearDependencies |
9 | , addDependency | 8 | , addDependency |
10 | , resourcePath | 9 | , resourcePath |
@@ -34,8 +33,6 @@ async ref = runFn3 asyncFn isJust fromMaybe ref | |||
34 | 33 | ||
35 | foreign import cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit | 34 | foreign import cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit |
36 | 35 | ||
37 | foreign import query :: LoaderRef -> String | ||
38 | |||
39 | foreign import clearDependencies :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit | 36 | foreign import clearDependencies :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit |
40 | 37 | ||
41 | foreign import resourcePath :: LoaderRef -> String | 38 | foreign import resourcePath :: LoaderRef -> String |
diff --git a/src/PursLoader/LoaderUtil.js b/src/PursLoader/LoaderUtil.js deleted file mode 100644 index 45f2703..0000000 --- a/src/PursLoader/LoaderUtil.js +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | 'use strict'; | ||
2 | |||
3 | // module PursLoader.LoaderUtil | ||
4 | |||
5 | var loaderUtils = require('loader-utils'); | ||
6 | |||
7 | exports.parseQuery = loaderUtils.parseQuery; | ||
diff --git a/src/PursLoader/LoaderUtil.purs b/src/PursLoader/LoaderUtil.purs deleted file mode 100644 index 45495c8..0000000 --- a/src/PursLoader/LoaderUtil.purs +++ /dev/null | |||
@@ -1,7 +0,0 @@ | |||
1 | module PursLoader.LoaderUtil | ||
2 | ( parseQuery | ||
3 | ) where | ||
4 | |||
5 | import Data.Foreign (Foreign()) | ||
6 | |||
7 | foreign import parseQuery :: String -> Foreign | ||
diff --git a/src/PursLoader/Options.purs b/src/PursLoader/Options.purs deleted file mode 100644 index 0c1453e..0000000 --- a/src/PursLoader/Options.purs +++ /dev/null | |||
@@ -1,30 +0,0 @@ | |||
1 | module PursLoader.Options | ||
2 | ( Options(..) | ||
3 | , runOptions | ||
4 | ) where | ||
5 | |||
6 | import Prelude ((<$>), (<<<), id) | ||
7 | |||
8 | import Data.Foreign.Class (IsForeign, readProp) | ||
9 | import Data.Foreign.NullOrUndefined (runNullOrUndefined) | ||
10 | import Data.Maybe (maybe) | ||
11 | |||
12 | import PursLoader.Path (joinPath) | ||
13 | |||
14 | newtype Options = Options { bundleOutput :: String } | ||
15 | |||
16 | type Options_ = { bundleOutput :: String } | ||
17 | |||
18 | runOptions :: Options -> Options_ | ||
19 | runOptions (Options options) = options | ||
20 | |||
21 | instance isForeignOptions :: IsForeign Options where | ||
22 | read obj = | ||
23 | Options <$> ({ bundleOutput: _ } | ||
24 | <$> (maybe bundleOutputDefault id <<< runNullOrUndefined <$> readProp bundleOutput obj)) | ||
25 | where | ||
26 | bundleOutput :: String | ||
27 | bundleOutput = "bundleOutput" | ||
28 | |||
29 | bundleOutputDefault :: String | ||
30 | bundleOutputDefault = joinPath "output" "bundle.js" | ||
diff --git a/src/PursLoader/Plugin.js b/src/PursLoader/Plugin.js index 90feb33..ded6df5 100644 --- a/src/PursLoader/Plugin.js +++ b/src/PursLoader/Plugin.js | |||
@@ -2,12 +2,6 @@ | |||
2 | 2 | ||
3 | // module PursLoader.Plugin | 3 | // module PursLoader.Plugin |
4 | 4 | ||
5 | function getFn(nothing, just, map, key) { | ||
6 | var value = map.get(key); | ||
7 | return value === undefined ? nothing : just(value); | ||
8 | } | ||
9 | exports.getFn = getFn; | ||
10 | |||
11 | function dependenciesOfFn(left, right, graph, node) { | 5 | function dependenciesOfFn(left, right, graph, node) { |
12 | try { | 6 | try { |
13 | var dependencies = graph.dependenciesOf(node); | 7 | var dependencies = graph.dependenciesOf(node); |
diff --git a/src/PursLoader/Plugin.purs b/src/PursLoader/Plugin.purs index c9f0133..8bb53be 100644 --- a/src/PursLoader/Plugin.purs +++ b/src/PursLoader/Plugin.purs | |||
@@ -1,10 +1,8 @@ | |||
1 | module PursLoader.Plugin | 1 | module PursLoader.Plugin |
2 | ( Result() | 2 | ( Compile() |
3 | , Compile() | ||
4 | , Context() | 3 | , Context() |
5 | , ImmutableMap() | 4 | , Options() |
6 | , DependencyGraph() | 5 | , DependencyGraph() |
7 | , get | ||
8 | , dependenciesOf | 6 | , dependenciesOf |
9 | ) where | 7 | ) where |
10 | 8 | ||
@@ -15,32 +13,19 @@ import Control.Monad.Eff.Exception (Error()) | |||
15 | 13 | ||
16 | import Data.Either (Either(..)) | 14 | import Data.Either (Either(..)) |
17 | import Data.Function (Fn4(), runFn4) | 15 | import Data.Function (Fn4(), runFn4) |
18 | import Data.Maybe (Maybe(..)) | ||
19 | import Data.Nullable (Nullable()) | 16 | import Data.Nullable (Nullable()) |
20 | 17 | ||
21 | type Result = { srcMap :: ImmutableMap String String, ffiMap :: ImmutableMap String String, graph :: DependencyGraph, output :: String } | 18 | type Compile eff = Nullable Error -> DependencyGraph -> String -> Eff eff Unit |
22 | 19 | ||
23 | type Compile eff = Nullable Error -> Result -> Eff eff Unit | 20 | type Context eff = { compile :: Compile eff -> Eff eff Unit, options :: Options } |
24 | 21 | ||
25 | type Context eff = { compile :: Compile eff -> Eff eff Unit } | 22 | type Options = { bundle :: Boolean, output :: String, bundleOutput :: String } |
26 | |||
27 | get :: forall key value. ImmutableMap key value -> key -> Maybe value | ||
28 | get = runFn4 getFn Nothing Just | ||
29 | 23 | ||
30 | dependenciesOf :: DependencyGraph -> String -> Either Error (Array String) | 24 | dependenciesOf :: DependencyGraph -> String -> Either Error (Array String) |
31 | dependenciesOf = runFn4 dependenciesOfFn Left Right | 25 | dependenciesOf = runFn4 dependenciesOfFn Left Right |
32 | 26 | ||
33 | foreign import data ImmutableMap :: * -> * -> * | ||
34 | |||
35 | foreign import data DependencyGraph :: * | 27 | foreign import data DependencyGraph :: * |
36 | 28 | ||
37 | foreign import getFn | ||
38 | :: forall key value. Fn4 (Maybe value) | ||
39 | (value -> Maybe value) | ||
40 | (ImmutableMap key value) | ||
41 | key | ||
42 | (Maybe value) | ||
43 | |||
44 | foreign import dependenciesOfFn | 29 | foreign import dependenciesOfFn |
45 | :: Fn4 (Error -> Either Error (Array String)) | 30 | :: Fn4 (Error -> Either Error (Array String)) |
46 | (Array String -> Either Error (Array String)) | 31 | (Array String -> Either Error (Array String)) |