, loaderFn
) where
- import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), bind, const, id, pure, void, unit)
-import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), (<<<), bind, const, id, pure, unit)
++import Prelude (Unit(), ($), (>>=), (<$>), (<*>), (++), (<<<), bind, const, id, pure, unit, void)
- import Control.Apply ((*>))
-import Control.Alt ((<|>))
import Control.Bind (join)
import Control.Monad.Eff (Eff(), foreachE)
-import Control.Monad.Eff.Exception (Error(), error)
+import Control.Monad.Eff.Console (CONSOLE())
+import Control.Monad.Eff.Exception (EXCEPTION(), Error(), error, message)
import Data.Array ((!!))
- import Data.Bifunctor (lmap)
import Data.Either (Either(..), either)
- import Data.Foreign.Class (read)
import Data.Function (Fn2(), mkFn2)
- import Data.Maybe (Maybe(), maybe)
-import Data.Maybe (Maybe(..), maybe)
++import Data.Maybe (maybe)
import Data.Nullable (toMaybe)
import Data.String.Regex (Regex(), match, noFlags, regex)
)
import PursLoader.Debug (debug)
- import PursLoader.LoaderUtil (parseQuery)
- import PursLoader.Options (Options(..))
- import PursLoader.Path (dirname, relative)
+ import PursLoader.Path (dirname, joinPath, relative)
import PursLoader.Plugin as Plugin
-type Effects eff = (loader :: Loader | eff)
+type Effects eff = (console :: CONSOLE, err :: EXCEPTION | eff)
+
+type Effects_ eff = Effects (loader :: Loader | eff)
-loader :: forall eff. LoaderRef -> String -> Eff (Effects eff) Unit
+loader :: forall eff. LoaderRef -> String -> Eff (Effects_ eff) Unit
loader ref source = do
callback <- async ref
pluginContext.compile (compile callback)
where
- pluginContext :: Plugin.Context (Effects eff)
+ pluginContext :: Plugin.Context (Effects_ eff)
pluginContext = (unsafeCoerce ref).purescriptWebpackPluginContext
- compile :: AsyncCallback eff -> Plugin.Compile (Effects eff)
- compile callback error' graph = do
+ compile :: AsyncCallback (Effects eff) -> Plugin.Compile (Effects_ eff)
- compile callback error' { srcMap, ffiMap, graph, output } = do
- clearDependencies ref
-
++ compile callback error' graph output = do
either (const $ pure unit) (\a -> debug ("Adding PureScript dependency " ++ a)) name
addDependency ref (resourcePath ref)
- either (\err -> callback (toMaybe error' <|> Just err) "") id
+ void $ writeString stderr UTF8 output (pure unit)
+
+ maybe (pure unit) (\a -> void $ writeString stderr UTF8 (message a) (pure unit)) (toMaybe error')
+
+ either (const $ callback (pure fixedError) "") id
(handle <$> name <*> dependencies <*> exports)
where
- handle :: String -> Array String -> String -> Eff (Effects eff) Unit
+ fixedError :: Error
+ fixedError = error "PureScript compilation has failed."
+
+ handle :: String -> Array String -> String -> Eff (Effects_ eff) Unit
handle name' deps res = do
- debug ("Adding PureScript transitive dependencies for " ++ name')
- addTransitive name'
- foreachE deps addTransitive
+ debug ("Adding PureScript dependencies for " ++ name')
+ foreachE deps (addDependency ref)
debug "Generated loader result"
debug res
- callback (toMaybe error') res
+ callback (const fixedError <$> toMaybe error') res
exports :: Either Error String
- exports = (\a b -> "module.exports = require('" ++ a ++ "')['" ++ b ++ "'];") <$> path <*> name
+ exports =
+ if pluginContext.options.bundle
+ then bundleExport <$> name
+ else moduleExport <<< modulePath <$> name
+ where
+ bundleExport :: String -> String
+ bundleExport name' = "module.exports = require('" ++ path ++ "')['" ++ name' ++ "'];"
+ where
+ path :: String
+ path = relative resourceDir pluginContext.options.bundleOutput
- dependencies :: Either Error (Array String)
- dependencies = name >>= Plugin.dependenciesOf graph
+ moduleExport :: String -> String
+ moduleExport path = "module.exports = require('" ++ path ++ "');"
- addTransitive :: String -> Eff (Effects_ eff) Unit
- addTransitive dep = addDep (Plugin.get srcMap dep) *> addDep (Plugin.get ffiMap dep)
- where
- addDep :: Maybe String -> Eff (Effects_ eff) Unit
- addDep = maybe (pure unit) (addDependency ref)
+ modulePath :: String -> String
+ modulePath = relative resourceDir <<< joinPath pluginContext.options.output
+
+ resourceDir :: String
+ resourceDir = dirname (resourcePath ref)
+
+ dependencies :: Either Error (Array String)
+ dependencies = Plugin.dependenciesOf graph (resourcePath ref)
name :: Either Error String
name =
re :: Regex
re = regex "(?:^|\\n)module\\s+([\\w\\.]+)" noFlags { ignoreCase = true }
- path :: Either Error String
- path = (\(Options opts) -> relative resourceDir opts.bundleOutput) <$> options
- where
- options :: Either Error Options
- options =
- lmap (const $ error "Failed to parse loader query")
- (read $ parseQuery (query ref))
-
- resourceDir :: String
- resourceDir = dirname (resourcePath ref)
-
-loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects eff) Unit)
+loaderFn :: forall eff. Fn2 LoaderRef String (Eff (Effects_ eff) Unit)
loaderFn = mkFn2 loader