esr/internal/config/config.go
2024-10-09 14:22:28 -04:00

125 lines
2.8 KiB
Go

package config
import (
"os"
"path/filepath"
"gopkg.in/yaml.v2"
)
type Common struct {
Minify bool `yaml:"minify,omitempty"`
MinifyWhitespace bool `yaml:"minifyWhitespace"`
MinifyIdentifiers bool `yaml:"minifyIdentifiers"`
Bundle bool `yaml:"bundle"`
Sourcemap bool `yaml:"sourcemap"`
Platform string `yaml:"platform"`
Format string `yaml:"format"`
Outdir string `yaml:"outdir"`
JSX string `yaml:"jsx"`
JSXFactory string `yaml:"jsxFactory"`
JSXImportSource string `yaml:"jsxImportSource"`
Loader map[string]string `yaml:"loader,omitempty"`
External []string `yaml:"external,omitempty"`
}
type Config struct {
Serve *ServeConfig `yaml:"serve,omitempty"`
Build *BuildConfig `yaml:"build,omitempty"`
Run *RunConfig `yaml:"run,omitempty"`
Watch *WatchConfig `yaml:"watch,omitempty"`
Common `yaml:",inline"`
}
type ServeConfig struct {
Html string `yaml:"html"`
Port int `yaml:"port"`
Common `yaml:",inline"`
}
type BuildConfig struct {
Common `yaml:",inline"`
}
type RunConfig struct {
Runtime string `yaml:"runtime"`
Common `yaml:",inline"`
}
type WatchConfig struct {
Paths []string `yaml:"paths"`
}
func GetDefaultConfig() *Config {
defaultConfig := Common{
Minify: false,
MinifyWhitespace: false,
MinifyIdentifiers: false,
Bundle: true,
Sourcemap: true,
Platform: "browser",
Format: "esm",
Outdir: "public",
JSX: "automatic",
JSXFactory: "React.createElement",
JSXImportSource: "",
Loader: map[string]string{},
External: []string{},
}
return &Config{
Serve: &ServeConfig{
Html: "public/index.html",
Port: 1234,
Common: defaultConfig,
},
Build: &BuildConfig{
Common: defaultConfig,
},
Run: &RunConfig{
Runtime: "node",
Common: defaultConfig,
},
Watch: &WatchConfig{
Paths: []string{"src/**/*.{ts,tsx,js,jsx}"},
},
Common: defaultConfig,
}
}
func ReadConfig(filename string) (*Config, error) {
absPath, err := filepath.Abs(filename)
if err != nil {
return nil, err
}
data, err := os.ReadFile(absPath)
if err != nil {
return nil, err
}
config := GetDefaultConfig()
if err := yaml.Unmarshal(data, &config.Build); err != nil {
return nil, err
}
if err := yaml.Unmarshal(data, &config.Serve); err != nil {
return nil, err
}
if err := yaml.Unmarshal(data, &config.Run); err != nil {
return nil, err
}
if err := yaml.Unmarshal(data, &config.Watch); err != nil {
return nil, err
}
if err := yaml.Unmarshal(data, &config); err != nil {
return nil, err
}
return config, nil
}