aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--MODULE.md178
-rw-r--r--bower.json14
-rw-r--r--docs/PursLoader/ChildProcess.md15
-rw-r--r--docs/PursLoader/FS.md21
-rw-r--r--docs/PursLoader/Glob.md15
-rw-r--r--docs/PursLoader/Loader.md21
-rw-r--r--docs/PursLoader/LoaderRef.md51
-rw-r--r--docs/PursLoader/LoaderUtil.md9
-rw-r--r--docs/PursLoader/Options.md21
-rw-r--r--package.json5
-rw-r--r--src/PursLoader/ChildProcess.js40
-rw-r--r--src/PursLoader/ChildProcess.purs49
-rw-r--r--src/PursLoader/FS.js36
-rw-r--r--src/PursLoader/FS.purs59
-rw-r--r--src/PursLoader/Glob.js18
-rw-r--r--src/PursLoader/Glob.purs25
-rw-r--r--src/PursLoader/Loader.js17
-rw-r--r--src/PursLoader/Loader.purs19
-rw-r--r--src/PursLoader/LoaderRef.js56
-rw-r--r--src/PursLoader/LoaderRef.purs56
-rw-r--r--src/PursLoader/LoaderUtil.js7
-rw-r--r--src/PursLoader/LoaderUtil.purs6
-rw-r--r--src/PursLoader/Options.purs16
23 files changed, 391 insertions, 363 deletions
diff --git a/MODULE.md b/MODULE.md
deleted file mode 100644
index 45f6cca..0000000
--- a/MODULE.md
+++ /dev/null
@@ -1,178 +0,0 @@
1# Module Documentation
2
3## Module PursLoader.ChildProcess
4
5#### `ChildProcess`
6
7``` purescript
8data ChildProcess :: !
9```
10
11
12#### `spawn`
13
14``` purescript
15spawn :: forall eff. String -> [String] -> Aff (cp :: ChildProcess | eff) String
16```
17
18
19
20## Module PursLoader.FS
21
22#### `FS`
23
24``` purescript
25data FS :: !
26```
27
28
29#### `writeFileUtf8`
30
31``` purescript
32writeFileUtf8 :: forall eff. String -> String -> Aff (fs :: FS | eff) Unit
33```
34
35
36
37## Module PursLoader.Glob
38
39#### `Glob`
40
41``` purescript
42data Glob :: !
43```
44
45
46#### `globAll`
47
48``` purescript
49globAll :: forall eff. [String] -> Aff (glob :: Glob | eff) [[String]]
50```
51
52
53
54## Module PursLoader.Loader
55
56#### `Effects`
57
58``` purescript
59type Effects eff = (loader :: Loader, glob :: Glob, fs :: FS, cp :: ChildProcess | eff)
60```
61
62
63#### `loader`
64
65``` purescript
66loader :: forall eff. LoaderRef -> String -> Eff (Effects eff) Unit
67```
68
69
70#### `loaderFn`
71
72``` purescript
73loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects eff) Unit)
74```
75
76
77
78## Module PursLoader.LoaderRef
79
80#### `LoaderRef`
81
82``` purescript
83data LoaderRef
84```
85
86
87#### `Loader`
88
89``` purescript
90data Loader :: !
91```
92
93
94#### `async`
95
96``` purescript
97async :: forall eff a. LoaderRef -> Eff (loader :: Loader | eff) (Maybe Error -> a -> Eff (loader :: Loader | eff) Unit)
98```
99
100
101#### `cacheable`
102
103``` purescript
104cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
105```
106
107
108#### `query`
109
110``` purescript
111query :: LoaderRef -> String
112```
113
114
115
116## Module PursLoader.LoaderUtil
117
118#### `parseQuery`
119
120``` purescript
121parseQuery :: String -> Foreign
122```
123
124
125
126## Module PursLoader.Options
127
128#### `isForeignOptions`
129
130``` purescript
131instance isForeignOptions :: IsForeign Options
132```
133
134
135#### `booleanLoaderOption`
136
137``` purescript
138instance booleanLoaderOption :: LoaderOption Boolean
139```
140
141
142#### `stringLoaderOption`
143
144``` purescript
145instance stringLoaderOption :: LoaderOption String
146```
147
148
149#### `arrayLoaderOption`
150
151``` purescript
152instance arrayLoaderOption :: (LoaderOption a) => LoaderOption [a]
153```
154
155
156#### `pscOptions`
157
158``` purescript
159pscOptions :: Foreign -> [String]
160```
161
162
163#### `loaderSrcOption`
164
165``` purescript
166loaderSrcOption :: Foreign -> Maybe [String]
167```
168
169
170#### `loaderFFIOption`
171
172``` purescript
173loaderFFIOption :: Foreign -> Maybe [String]
174```
175
176
177
178
diff --git a/bower.json b/bower.json
index 2ee2486..0e676f4 100644
--- a/bower.json
+++ b/bower.json
@@ -2,16 +2,8 @@
2 "name": "purs-loader", 2 "name": "purs-loader",
3 "private": true, 3 "private": true,
4 "devDependencies": { 4 "devDependencies": {
5 "purescript-aff": "~0.9.1", 5 "purescript-aff": "~0.11.3",
6 "purescript-exceptions": "~0.2.3", 6 "purescript-strings": "~0.6.0",
7 "purescript-strings": "~0.4.5", 7 "purescript-foreign": "~0.6.0"
8 "purescript-maybe": "~0.2.2",
9 "purescript-foreign": "~0.4.2",
10 "purescript-foldable-traversable": "~0.3.1",
11 "purescript-tuples": "~0.3.4",
12 "purescript-maps": "~0.3.3",
13 "purescript-arrays": "~0.3.7",
14 "purescript-monad-eff": "~0.1.0",
15 "purescript-sets": "0.3.2"
16 } 8 }
17} 9}
diff --git a/docs/PursLoader/ChildProcess.md b/docs/PursLoader/ChildProcess.md
new file mode 100644
index 0000000..7c2e414
--- /dev/null
+++ b/docs/PursLoader/ChildProcess.md
@@ -0,0 +1,15 @@
1## Module PursLoader.ChildProcess
2
3#### `ChildProcess`
4
5``` purescript
6data ChildProcess :: !
7```
8
9#### `spawn`
10
11``` purescript
12spawn :: forall eff. String -> Array String -> Aff (cp :: ChildProcess | eff) String
13```
14
15
diff --git a/docs/PursLoader/FS.md b/docs/PursLoader/FS.md
new file mode 100644
index 0000000..811fcbd
--- /dev/null
+++ b/docs/PursLoader/FS.md
@@ -0,0 +1,21 @@
1## Module PursLoader.FS
2
3#### `FS`
4
5``` purescript
6data FS :: !
7```
8
9#### `writeFileUtf8`
10
11``` purescript
12writeFileUtf8 :: forall eff. String -> String -> Aff (fs :: FS | eff) Unit
13```
14
15#### `findFileUtf8`
16
17``` purescript
18findFileUtf8 :: forall eff. Regex -> Array String -> Aff (fs :: FS | eff) (Maybe String)
19```
20
21
diff --git a/docs/PursLoader/Glob.md b/docs/PursLoader/Glob.md
new file mode 100644
index 0000000..f7abe78
--- /dev/null
+++ b/docs/PursLoader/Glob.md
@@ -0,0 +1,15 @@
1## Module PursLoader.Glob
2
3#### `Glob`
4
5``` purescript
6data Glob :: !
7```
8
9#### `globAll`
10
11``` purescript
12globAll :: forall eff. Array String -> Aff (glob :: Glob | eff) (Array (Array String))
13```
14
15
diff --git a/docs/PursLoader/Loader.md b/docs/PursLoader/Loader.md
new file mode 100644
index 0000000..8e91c4a
--- /dev/null
+++ b/docs/PursLoader/Loader.md
@@ -0,0 +1,21 @@
1## Module PursLoader.Loader
2
3#### `Effects`
4
5``` purescript
6type Effects eff = (cp :: ChildProcess, fs :: FS, glob :: Glob, loader :: Loader | eff)
7```
8
9#### `loader`
10
11``` purescript
12loader :: forall eff. LoaderRef -> String -> Eff (Effects eff) Unit
13```
14
15#### `loaderFn`
16
17``` purescript
18loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects eff) Unit)
19```
20
21
diff --git a/docs/PursLoader/LoaderRef.md b/docs/PursLoader/LoaderRef.md
new file mode 100644
index 0000000..36c1550
--- /dev/null
+++ b/docs/PursLoader/LoaderRef.md
@@ -0,0 +1,51 @@
1## Module PursLoader.LoaderRef
2
3#### `LoaderRef`
4
5``` purescript
6data LoaderRef
7```
8
9#### `Loader`
10
11``` purescript
12data Loader :: !
13```
14
15#### `async`
16
17``` purescript
18async :: forall eff a. LoaderRef -> Eff (loader :: Loader | eff) (Maybe Error -> a -> Eff (loader :: Loader | eff) Unit)
19```
20
21#### `cacheable`
22
23``` purescript
24cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
25```
26
27#### `query`
28
29``` purescript
30query :: LoaderRef -> String
31```
32
33#### `clearDependencies`
34
35``` purescript
36clearDependencies :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
37```
38
39#### `resourcePath`
40
41``` purescript
42resourcePath :: LoaderRef -> String
43```
44
45#### `addDependency`
46
47``` purescript
48addDependency :: forall eff. LoaderRef -> String -> Eff (loader :: Loader | eff) Unit
49```
50
51
diff --git a/docs/PursLoader/LoaderUtil.md b/docs/PursLoader/LoaderUtil.md
new file mode 100644
index 0000000..36d6879
--- /dev/null
+++ b/docs/PursLoader/LoaderUtil.md
@@ -0,0 +1,9 @@
1## Module PursLoader.LoaderUtil
2
3#### `parseQuery`
4
5``` purescript
6parseQuery :: String -> Foreign
7```
8
9
diff --git a/docs/PursLoader/Options.md b/docs/PursLoader/Options.md
new file mode 100644
index 0000000..d04b721
--- /dev/null
+++ b/docs/PursLoader/Options.md
@@ -0,0 +1,21 @@
1## Module PursLoader.Options
2
3#### `pscOptions`
4
5``` purescript
6pscOptions :: Foreign -> Array String
7```
8
9#### `loaderSrcOption`
10
11``` purescript
12loaderSrcOption :: Foreign -> Maybe (Array String)
13```
14
15#### `loaderFFIOption`
16
17``` purescript
18loaderFFIOption :: Foreign -> Maybe (Array String)
19```
20
21
diff --git a/package.json b/package.json
index 0775c1b..7871a67 100644
--- a/package.json
+++ b/package.json
@@ -9,10 +9,11 @@
9 "email": "thul.eric@gmail.com" 9 "email": "thul.eric@gmail.com"
10 }, 10 },
11 "scripts": { 11 "scripts": {
12 "build": "npm run-script build:compile && npm run-script build:package", 12 "build": "npm run-script build:compile && npm run-script build:docs && npm run-script build:package",
13 "build:compile": "./node_modules/.bin/pulp build -o build", 13 "build:compile": "./node_modules/.bin/pulp build -o build",
14 "build:watch": "./node_modules/.bin/pulp -w build -o build", 14 "build:docs": "./node_modules/.bin/pulp docs",
15 "build:package": "./node_modules/.bin/webpack --progress --colors --profile --bail", 15 "build:package": "./node_modules/.bin/webpack --progress --colors --profile --bail",
16 "build:watch": "./node_modules/.bin/pulp -w build -o build",
16 "build:json": "./node_modules/.bin/webpack --progress --colors --profile --bail --json > index.json", 17 "build:json": "./node_modules/.bin/webpack --progress --colors --profile --bail --json > index.json",
17 "prepublish": "npm run-script build" 18 "prepublish": "npm run-script build"
18 }, 19 },
diff --git a/src/PursLoader/ChildProcess.js b/src/PursLoader/ChildProcess.js
new file mode 100644
index 0000000..d62aef6
--- /dev/null
+++ b/src/PursLoader/ChildProcess.js
@@ -0,0 +1,40 @@
1'use strict';
2
3// module PursLoader.ChildProcess
4
5var child_process = require('child_process');
6
7var chalk = require('chalk');
8
9function spawnFn(command, args, errback, callback) {
10 return function(){
11 var process = child_process.spawn(command, args);
12
13 var stdout = new Buffer(0);
14
15 var stderr = new Buffer(0);
16
17 process.stdout.on('data', function(data){
18 stdout = Buffer.concat([stdout, new Buffer(data)]);
19 });
20
21 process.stderr.on('data', function(data){
22 stderr = Buffer.concat([stderr, new Buffer(data)]);
23 });
24
25 process.on('close', function(code){
26 var output = stdout.toString('utf-8');
27
28 var error = stderr.toString('utf-8');
29
30 if (error.length > 0) {
31 console.error('\n' + chalk.red('*') + ' ' + error);
32 }
33
34 if (code !== 0) errback(new Error('Process terminated with code ' + code))();
35 else callback(output)();
36 });
37 };
38}
39
40exports.spawnFn = spawnFn;
diff --git a/src/PursLoader/ChildProcess.purs b/src/PursLoader/ChildProcess.purs
index 34558fa..3bd960b 100644
--- a/src/PursLoader/ChildProcess.purs
+++ b/src/PursLoader/ChildProcess.purs
@@ -3,6 +3,8 @@ module PursLoader.ChildProcess
3 , spawn 3 , spawn
4 ) where 4 ) where
5 5
6import Prelude (Unit(), ($))
7
6import Control.Monad.Aff (Aff(), makeAff) 8import Control.Monad.Aff (Aff(), makeAff)
7import Control.Monad.Eff (Eff()) 9import Control.Monad.Eff (Eff())
8import Control.Monad.Eff.Exception (Error()) 10import Control.Monad.Eff.Exception (Error())
@@ -11,46 +13,11 @@ import Data.Function
11 13
12foreign import data ChildProcess :: ! 14foreign import data ChildProcess :: !
13 15
14spawn :: forall eff. String -> [String] -> Aff (cp :: ChildProcess | eff) String 16spawn :: forall eff. String -> Array String -> Aff (cp :: ChildProcess | eff) String
15spawn command args = makeAff $ runFn4 spawnFn command args 17spawn command args = makeAff $ runFn4 spawnFn command args
16 18
17foreign import spawnFn """ 19foreign import spawnFn :: forall eff. Fn4 String
18function spawnFn(command, args, errback, callback) { 20 (Array String)
19 return function(){ 21 (Error -> Eff (cp :: ChildProcess | eff) Unit)
20 var child_process = require('child_process'); 22 (String -> Eff (cp :: ChildProcess | eff) Unit)
21 23 (Eff (cp :: ChildProcess | eff) Unit)
22 var process = child_process.spawn(command, args);
23
24 var stdout = new Buffer(0);
25
26 var stderr = new Buffer(0);
27
28 process.stdout.on('data', function(data){
29 stdout = Buffer.concat([stdout, new Buffer(data)]);
30 });
31
32 process.stderr.on('data', function(data){
33 stderr = Buffer.concat([stderr, new Buffer(data)]);
34 });
35
36 process.on('close', function(code){
37 var chalk = require('chalk');
38
39 var output = stdout.toString('utf-8');
40
41 var error = stderr.toString('utf-8');
42
43 if (error.length > 0) {
44 console.error('\n' + chalk.red('*') + ' ' + error);
45 }
46
47 if (code !== 0) errback(new Error('Process terminated with code ' + code))();
48 else callback(output)();
49 });
50 };
51}
52""" :: forall eff. Fn4 String
53 [String]
54 (Error -> Eff (cp :: ChildProcess | eff) Unit)
55 (String -> Eff (cp :: ChildProcess | eff) Unit)
56 (Eff (cp :: ChildProcess | eff) Unit)
diff --git a/src/PursLoader/FS.js b/src/PursLoader/FS.js
new file mode 100644
index 0000000..1a7f5b0
--- /dev/null
+++ b/src/PursLoader/FS.js
@@ -0,0 +1,36 @@
1'use strict';
2
3// module PursLoader.FS
4
5var fs = require('fs');
6
7var async = require('async');
8
9function writeFileUtf8Fn(filepath, contents, errback, callback) {
10 return function(){
11 fs.writeFile(filepath, contents, function(error){
12 if (error) errback(error)();
13 else callback()();
14 });
15 };
16}
17
18function findFileUtf8Fn(nothing, just, regex, filepaths, errback, callback) {
19 return function(){
20 function findFile(filepath, callback) {
21 fs.readFile(filepath, {encoding: 'utf-8'}, function(error, result){
22 if (error) callback(false);
23 else callback(regex.test(result));
24 });
25 }
26
27 async.detect(filepaths, findFile, function(result){
28 if (!result) callback(nothing)();
29 else callback(just(result))();
30 });
31 };
32}
33
34exports.writeFileUtf8Fn = writeFileUtf8Fn;
35
36exports.findFileUtf8Fn = findFileUtf8Fn;
diff --git a/src/PursLoader/FS.purs b/src/PursLoader/FS.purs
index 6955a63..969e3d0 100644
--- a/src/PursLoader/FS.purs
+++ b/src/PursLoader/FS.purs
@@ -4,6 +4,8 @@ module PursLoader.FS
4 , findFileUtf8 4 , findFileUtf8
5 ) where 5 ) where
6 6
7import Prelude (Unit(), ($))
8
7import Control.Monad.Aff (Aff(), makeAff) 9import Control.Monad.Aff (Aff(), makeAff)
8import Control.Monad.Eff (Eff()) 10import Control.Monad.Eff (Eff())
9import Control.Monad.Eff.Exception (Error()) 11import Control.Monad.Eff.Exception (Error())
@@ -18,50 +20,19 @@ foreign import data FS :: !
18writeFileUtf8 :: forall eff. String -> String -> Aff (fs :: FS | eff) Unit 20writeFileUtf8 :: forall eff. String -> String -> Aff (fs :: FS | eff) Unit
19writeFileUtf8 filepath contents = makeAff $ runFn4 writeFileUtf8Fn filepath contents 21writeFileUtf8 filepath contents = makeAff $ runFn4 writeFileUtf8Fn filepath contents
20 22
21foreign import writeFileUtf8Fn """ 23foreign import writeFileUtf8Fn :: forall eff. Fn4 String
22function writeFileUtf8Fn(filepath, contents, errback, callback) { 24 String
23 return function(){ 25 (Error -> Eff (fs :: FS | eff) Unit)
24 var fs = require('fs'); 26 (Unit -> Eff (fs :: FS | eff) Unit)
25 27 (Eff (fs :: FS | eff) Unit)
26 fs.writeFile(filepath, contents, function(error){
27 if (error) errback(error)();
28 else callback()();
29 });
30 };
31}
32""" :: forall eff. Fn4 String
33 String
34 (Error -> Eff (fs :: FS | eff) Unit)
35 (Unit -> Eff (fs :: FS | eff) Unit)
36 (Eff (fs :: FS | eff) Unit)
37 28
38findFileUtf8 :: forall eff. Regex -> [String] -> Aff (fs :: FS | eff) (Maybe String) 29findFileUtf8 :: forall eff. Regex -> Array String -> Aff (fs :: FS | eff) (Maybe String)
39findFileUtf8 regexp filepaths = makeAff $ runFn6 findFileUtf8Fn Nothing Just regexp filepaths 30findFileUtf8 regexp filepaths = makeAff $ runFn6 findFileUtf8Fn Nothing Just regexp filepaths
40 31
41foreign import findFileUtf8Fn """ 32foreign import findFileUtf8Fn :: forall eff. Fn6 (Maybe String)
42function findFileUtf8Fn(nothing, just, regex, filepaths, errback, callback) { 33 (String -> Maybe String)
43 return function(){ 34 Regex
44 var fs = require('fs'); 35 (Array String)
45 36 (Error -> Eff (fs :: FS | eff) Unit)
46 var async = require('async'); 37 (Maybe String -> Eff (fs :: FS | eff) Unit)
47 38 (Eff (fs :: FS | eff) Unit)
48 function findFile(filepath, callback) {
49 fs.readFile(filepath, {encoding: 'utf-8'}, function(error, result){
50 if (error) callback(false);
51 else callback(regex.test(result));
52 });
53 }
54
55 async.detect(filepaths, findFile, function(result){
56 if (!result) callback(nothing)();
57 else callback(just(result))();
58 });
59 };
60}
61""" :: forall eff. Fn6 (Maybe String)
62 (String -> Maybe String)
63 Regex
64 [String]
65 (Error -> Eff (fs :: FS | eff) Unit)
66 (Maybe String -> Eff (fs :: FS | eff) Unit)
67 (Eff (fs :: FS | eff) Unit)
diff --git a/src/PursLoader/Glob.js b/src/PursLoader/Glob.js
new file mode 100644
index 0000000..960ae9a
--- /dev/null
+++ b/src/PursLoader/Glob.js
@@ -0,0 +1,18 @@
1'use strict';
2
3// module PursLoader.Glob
4
5var glob = require('glob');
6
7var async = require('async');
8
9function globAllFn(patterns, errback, callback) {
10 return function(){
11 async.map(patterns, glob, function(error, result){
12 if (error) errback(new Error(error))();
13 else callback(result)();
14 });
15 };
16}
17
18exports.globAllFn = globAllFn;
diff --git a/src/PursLoader/Glob.purs b/src/PursLoader/Glob.purs
index 392d9e4..45eeb56 100644
--- a/src/PursLoader/Glob.purs
+++ b/src/PursLoader/Glob.purs
@@ -3,6 +3,8 @@ module PursLoader.Glob
3 , globAll 3 , globAll
4 ) where 4 ) where
5 5
6import Prelude (Unit(), ($))
7
6import Control.Monad.Aff (Aff(), makeAff) 8import Control.Monad.Aff (Aff(), makeAff)
7import Control.Monad.Eff (Eff()) 9import Control.Monad.Eff (Eff())
8import Control.Monad.Eff.Exception (Error()) 10import Control.Monad.Eff.Exception (Error())
@@ -11,23 +13,10 @@ import Data.Function
11 13
12foreign import data Glob :: ! 14foreign import data Glob :: !
13 15
14globAll :: forall eff. [String] -> Aff (glob :: Glob | eff) [[String]] 16globAll :: forall eff. Array String -> Aff (glob :: Glob | eff) (Array (Array String))
15globAll patterns = makeAff $ runFn3 globAllFn patterns 17globAll patterns = makeAff $ runFn3 globAllFn patterns
16 18
17foreign import globAllFn """ 19foreign import globAllFn :: forall eff. Fn3 (Array String)
18function globAllFn(patterns, errback, callback) { 20 (Error -> Eff (glob :: Glob | eff) Unit)
19 return function(){ 21 ((Array (Array String)) -> Eff (glob :: Glob | eff) Unit)
20 var glob = require('glob'); 22 (Eff (glob :: Glob | eff) Unit)
21
22 var async = require('async');
23
24 async.map(patterns, glob, function(error, result){
25 if (error) errback(new Error(error))();
26 else callback(result)();
27 });
28 };
29}
30""" :: forall eff. Fn3 [String]
31 (Error -> Eff (glob :: Glob | eff) Unit)
32 ([[String]] -> Eff (glob :: Glob | eff) Unit)
33 (Eff (glob :: Glob | eff) Unit)
diff --git a/src/PursLoader/Loader.js b/src/PursLoader/Loader.js
new file mode 100644
index 0000000..d7b5578
--- /dev/null
+++ b/src/PursLoader/Loader.js
@@ -0,0 +1,17 @@
1'use strict'
2
3// module PursLoader.Loader
4
5var path = require('path');
6
7var cwd = process.cwd();
8
9function relative(from) {
10 return function(to){
11 return path.relative(from, to);
12 };
13}
14
15exports.cwd = cwd;
16
17exports.relative = relative;
diff --git a/src/PursLoader/Loader.purs b/src/PursLoader/Loader.purs
index e9e03c4..5373d2f 100644
--- a/src/PursLoader/Loader.purs
+++ b/src/PursLoader/Loader.purs
@@ -4,6 +4,8 @@ module PursLoader.Loader
4 , loaderFn 4 , loaderFn
5 ) where 5 ) where
6 6
7import Prelude (Unit(), ($), (<>), (>>=), (<$>), (++), bind, flip, id, pure, return, unit)
8
7import Control.Monad.Aff (Aff(), runAff) 9import Control.Monad.Aff (Aff(), runAff)
8import Control.Monad.Eff (Eff()) 10import Control.Monad.Eff (Eff())
9import Control.Monad.Eff.Class (liftEff) 11import Control.Monad.Eff.Class (liftEff)
@@ -36,18 +38,11 @@ psciFilename = ".psci"
36 38
37(!!!) = flip (!!) 39(!!!) = flip (!!)
38 40
39foreign import cwd "var cwd = process.cwd();" :: String 41foreign import cwd :: String
40 42
41foreign import relative """ 43foreign import relative :: String -> String -> String
42function relative(from) {
43 return function(to){
44 var path = require('path');
45 return path.relative(from, to);
46 };
47}
48""" :: String -> String -> String
49 44
50mkPsci :: [[String]] -> [[String]] -> String 45mkPsci :: Array (Array String) -> Array (Array String) -> String
51mkPsci srcs ffis = joinWith "\n" ((loadModule <$> concat srcs) <> (loadForeign <$> concat ffis)) 46mkPsci srcs ffis = joinWith "\n" ((loadModule <$> concat srcs) <> (loadForeign <$> concat ffis))
52 where 47 where
53 loadModule :: String -> String 48 loadModule :: String -> String
@@ -56,7 +51,7 @@ mkPsci srcs ffis = joinWith "\n" ((loadModule <$> concat srcs) <> (loadForeign <
56 loadForeign :: String -> String 51 loadForeign :: String -> String
57 loadForeign a = ":f " ++ relative cwd a 52 loadForeign a = ":f " ++ relative cwd a
58 53
59findFFI :: forall eff. [[String]] -> String -> Aff (fs :: FS | eff) (Maybe String) 54findFFI :: forall eff. Array (Array String) -> String -> Aff (fs :: FS | eff) (Maybe String)
60findFFI ffiss name = findFileUtf8 re (concat ffiss) 55findFFI ffiss name = findFileUtf8 re (concat ffiss)
61 where 56 where
62 re = regex ("(?:^|\\n)//\\s*module\\s*" ++ name ++ "\\s*\\n") noFlags 57 re = regex ("(?:^|\\n)//\\s*module\\s*" ++ name ++ "\\s*\\n") noFlags
@@ -79,7 +74,7 @@ loader' ref source = do
79 74
80 writeFileUtf8 psciFilename psciFile 75 writeFileUtf8 psciFilename psciFile
81 76
82 let moduleName = match moduleRegex source >>= (!!!) 1 77 let moduleName = match moduleRegex source >>= (!!!) 1 >>= id
83 hasForeign = test foreignRegex source 78 hasForeign = test foreignRegex source
84 result = (\a -> "module.exports = require('" ++ a ++ "');") <$> moduleName 79 result = (\a -> "module.exports = require('" ++ a ++ "');") <$> moduleName
85 80
diff --git a/src/PursLoader/LoaderRef.js b/src/PursLoader/LoaderRef.js
new file mode 100644
index 0000000..3ce0970
--- /dev/null
+++ b/src/PursLoader/LoaderRef.js
@@ -0,0 +1,56 @@
1'use strict';
2
3// module PursLoader.LoaderRef
4
5function asyncFn(isJust, fromMaybe, ref){
6 return function(){
7 var callback = ref.async();
8 return function(error){
9 return function(value){
10 return function(){
11 return isJust(error) ? callback(fromMaybe(new Error())(error))
12 : callback(null, value);
13 };
14 };
15 };
16 };
17}
18function cacheable(ref){
19 return function(){
20 return ref.cacheable && ref.cacheable();
21 };
22}
23
24function query(ref){
25 return ref.query;
26}
27
28function clearDependencies(ref){
29 return function(){
30 return ref.clearDependencies();
31 };
32}
33
34function resourcePath(ref){
35 return ref.resourcePath;
36}
37
38function addDependency(ref){
39 return function(dep){
40 return function(){
41 return ref.addDependency(dep);
42 };
43 };
44}
45
46exports.asyncFn = asyncFn;
47
48exports.cacheable = cacheable;
49
50exports.query = query;
51
52exports.clearDependencies = clearDependencies;
53
54exports.resourcePath = resourcePath;
55
56exports.addDependency = addDependency;
diff --git a/src/PursLoader/LoaderRef.purs b/src/PursLoader/LoaderRef.purs
index f1efa04..33c4f7e 100644
--- a/src/PursLoader/LoaderRef.purs
+++ b/src/PursLoader/LoaderRef.purs
@@ -9,6 +9,8 @@ module PursLoader.LoaderRef
9 , resourcePath 9 , resourcePath
10 ) where 10 ) where
11 11
12import Prelude (Unit())
13
12import Control.Monad.Eff (Eff()) 14import Control.Monad.Eff (Eff())
13import Control.Monad.Eff.Exception (Error()) 15import Control.Monad.Eff.Exception (Error())
14 16
@@ -19,56 +21,20 @@ data LoaderRef
19 21
20foreign import data Loader :: ! 22foreign import data Loader :: !
21 23
22foreign import asyncFn """ 24foreign import asyncFn :: forall eff a. Fn3 (Maybe Error -> Boolean)
23function asyncFn(isJust, fromMaybe, ref){ 25 (Error -> Maybe Error -> Error)
24 return function(){ 26 LoaderRef
25 var callback = ref.async(); 27 (Eff (loader :: Loader | eff) (Maybe Error -> a -> Eff (loader :: Loader | eff) Unit))
26 return function(error){
27 return function(value){
28 return function(){
29 return isJust(error) ? callback(fromMaybe(new Error())(error))
30 : callback(null, value);
31 };
32 };
33 };
34 };
35}""" :: forall eff a. Fn3 (Maybe Error -> Boolean)
36 (Error -> Maybe Error -> Error)
37 LoaderRef
38 (Eff (loader :: Loader | eff) (Maybe Error -> a -> Eff (loader :: Loader | eff) Unit))
39 28
40async :: forall eff a. LoaderRef -> Eff (loader :: Loader | eff) (Maybe Error -> a -> Eff (loader :: Loader | eff) Unit) 29async :: forall eff a. LoaderRef -> Eff (loader :: Loader | eff) (Maybe Error -> a -> Eff (loader :: Loader | eff) Unit)
41async ref = runFn3 asyncFn isJust fromMaybe ref 30async ref = runFn3 asyncFn isJust fromMaybe ref
42 31
43foreign import cacheable """ 32foreign import cacheable :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
44function cacheable(ref){
45 return function(){
46 return ref.cacheable && ref.cacheable();
47 };
48}""" :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
49 33
50foreign import query """ 34foreign import query :: LoaderRef -> String
51function query(ref){
52 return ref.query;
53}""" :: LoaderRef -> String
54 35
55foreign import clearDependencies """ 36foreign import clearDependencies :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
56function clearDependencies(ref){
57 return function(){
58 return ref.clearDependencies();
59 };
60}""" :: forall eff. LoaderRef -> Eff (loader :: Loader | eff) Unit
61 37
62foreign import resourcePath """ 38foreign import resourcePath :: LoaderRef -> String
63function resourcePath(ref){
64 return ref.resourcePath;
65}""" :: LoaderRef -> String
66 39
67foreign import addDependency """ 40foreign import addDependency :: forall eff. LoaderRef -> String -> Eff (loader :: Loader | eff) Unit
68function addDependency(ref){
69 return function(dep){
70 return function(){
71 return ref.addDependency(dep);
72 };
73 };
74}""" :: forall eff. LoaderRef -> String -> Eff (loader :: Loader | eff) Unit
diff --git a/src/PursLoader/LoaderUtil.js b/src/PursLoader/LoaderUtil.js
new file mode 100644
index 0000000..45f2703
--- /dev/null
+++ b/src/PursLoader/LoaderUtil.js
@@ -0,0 +1,7 @@
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
index 86be124..3e5a7bc 100644
--- a/src/PursLoader/LoaderUtil.purs
+++ b/src/PursLoader/LoaderUtil.purs
@@ -6,8 +6,4 @@ import Data.Foreign (Foreign())
6 6
7import PursLoader.LoaderRef (LoaderRef()) 7import PursLoader.LoaderRef (LoaderRef())
8 8
9foreign import parseQuery """ 9foreign import parseQuery :: String -> Foreign
10function parseQuery(query){
11 var loaderUtils = require('loader-utils');
12 return loaderUtils.parseQuery(query);
13}""" :: String -> Foreign
diff --git a/src/PursLoader/Options.purs b/src/PursLoader/Options.purs
index 51e9be5..e3957eb 100644
--- a/src/PursLoader/Options.purs
+++ b/src/PursLoader/Options.purs
@@ -4,6 +4,8 @@ module PursLoader.Options
4 , loaderFFIOption 4 , loaderFFIOption
5 ) where 5 ) where
6 6
7import Prelude (Unit(), (<>), (<$>), (<<<), (++), (<*>), const)
8
7import Data.Array (concat) 9import Data.Array (concat)
8import Data.Either (either) 10import Data.Either (either)
9 11
@@ -45,8 +47,8 @@ newtype Options
45 , output :: NullOrUndefined String 47 , output :: NullOrUndefined String
46 , noPrefix :: NullOrUndefined Boolean 48 , noPrefix :: NullOrUndefined Boolean
47 , requirePath :: NullOrUndefined String 49 , requirePath :: NullOrUndefined String
48 , src :: NullOrUndefined [String] 50 , src :: NullOrUndefined (Array String)
49 , ffi :: NullOrUndefined [String] 51 , ffi :: NullOrUndefined (Array String)
50 } 52 }
51 53
52instance isForeignOptions :: IsForeign Options where 54instance isForeignOptions :: IsForeign Options where
@@ -74,7 +76,7 @@ instance isForeignOptions :: IsForeign Options where
74 <*> readProp ffiOpt obj) 76 <*> readProp ffiOpt obj)
75 77
76class LoaderOption a where 78class LoaderOption a where
77 opt :: String -> NullOrUndefined a -> [String] 79 opt :: String -> NullOrUndefined a -> Array String
78 80
79instance booleanLoaderOption :: LoaderOption Boolean where 81instance booleanLoaderOption :: LoaderOption Boolean where
80 opt key val = maybe [] (\a -> if a then ["--" ++ key] else []) (runNullOrUndefined val) 82 opt key val = maybe [] (\a -> if a then ["--" ++ key] else []) (runNullOrUndefined val)
@@ -82,11 +84,11 @@ instance booleanLoaderOption :: LoaderOption Boolean where
82instance stringLoaderOption :: LoaderOption String where 84instance stringLoaderOption :: LoaderOption String where
83 opt key val = maybe [] (\a -> ["--" ++ key ++ "=" ++ a]) (runNullOrUndefined val) 85 opt key val = maybe [] (\a -> ["--" ++ key ++ "=" ++ a]) (runNullOrUndefined val)
84 86
85instance arrayLoaderOption :: (LoaderOption a) => LoaderOption [a] where 87instance arrayLoaderOption :: (LoaderOption a) => LoaderOption (Array a) where
86 opt key val = concat (opt key <$> (NullOrUndefined <<< Just) 88 opt key val = concat (opt key <$> (NullOrUndefined <<< Just)
87 <$> (fromMaybe [] (runNullOrUndefined val))) 89 <$> (fromMaybe [] (runNullOrUndefined val)))
88 90
89pscOptions :: Foreign -> [String] 91pscOptions :: Foreign -> Array String
90pscOptions query = either (const []) fold parsed 92pscOptions query = either (const []) fold parsed
91 where parsed = read query :: F Options 93 where parsed = read query :: F Options
92 fold (Options a) = opt noPreludeOpt a.noPrelude <> 94 fold (Options a) = opt noPreludeOpt a.noPrelude <>
@@ -100,8 +102,8 @@ pscOptions query = either (const []) fold parsed
100 opt requirePathOpt a.requirePath <> 102 opt requirePathOpt a.requirePath <>
101 opt ffiOpt a.ffi 103 opt ffiOpt a.ffi
102 104
103loaderSrcOption :: Foreign -> Maybe [String] 105loaderSrcOption :: Foreign -> Maybe (Array String)
104loaderSrcOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.src) (read query) 106loaderSrcOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.src) (read query)
105 107
106loaderFFIOption :: Foreign -> Maybe [String] 108loaderFFIOption :: Foreign -> Maybe (Array String)
107loaderFFIOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.ffi) (read query) 109loaderFFIOption query = either (const Nothing) (\(Options a) -> runNullOrUndefined a.ffi) (read query)