module Text.Jasmine
    ( minify
    , minifym
    , minifyBb
    , minifyFile
    ) where

import           Data.ByteString.Builder (Builder)
import qualified Data.ByteString.Builder as Builder
import qualified Data.ByteString.Lazy.Char8 as LBS
import           Data.Text.Lazy (unpack)
import           Data.Text.Lazy.Encoding (decodeUtf8With)
import           Data.Text.Encoding.Error (lenientDecode)

import           Language.JavaScript.Parser (readJs, parse, JSAST)
import           Language.JavaScript.Pretty.Printer (renderJS)
import           Language.JavaScript.Process.Minify (minifyJS)



minifym :: LBS.ByteString -> Either String LBS.ByteString
minifym :: ByteString -> Either [Char] ByteString
minifym ByteString
s =
  case ByteString -> Either [Char] JSAST
myParse ByteString
s of
    Left [Char]
msg -> [Char] -> Either [Char] ByteString
forall a b. a -> Either a b
Left ([Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
msg)
    Right JSAST
p  -> ByteString -> Either [Char] ByteString
forall a b. b -> Either a b
Right (ByteString -> Either [Char] ByteString)
-> ByteString -> Either [Char] ByteString
forall a b. (a -> b) -> a -> b
$ Builder -> ByteString
Builder.toLazyByteString (Builder -> ByteString) -> Builder -> ByteString
forall a b. (a -> b) -> a -> b
$ JSAST -> Builder
renderJS (JSAST -> Builder) -> JSAST -> Builder
forall a b. (a -> b) -> a -> b
$ JSAST -> JSAST
minifyJS JSAST
p


minifyBb :: LBS.ByteString -> Either String Builder
minifyBb :: ByteString -> Either [Char] Builder
minifyBb ByteString
s =
  case ByteString -> Either [Char] JSAST
myParse ByteString
s  of
    Left [Char]
msg -> [Char] -> Either [Char] Builder
forall a b. a -> Either a b
Left ([Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
msg)
    Right JSAST
p  -> Builder -> Either [Char] Builder
forall a b. b -> Either a b
Right (JSAST -> Builder
renderJS (JSAST -> Builder) -> JSAST -> Builder
forall a b. (a -> b) -> a -> b
$ JSAST -> JSAST
minifyJS JSAST
p)


minify :: LBS.ByteString -> LBS.ByteString
minify :: ByteString -> ByteString
minify =
  Builder -> ByteString
Builder.toLazyByteString (Builder -> ByteString)
-> (ByteString -> Builder) -> ByteString -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSAST -> Builder
renderJS (JSAST -> Builder)
-> (ByteString -> JSAST) -> ByteString -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JSAST -> JSAST
minifyJS (JSAST -> JSAST) -> (ByteString -> JSAST) -> ByteString -> JSAST
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> JSAST
readJs ([Char] -> JSAST) -> (ByteString -> [Char]) -> ByteString -> JSAST
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Char]
lbToStr


minifyFile :: FilePath -> IO LBS.ByteString
minifyFile :: [Char] -> IO ByteString
minifyFile [Char]
filename =
  ByteString -> ByteString
minify (ByteString -> ByteString) -> IO ByteString -> IO ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char] -> IO ByteString
LBS.readFile [Char]
filename


myParse :: LBS.ByteString -> Either String JSAST
myParse :: ByteString -> Either [Char] JSAST
myParse ByteString
input =
  [Char] -> [Char] -> Either [Char] JSAST
parse (ByteString -> [Char]
lbToStr ByteString
input) [Char]
"src"


lbToStr :: LBS.ByteString -> String
lbToStr :: ByteString -> [Char]
lbToStr =
  Text -> [Char]
unpack (Text -> [Char]) -> (ByteString -> Text) -> ByteString -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OnDecodeError -> ByteString -> Text
decodeUtf8With OnDecodeError
lenientDecode