Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/Terrabuild.Configuration.Tests/TestFiles/WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ extension dotnet {

extension docker { }

extension npmext {
container = "node:20"
script = "scripts/npm.fsx"
}

# multiple comments at the end
# multiple comments at the end

Expand Down
8 changes: 7 additions & 1 deletion src/Terrabuild.Configuration.Tests/Workspace.fs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ let parseWorkspace() =
Variables = Set.empty
Script = None
Defaults = Map.empty }
let extNpm =
{ Container = Some "node:20"
Variables = Set.empty
Script = Some "scripts/npm.fsx"
Defaults = Map.empty }

{ Workspace = { Space = Some "magnusopera/default"; Ignores = Set ["**/node_modules"] }
Targets = Map [ "build", targetBuild
Expand All @@ -44,7 +49,8 @@ let parseWorkspace() =
Configurations = Map [ "release", envRelease
"dummy", envDummy ]
Extensions = Map [ "dotnet", extDotnet
"docker", extDocker ] }
"docker", extDocker
"npmext", extNpm ] }


let content = File.ReadAllText("TestFiles/WORKSPACE")
Expand Down
31 changes: 23 additions & 8 deletions src/Terrabuild/Core/Configuration.fs
Original file line number Diff line number Diff line change
Expand Up @@ -174,14 +174,29 @@ let read (options: ConfigOptions.Options) =
{ evaluationContext with Eval.Variables = evaluationContext.Variables |> Map.addMap configVariables }


let extensions =
Extensions.systemExtensions
|> Map.addMap workspaceConfig.Extensions

let scripts =
extensions
|> Map.map (fun _ _ -> None)
|> Map.map Extensions.lazyLoadScript
let extensions, scripts =
// load system extensions
let sysScripts =
Extensions.systemExtensions
|> Map.map (fun _ _ -> None)
|> Map.map Extensions.lazyLoadScript

// load user extension
let usrScripts =
workspaceConfig.Extensions
|> Map.map (fun _ ext ->
match ext.Script with
| Some script -> script |> FS.workspaceRelative options.Workspace "" |> Some
| _ -> None)
|> Map.map Extensions.lazyLoadScript

let extensions =
Extensions.systemExtensions
|> Map.addMap workspaceConfig.Extensions

let scripts = sysScripts |> Map.addMap usrScripts

extensions, scripts


// this is the first stage: load project and mostly get dependencies references
Expand Down
9 changes: 5 additions & 4 deletions src/Terrabuild/Helpers/Extensions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ let terrabuildExtensibility =
let lazyLoadScript (name: string) (script: string option) =
let initScript () =
match script with
| Some script -> loadScript [ terrabuildExtensibility ] script
| Some script ->
loadScript [ terrabuildExtensibility ] script
| _ ->
match Terrabuild.Extensions.Factory.systemScripts |> Map.tryFind name with
| Some sysTpe -> Script(sysTpe)
Expand All @@ -38,9 +39,9 @@ let lazyLoadScript (name: string) (script: string option) =
lazy(initScript())

let getScript (extension: string) (scripts: Map<string, Lazy<Script>>) =
match scripts |> Map.tryFind extension with
| None -> None
| Some script -> script.Value |> Some
scripts
|> Map.tryFind extension
|> Option.map (fun script -> script.Value)

let invokeScriptMethod<'r> (method: string) (args: Value) (script: Script option) =
match script with
Expand Down
Loading