aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoreric <thul.eric@gmail.com>2016-03-12 14:46:01 -0500
committereric <thul.eric@gmail.com>2016-03-12 14:46:01 -0500
commit55120f4502cb76e768f60654f3937db809df8ade (patch)
treef27800de3576466ea4d5502d9adb9cd57a583715
parent17f22f868b851e50081844562627a7a8a414dcaa (diff)
parent845f3ec3c5b13a47d60b9ff2be14bf41fb5c4734 (diff)
downloadpurs-loader-55120f4502cb76e768f60654f3937db809df8ade.tar.gz
purs-loader-55120f4502cb76e768f60654f3937db809df8ade.tar.zst
purs-loader-55120f4502cb76e768f60654f3937db809df8ade.zip
Merge pull request #43 from ethul/topic/optional-bundle
Handle optional bundling by the compiler
-rw-r--r--README.md6
-rw-r--r--docs/PursLoader/LoaderRef.md6
-rw-r--r--docs/PursLoader/Plugin.md20
-rw-r--r--package.json3
-rw-r--r--src/PursLoader/Loader.purs59
-rw-r--r--src/PursLoader/LoaderRef.js6
-rw-r--r--src/PursLoader/LoaderRef.purs3
-rw-r--r--src/PursLoader/LoaderUtil.js7
-rw-r--r--src/PursLoader/LoaderUtil.purs7
-rw-r--r--src/PursLoader/Options.purs30
-rw-r--r--src/PursLoader/Plugin.js6
-rw-r--r--src/PursLoader/Plugin.purs25
12 files changed, 35 insertions, 143 deletions
diff --git a/README.md b/README.md
index 0e1ce2f..e93e969 100644
--- a/README.md
+++ b/README.md
@@ -12,12 +12,6 @@ This loader works in conjunction with the [PureScript webpack plugin](https://np
12npm install purs-loader --save-dev 12npm install purs-loader --save-dev
13``` 13```
14 14
15## Options
16
17###### `bundleOutput` (String)
18
19Relative path to the bundled JavaScript file generated by the `PurescriptWebpackPlugin`. The default value is `output/bundle.js`.
20
21## Example 15## Example
22 16
23```js 17```js
diff --git a/docs/PursLoader/LoaderRef.md b/docs/PursLoader/LoaderRef.md
index 60341f7..917db3a 100644
--- a/docs/PursLoader/LoaderRef.md
+++ b/docs/PursLoader/LoaderRef.md
@@ -30,12 +30,6 @@ async :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) (Maybe Error -> S
30cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit 30cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
31``` 31```
32 32
33#### `query`
34
35``` purescript
36query :: LoaderRef -> String
37```
38
39#### `clearDependencies` 33#### `clearDependencies`
40 34
41``` purescript 35``` purescript
diff --git a/docs/PursLoader/Plugin.md b/docs/PursLoader/Plugin.md
index 9abec4d..7a524da 100644
--- a/docs/PursLoader/Plugin.md
+++ b/docs/PursLoader/Plugin.md
@@ -1,27 +1,21 @@
1## Module PursLoader.Plugin 1## Module PursLoader.Plugin
2 2
3#### `Result`
4
5``` purescript
6type Result = { srcMap :: ImmutableMap String String, ffiMap :: ImmutableMap String String, graph :: DependencyGraph }
7```
8
9#### `Compile` 3#### `Compile`
10 4
11``` purescript 5``` purescript
12type Compile eff = Nullable Error -> Result -> Eff eff Unit 6type Compile eff = Nullable Error -> DependencyGraph -> Eff eff Unit
13``` 7```
14 8
15#### `Context` 9#### `Context`
16 10
17``` purescript 11``` purescript
18type Context eff = { compile :: Compile eff -> Eff eff Unit } 12type Context eff = { compile :: Compile eff -> Eff eff Unit, options :: Options }
19``` 13```
20 14
21#### `get` 15#### `Options`
22 16
23``` purescript 17``` purescript
24get :: forall key value. ImmutableMap key value -> key -> Maybe value 18type Options = { bundle :: Boolean, output :: String, bundleOutput :: String }
25``` 19```
26 20
27#### `dependenciesOf` 21#### `dependenciesOf`
@@ -30,12 +24,6 @@ get :: forall key value. ImmutableMap key value -> key -> Maybe value
30dependenciesOf :: DependencyGraph -> String -> Either Error (Array String) 24dependenciesOf :: DependencyGraph -> String -> Either Error (Array String)
31``` 25```
32 26
33#### `ImmutableMap`
34
35``` purescript
36data ImmutableMap :: * -> * -> *
37```
38
39#### `DependencyGraph` 27#### `DependencyGraph`
40 28
41``` purescript 29``` purescript
diff --git a/package.json b/package.json
index 1491de6..b0c119d 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,6 @@
26 "dependencies": { 26 "dependencies": {
27 "async": "^1.3.0", 27 "async": "^1.3.0",
28 "chalk": "^1.1.0", 28 "chalk": "^1.1.0",
29 "debug": "^2.2.0", 29 "debug": "^2.2.0"
30 "loader-utils": "^0.2.6"
31 } 30 }
32} 31}
diff --git a/src/PursLoader/Loader.purs b/src/PursLoader/Loader.purs
index d1068b6..402e805 100644
--- a/src/PursLoader/Loader.purs
+++ b/src/PursLoader/Loader.purs
@@ -4,18 +4,15 @@ module PursLoader.Loader
4 , loaderFn 4 , loaderFn
5 ) where 5 ) where
6 6
7import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), bind, const, id, pure, unit) 7import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), (<<<), bind, const, id, pure, unit)
8 8
9import Control.Apply ((*>))
10import Control.Alt ((<|>)) 9import Control.Alt ((<|>))
11import Control.Bind (join) 10import Control.Bind (join)
12import Control.Monad.Eff (Eff(), foreachE) 11import Control.Monad.Eff (Eff(), foreachE)
13import Control.Monad.Eff.Exception (Error(), error) 12import Control.Monad.Eff.Exception (Error(), error)
14 13
15import Data.Array ((!!)) 14import Data.Array ((!!))
16import Data.Bifunctor (lmap)
17import Data.Either (Either(..), either) 15import Data.Either (Either(..), either)
18import Data.Foreign.Class (read)
19import Data.Function (Fn2(), mkFn2) 16import Data.Function (Fn2(), mkFn2)
20import Data.Maybe (Maybe(..), maybe) 17import Data.Maybe (Maybe(..), maybe)
21import Data.Nullable (toMaybe) 18import Data.Nullable (toMaybe)
@@ -29,16 +26,12 @@ import PursLoader.LoaderRef
29 , Loader() 26 , Loader()
30 , async 27 , async
31 , cacheable 28 , cacheable
32 , query
33 , clearDependencies
34 , addDependency 29 , addDependency
35 , resourcePath 30 , resourcePath
36 ) 31 )
37 32
38import PursLoader.Debug (debug) 33import PursLoader.Debug (debug)
39import PursLoader.LoaderUtil (parseQuery) 34import PursLoader.Path (dirname, joinPath, relative)
40import PursLoader.Options (Options(..))
41import PursLoader.Path (dirname, relative)
42import PursLoader.Plugin as Plugin 35import PursLoader.Plugin as Plugin
43 36
44type Effects eff = (loader :: Loader | eff) 37type Effects eff = (loader :: Loader | eff)
@@ -57,9 +50,7 @@ loader ref source = do
57 pluginContext = (unsafeCoerce ref).purescriptWebpackPluginContext 50 pluginContext = (unsafeCoerce ref).purescriptWebpackPluginContext
58 51
59 compile :: AsyncCallback eff -> Plugin.Compile (Effects eff) 52 compile :: AsyncCallback eff -> Plugin.Compile (Effects eff)
60 compile callback error' { srcMap, ffiMap, graph } = do 53 compile callback error' graph = do
61 clearDependencies ref
62
63 either (const $ pure unit) (\a -> debug ("Adding PureScript dependency " ++ a)) name 54 either (const $ pure unit) (\a -> debug ("Adding PureScript dependency " ++ a)) name
64 55
65 addDependency ref (resourcePath ref) 56 addDependency ref (resourcePath ref)
@@ -69,24 +60,35 @@ loader ref source = do
69 where 60 where
70 handle :: String -> Array String -> String -> Eff (Effects eff) Unit 61 handle :: String -> Array String -> String -> Eff (Effects eff) Unit
71 handle name' deps res = do 62 handle name' deps res = do
72 debug ("Adding PureScript transitive dependencies for " ++ name') 63 debug ("Adding PureScript dependencies for " ++ name')
73 addTransitive name' 64 foreachE deps (addDependency ref)
74 foreachE deps addTransitive
75 debug "Generated loader result" 65 debug "Generated loader result"
76 debug res 66 debug res
77 callback (toMaybe error') res 67 callback (toMaybe error') res
78 68
79 exports :: Either Error String 69 exports :: Either Error String
80 exports = (\a b -> "module.exports = require('" ++ a ++ "')['" ++ b ++ "'];") <$> path <*> name 70 exports =
71 if pluginContext.options.bundle
72 then bundleExport <$> name
73 else moduleExport <<< modulePath <$> name
74 where
75 bundleExport :: String -> String
76 bundleExport name' = "module.exports = require('" ++ path ++ "')['" ++ name' ++ "'];"
77 where
78 path :: String
79 path = relative resourceDir pluginContext.options.bundleOutput
81 80
82 dependencies :: Either Error (Array String) 81 moduleExport :: String -> String
83 dependencies = name >>= Plugin.dependenciesOf graph 82 moduleExport path = "module.exports = require('" ++ path ++ "');"
84 83
85 addTransitive :: String -> Eff (Effects eff) Unit 84 modulePath :: String -> String
86 addTransitive dep = addDep (Plugin.get srcMap dep) *> addDep (Plugin.get ffiMap dep) 85 modulePath = relative resourceDir <<< joinPath pluginContext.options.output
87 where 86
88 addDep :: Maybe String -> Eff (Effects eff) Unit 87 resourceDir :: String
89 addDep = maybe (pure unit) (addDependency ref) 88 resourceDir = dirname (resourcePath ref)
89
90 dependencies :: Either Error (Array String)
91 dependencies = Plugin.dependenciesOf graph (resourcePath ref)
90 92
91 name :: Either Error String 93 name :: Either Error String
92 name = 94 name =
@@ -96,16 +98,5 @@ loader ref source = do
96 re :: Regex 98 re :: Regex
97 re = regex "(?:^|\\n)module\\s+([\\w\\.]+)" noFlags { ignoreCase = true } 99 re = regex "(?:^|\\n)module\\s+([\\w\\.]+)" noFlags { ignoreCase = true }
98 100
99 path :: Either Error String
100 path = (\(Options opts) -> relative resourceDir opts.bundleOutput) <$> options
101 where
102 options :: Either Error Options
103 options =
104 lmap (const $ error "Failed to parse loader query")
105 (read $ parseQuery (query ref))
106
107 resourceDir :: String
108 resourceDir = dirname (resourcePath ref)
109
110loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects eff) Unit) 101loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects eff) Unit)
111loaderFn = mkFn2 loader 102loaderFn = 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
24function query(ref){
25 return ref.query;
26}
27
28function clearDependencies(ref){ 24function 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
48exports.cacheable = cacheable; 44exports.cacheable = cacheable;
49 45
50exports.query = query;
51
52exports.clearDependencies = clearDependencies; 46exports.clearDependencies = clearDependencies;
53 47
54exports.resourcePath = resourcePath; 48exports.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
35foreign import cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit 34foreign import cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
36 35
37foreign import query :: LoaderRef -> String
38
39foreign import clearDependencies :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit 36foreign import clearDependencies :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
40 37
41foreign import resourcePath :: LoaderRef -> String 38foreign 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
5var loaderUtils = require('loader-utils');
6
7exports.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 @@
1module PursLoader.LoaderUtil
2 ( parseQuery
3 ) where
4
5import Data.Foreign (Foreign())
6
7foreign 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 @@
1module PursLoader.Options
2 ( Options(..)
3 , runOptions
4 ) where
5
6import Prelude ((<$>), (<<<), id)
7
8import Data.Foreign.Class (IsForeign, readProp)
9import Data.Foreign.NullOrUndefined (runNullOrUndefined)
10import Data.Maybe (maybe)
11
12import PursLoader.Path (joinPath)
13
14newtype Options = Options { bundleOutput :: String }
15
16type Options_ = { bundleOutput :: String }
17
18runOptions :: Options -> Options_
19runOptions (Options options) = options
20
21instance 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
5function getFn(nothing, just, map, key) {
6 var value = map.get(key);
7 return value === undefined ? nothing : just(value);
8}
9exports.getFn = getFn;
10
11function dependenciesOfFn(left, right, graph, node) { 5function 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 23f8600..c798c83 100644
--- a/src/PursLoader/Plugin.purs
+++ b/src/PursLoader/Plugin.purs
@@ -1,10 +1,8 @@
1module PursLoader.Plugin 1module 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
16import Data.Either (Either(..)) 14import Data.Either (Either(..))
17import Data.Function (Fn4(), runFn4) 15import Data.Function (Fn4(), runFn4)
18import Data.Maybe (Maybe(..))
19import Data.Nullable (Nullable()) 16import Data.Nullable (Nullable())
20 17
21type Result = { srcMap :: ImmutableMap String String, ffiMap :: ImmutableMap String String, graph :: DependencyGraph } 18type Compile eff = Nullable Error -> DependencyGraph -> Eff eff Unit
22 19
23type Compile eff = Nullable Error -> Result -> Eff eff Unit 20type Context eff = { compile :: Compile eff -> Eff eff Unit, options :: Options }
24 21
25type Context eff = { compile :: Compile eff -> Eff eff Unit } 22type Options = { bundle :: Boolean, output :: String, bundleOutput :: String }
26
27get :: forall key value. ImmutableMap key value -> key -> Maybe value
28get = runFn4 getFn Nothing Just
29 23
30dependenciesOf :: DependencyGraph -> String -> Either Error (Array String) 24dependenciesOf :: DependencyGraph -> String -> Either Error (Array String)
31dependenciesOf = runFn4 dependenciesOfFn Left Right 25dependenciesOf = runFn4 dependenciesOfFn Left Right
32 26
33foreign import data ImmutableMap :: * -> * -> *
34
35foreign import data DependencyGraph :: * 27foreign import data DependencyGraph :: *
36 28
37foreign import getFn
38 :: forall key value. Fn4 (Maybe value)
39 (value -> Maybe value)
40 (ImmutableMap key value)
41 key
42 (Maybe value)
43
44foreign import dependenciesOfFn 29foreign 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))