code: func SourceFile(ctx context.Context, path string) (map[string]expand.Variable, error) {
  	f, err := os.Open(path)
  	if err != nil {
  		return nil, fmt.Errorf("could not open: %v", err)
  	}
  	defer f.Close()
  	file, err := syntax.NewParser().Parse(f, path)
  	if err != nil {
  		return nil, fmt.Errorf("could not parse: %v", err)
  	}
  	return SourceNode(ctx, file)
  }
docs: // SourceFile sources a shell file from disk and returns the variables
  // declared in it. It is a convenience function that uses a default shell
  // parser, parses a file from disk, and calls SourceNode.
  //
  // This function should be used with caution, as it can interpret arbitrary
  // code. Untrusted shell programs shoudn't be sourced outside of a sandbox
  // environment.