@@ -39,6 +39,7 @@ import Spago.Command.Registry (RegistryInfoArgs, RegistryPackageSetsArgs, Regist
3939import Spago.Command.Registry as RegistryCmd
4040import Spago.Command.Repl as Repl
4141import Spago.Command.Run as Run
42+ import Spago.Command.Script as Script
4243import Spago.Command.Sources as Sources
4344import Spago.Command.Test as Test
4445import Spago.Command.Uninstall as Uninstall
@@ -145,6 +146,12 @@ type RunArgs =
145146 , pure :: Boolean
146147 }
147148
149+ type ScriptArgs =
150+ { source :: String
151+ , dependencies :: List String
152+ , packageSet :: Maybe String
153+ }
154+
148155type TestArgs =
149156 { selectedPackage :: Maybe String
150157 , output :: Maybe String
@@ -212,6 +219,7 @@ data Command a
212219 | RegistryTransfer RegistryTransferArgs
213220 | Repl ReplArgs
214221 | Run RunArgs
222+ | Script ScriptArgs
215223 | Sources SourcesArgs
216224 | Test TestArgs
217225 | Upgrade UpgradeArgs
@@ -270,6 +278,7 @@ argParser =
270278 )
271279 , commandParser " repl" (Repl <$> replArgsParser) " Start a REPL"
272280 , commandParser " run" (Run <$> runArgsParser) " Run the project"
281+ , commandParser " script" (Script <$> scriptArgsParser) " Run a standalone PureScript source file"
273282 , commandParser " sources" (Sources <$> sourcesArgsParser) " List all the source paths (globs) for the dependencies of the project"
274283 , commandParser " test" (Test <$> testArgsParser) " Test the project"
275284 , commandParser " uninstall" (Uninstall <$> uninstallArgsParser) " Remove dependencies from a package"
@@ -414,6 +423,14 @@ bundleArgsParser =
414423 , pure: Flags .pureLockfile
415424 }
416425
426+ scriptArgsParser :: Parser ScriptArgs
427+ scriptArgsParser =
428+ Optparse .fromRecord
429+ { source: Flags .scriptSource
430+ , dependencies: Flags .scriptDependencies
431+ , packageSet: Flags .maybeSetVersion
432+ }
433+
417434publishArgsParser :: Parser PublishArgs
418435publishArgsParser =
419436 Optparse .fromRecord
@@ -657,8 +674,66 @@ main = do
657674 let options = { depsOnly: false , pursArgs: List .toUnfoldable args.pursArgs, jsonErrors: false }
658675 built <- runSpago buildEnv (Build .run options)
659676 when built do
660- runEnv <- runSpago env (mkRunEnv args buildEnv)
677+ runEnv <- runSpago env (mkRunEnv args buildEnv Nothing )
678+ runSpago runEnv Run .run
679+ Script args -> do
680+ originalCwd <- Paths .cwd
681+ sourcePath <- Path .toAbsolute (Path .global args.source)
682+ tmpDir <- mkTemp
683+ FS .mkdirp tmpDir
684+ Paths .chdir tmpDir
685+ tmpRootPath <- Path .mkRoot tmpDir
686+ registryEnv <- mkRegistryEnv offline <#> Record .union { rootPath: tmpRootPath }
687+ setVersion <- parseSetVersion args.packageSet
688+ void $ runSpago registryEnv $ Init .run
689+ { setVersion
690+ , mode: Init.InitWorkspace { packageName: Just " script" }
691+ , useSolver: false
692+ }
693+ FS .copyTree
694+ { src: sourcePath
695+ , dst: tmpRootPath </> " src" </> (Script .moduleName <> " .purs" )
696+ }
697+ { env, fetchOpts } <- mkFetchEnv
698+ { packages: args.dependencies
699+ , selectedPackage: Nothing
700+ , ensureRanges: false
701+ , testDeps: false
702+ , isRepl: false
703+ , pure: false
704+ , migrateConfig: false
705+ , offline
706+ }
707+ dependencies <- runSpago env (Fetch .run fetchOpts)
708+ buildEnv <- runSpago env
709+ ( mkBuildEnv
710+ { backendArgs: mempty
711+ , output: Nothing
712+ , pedanticPackages: false
713+ , statVerbosity: Nothing
714+ , strict: Nothing
715+ }
716+ dependencies
717+ )
718+ built <- runSpago buildEnv (Build .run { depsOnly: false , pursArgs: mempty, jsonErrors: false })
719+ when built do
720+ let
721+ runArgs =
722+ { selectedPackage: Nothing
723+ , output: Nothing
724+ , pedanticPackages: false
725+ , pursArgs: mempty
726+ , backendArgs: mempty
727+ , execArgs: Nothing
728+ , main: Just Script .moduleName
729+ , ensureRanges: false
730+ , strict: Nothing
731+ , statVerbosity: Nothing
732+ , pure: false
733+ }
734+ runEnv <- runSpago env (mkRunEnv runArgs buildEnv (Just $ Path .toGlobal originalCwd))
661735 runSpago runEnv Run .run
736+ Paths .chdir originalCwd
662737 Test args@{ selectedPackage, pure } -> do
663738 { env, fetchOpts } <- mkFetchEnv { packages: mempty, selectedPackage, pure, ensureRanges: false , testDeps: false , isRepl: false , migrateConfig, offline }
664739 dependencies <- runSpago env (Fetch .run fetchOpts)
@@ -787,8 +862,8 @@ mkBundleEnv bundleArgs { dependencies, purs } = do
787862 let bundleEnv = { esbuild, logOptions, rootPath, workspace: newWorkspace, selected, bundleOptions, purs, dependencies }
788863 pure bundleEnv
789864
790- mkRunEnv :: forall a b . RunArgs -> Build.BuildEnv b -> Spago (Fetch.FetchEnv a ) (Run.RunEnv ())
791- mkRunEnv runArgs { dependencies, purs } = do
865+ mkRunEnv :: forall a b . RunArgs -> Build.BuildEnv b -> Maybe GlobalPath -> Spago (Fetch.FetchEnv a ) (Run.RunEnv ())
866+ mkRunEnv runArgs { dependencies, purs } executeDir = do
792867 { workspace, logOptions, rootPath } <- ask
793868 logDebug $ " Run args: " <> show runArgs
794869
@@ -824,7 +899,7 @@ mkRunEnv runArgs { dependencies, purs } = do
824899 runOptions =
825900 { moduleName
826901 , execArgs
827- , executeDir: Path .toGlobal rootPath
902+ , executeDir: fromMaybe ( Path .toGlobal rootPath) executeDir
828903 , successMessage: Nothing
829904 , failureMessage: " Running failed."
830905 }
0 commit comments