Include inlined source maps when compiling projects. The actual source map generation is not done.

This commit is contained in:
Robin Heggelund Hansen 2023-05-02 22:12:47 +02:00
parent 6076e115e0
commit edf50aba98
No known key found for this signature in database
6 changed files with 67 additions and 33 deletions

View File

@ -37,7 +37,7 @@ import Prelude hiding (cycle, print)
type Task a = type Task a =
Task.Task Exit.Generate a Task.Task Exit.Generate a
debug :: FilePath -> Details.Details -> Build.Artifacts -> Task B.Builder debug :: FilePath -> Details.Details -> Build.Artifacts -> Task JS.GeneratedResult
debug root details (Build.Artifacts pkg ifaces roots modules) = debug root details (Build.Artifacts pkg ifaces roots modules) =
do do
loading <- loadObjects root details modules loading <- loadObjects root details modules
@ -46,20 +46,18 @@ debug root details (Build.Artifacts pkg ifaces roots modules) =
let mode = Mode.Dev (Just types) let mode = Mode.Dev (Just types)
let graph = objectsToGlobalGraph objects let graph = objectsToGlobalGraph objects
let mains = gatherMains pkg objects roots let mains = gatherMains pkg objects roots
let (JS.GeneratedResult state) = JS.generate mode graph mains return $ JS.generate mode graph mains
return state
dev :: FilePath -> Details.Details -> Build.Artifacts -> Task B.Builder dev :: FilePath -> Details.Details -> Build.Artifacts -> Task JS.GeneratedResult
dev root details (Build.Artifacts pkg _ roots modules) = dev root details (Build.Artifacts pkg _ roots modules) =
do do
objects <- finalizeObjects =<< loadObjects root details modules objects <- finalizeObjects =<< loadObjects root details modules
let mode = Mode.Dev Nothing let mode = Mode.Dev Nothing
let graph = objectsToGlobalGraph objects let graph = objectsToGlobalGraph objects
let mains = gatherMains pkg objects roots let mains = gatherMains pkg objects roots
let (JS.GeneratedResult state) = JS.generate mode graph mains return $ JS.generate mode graph mains
return state
prod :: FilePath -> Details.Details -> Build.Artifacts -> Task B.Builder prod :: FilePath -> Details.Details -> Build.Artifacts -> Task JS.GeneratedResult
prod root details (Build.Artifacts pkg _ roots modules) = prod root details (Build.Artifacts pkg _ roots modules) =
do do
objects <- finalizeObjects =<< loadObjects root details modules objects <- finalizeObjects =<< loadObjects root details modules
@ -67,8 +65,7 @@ prod root details (Build.Artifacts pkg _ roots modules) =
let graph = objectsToGlobalGraph objects let graph = objectsToGlobalGraph objects
let mode = Mode.Prod (Mode.shortenFieldNames graph) let mode = Mode.Prod (Mode.shortenFieldNames graph)
let mains = gatherMains pkg objects roots let mains = gatherMains pkg objects roots
let (JS.GeneratedResult state) = JS.generate mode graph mains return $ JS.generate mode graph mains
return state
repl :: FilePath -> Details.Details -> Bool -> Build.ReplArtifacts -> N.Name -> Task B.Builder repl :: FilePath -> Details.Details -> Bool -> Build.ReplArtifacts -> N.Name -> Task B.Builder
repl root details ansi (Build.ReplArtifacts home modules localizer annotations) name = repl root details ansi (Build.ReplArtifacts home modules localizer annotations) name =

View File

@ -23,6 +23,7 @@ import Generate.JavaScript.Expression qualified as Expr
import Generate.JavaScript.Functions qualified as Functions import Generate.JavaScript.Functions qualified as Functions
import Generate.JavaScript.Name qualified as JsName import Generate.JavaScript.Name qualified as JsName
import Generate.Mode qualified as Mode import Generate.Mode qualified as Mode
import Generate.SourceMap qualified as SourceMap
import Gren.Kernel qualified as K import Gren.Kernel qualified as K
import Gren.ModuleName qualified as ModuleName import Gren.ModuleName qualified as ModuleName
import Reporting.Doc qualified as D import Reporting.Doc qualified as D
@ -36,8 +37,10 @@ type Graph = Map.Map Opt.Global Opt.Node
type Mains = Map.Map ModuleName.Canonical Opt.Main type Mains = Map.Map ModuleName.Canonical Opt.Main
newtype GeneratedResult = GeneratedResult data GeneratedResult = GeneratedResult
{_source :: B.Builder} { _source :: B.Builder,
_sourceMap :: SourceMap.SourceMap
}
prelude :: B.Builder prelude :: B.Builder
prelude = prelude =
@ -56,7 +59,11 @@ generate mode (Opt.GlobalGraph graph _) mains =
<> stateToBuilder state <> stateToBuilder state
<> toMainExports mode mains <> toMainExports mode mains
<> "}(this.module ? this.module.exports : this));" <> "}(this.module ? this.module.exports : this));"
in GeneratedResult {_source = builder} sourceMap = SourceMap.generate $ stateToMappings state
in GeneratedResult
{ _source = builder,
_sourceMap = sourceMap
}
addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> Opt.Main -> State -> State addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> Opt.Main -> State -> State
addMain mode graph home _ state = addMain mode graph home _ state =
@ -114,6 +121,10 @@ stateToBuilder :: State -> B.Builder
stateToBuilder (State _ builder) = stateToBuilder (State _ builder) =
JS._code builder JS._code builder
stateToMappings :: State -> [JS.Mapping]
stateToMappings (State _ builder) =
JS._mappings builder
-- ADD DEPENDENCIES -- ADD DEPENDENCIES
addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State

View File

@ -3,6 +3,7 @@
module Generate.JavaScript.Builder module Generate.JavaScript.Builder
( Builder (..), ( Builder (..),
Mapping (..),
emptyBuilder, emptyBuilder,
stmtToBuilder, stmtToBuilder,
exprToBuilder, exprToBuilder,

View File

@ -0,0 +1,22 @@
{-# LANGUAGE OverloadedStrings #-}
module Generate.SourceMap (SourceMap, generate, sandwhich, toBytes) where
import Data.ByteString.Builder qualified as B
import Generate.JavaScript.Builder qualified as JS
newtype SourceMap = SourceMap B.Builder
generate :: [JS.Mapping] -> SourceMap
generate _ = SourceMap $ B.char7 '\0'
sandwhich :: SourceMap -> B.Builder -> B.Builder
sandwhich (SourceMap mapBytes) sourceBytes =
sourceBytes
<> "\n"
<> "//# sourceMappingURL=data:application/json;base64,"
<> mapBytes
toBytes :: SourceMap -> B.Builder
toBytes (SourceMap bytes) =
bytes

View File

@ -152,6 +152,7 @@ Common gren-common
Generate.JavaScript.Functions Generate.JavaScript.Functions
Generate.JavaScript.Name Generate.JavaScript.Name
Generate.Mode Generate.Mode
Generate.SourceMap
Nitpick.Debug Nitpick.Debug
Nitpick.PatternMatches Nitpick.PatternMatches
Optimize.Case Optimize.Case

View File

@ -20,7 +20,9 @@ import Directories qualified as Dirs
import File qualified import File qualified
import Generate qualified import Generate qualified
import Generate.Html qualified as Html import Generate.Html qualified as Html
import Generate.JavaScript qualified as JS
import Generate.Node qualified as Node import Generate.Node qualified as Node
import Generate.SourceMap qualified as SourceMap
import Gren.Details qualified as Details import Gren.Details qualified as Details
import Gren.ModuleName qualified as ModuleName import Gren.ModuleName qualified as ModuleName
import Gren.Platform qualified as Platform import Gren.Platform qualified as Platform
@ -64,7 +66,7 @@ run paths flags@(Flags _ _ maybeOutput report) =
Reporting.attemptWithStyle style Exit.makeToReport $ Reporting.attemptWithStyle style Exit.makeToReport $
case maybeRoot of case maybeRoot of
Just root -> runHelp root paths style flags Just root -> runHelp root paths style flags
Nothing -> return $ Left $ Exit.MakeNoOutline Nothing -> return $ Left Exit.MakeNoOutline
runHelp :: FilePath -> [FilePath] -> Reporting.Style -> Flags -> IO (Either Exit.Make ()) runHelp :: FilePath -> [FilePath] -> Reporting.Style -> Flags -> IO (Either Exit.Make ())
runHelp root paths style (Flags debug optimize maybeOutput _) = runHelp root paths style (Flags debug optimize maybeOutput _) =
@ -100,47 +102,47 @@ runHelp root paths style (Flags debug optimize maybeOutput _) =
return () return ()
(Platform.Browser, [name]) -> (Platform.Browser, [name]) ->
do do
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
generate style "index.html" (Html.sandwich name builder) (NE.List name []) writeToDisk style "index.html" (Html.sandwich name (SourceMap.sandwhich sourceMap source)) (NE.List name [])
(Platform.Node, [name]) -> (Platform.Node, [name]) ->
do do
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
generate style "app" (Node.sandwich name builder) (NE.List name []) writeToDisk style "app" (SourceMap.sandwhich sourceMap (Node.sandwich name source)) (NE.List name [])
(_, name : names) -> (_, name : names) ->
do do
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
generate style "index.js" builder (NE.List name names) writeToDisk style "index.js" (SourceMap.sandwhich sourceMap source) (NE.List name names)
Just DevStdOut -> Just DevStdOut ->
case getMains artifacts of case getMains artifacts of
[] -> [] ->
return () return ()
_ -> _ ->
do do
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
Task.io $ B.hPutBuilder IO.stdout builder Task.io $ B.hPutBuilder IO.stdout (SourceMap.sandwhich sourceMap source)
Just DevNull -> Just DevNull ->
return () return ()
Just (Exe target) -> Just (Exe target) ->
case platform of case platform of
Platform.Node -> do Platform.Node -> do
name <- hasOneMain artifacts name <- hasOneMain artifacts
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
generate style target (Node.sandwich name builder) (NE.List name []) writeToDisk style target (SourceMap.sandwhich sourceMap (Node.sandwich name source)) (NE.List name [])
_ -> do _ -> do
Task.throw Exit.MakeExeOnlyForNodePlatform Task.throw Exit.MakeExeOnlyForNodePlatform
Just (JS target) -> Just (JS target) ->
case getNoMains artifacts of case getNoMains artifacts of
[] -> do [] -> do
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
generate style target builder (Build.getRootNames artifacts) writeToDisk style target (SourceMap.sandwhich sourceMap source) (Build.getRootNames artifacts)
name : names -> name : names ->
Task.throw (Exit.MakeNonMainFilesIntoJavaScript name names) Task.throw (Exit.MakeNonMainFilesIntoJavaScript name names)
Just (Html target) -> Just (Html target) ->
case platform of case platform of
Platform.Browser -> do Platform.Browser -> do
name <- hasOneMain artifacts name <- hasOneMain artifacts
builder <- toBuilder root details desiredMode artifacts (JS.GeneratedResult source sourceMap) <- generate root details desiredMode artifacts
generate style target (Html.sandwich name builder) (NE.List name []) writeToDisk style target (Html.sandwich name (SourceMap.sandwhich sourceMap source)) (NE.List name [])
_ -> do _ -> do
Task.throw Exit.MakeHtmlOnlyForBrowserPlatform Task.throw Exit.MakeHtmlOnlyForBrowserPlatform
@ -251,22 +253,22 @@ getNoMain modules root =
Just _ -> Nothing Just _ -> Nothing
Nothing -> Just name Nothing -> Just name
-- GENERATE -- WRITE TO DISK
generate :: Reporting.Style -> FilePath -> B.Builder -> NE.List ModuleName.Raw -> Task () writeToDisk :: Reporting.Style -> FilePath -> B.Builder -> NE.List ModuleName.Raw -> Task ()
generate style target builder names = writeToDisk style target builder names =
Task.io $ Task.io $
do do
Dir.createDirectoryIfMissing True (FP.takeDirectory target) Dir.createDirectoryIfMissing True (FP.takeDirectory target)
File.writeBuilder target builder File.writeBuilder target builder
Reporting.reportGenerate style names target Reporting.reportGenerate style names target
-- TO BUILDER -- GENERATE
data DesiredMode = Debug | Dev | Prod data DesiredMode = Debug | Dev | Prod
toBuilder :: FilePath -> Details.Details -> DesiredMode -> Build.Artifacts -> Task B.Builder generate :: FilePath -> Details.Details -> DesiredMode -> Build.Artifacts -> Task JS.GeneratedResult
toBuilder root details desiredMode artifacts = generate root details desiredMode artifacts =
Task.mapError Exit.MakeBadGenerate $ Task.mapError Exit.MakeBadGenerate $
case desiredMode of case desiredMode of
Debug -> Generate.debug root details artifacts Debug -> Generate.debug root details artifacts