diff --git a/cmd/cdnmirror/main.go b/cmd/cdnmirror/main.go index c98d604..266ab79 100644 --- a/cmd/cdnmirror/main.go +++ b/cmd/cdnmirror/main.go @@ -14,7 +14,6 @@ import ( "github.com/evanw/esbuild/pkg/api" "github.com/pkg/errors" "github.com/rebuy-de/rebuy-go-sdk/v5/pkg/cmdutil" - "github.com/rebuy-de/rebuy-go-sdk/v5/pkg/webutil" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -30,22 +29,34 @@ func main() { func NewRootCommand() *cobra.Command { return cmdutil.New( - "cdnmirror SOURCE_NAME..", "Downloads assets from CDNs so the server can serve them directly.", + "cdnmirror", "Downloads assets from CDNs so the server can serve them directly.", cmdutil.WithLogVerboseFlag(), - cmdutil.WithRun(Generate), + cmdutil.WithRunner(new(Generate)), ) } -func Generate(ctx context.Context, cmd *cobra.Command, args []string) { +type Generate struct { + Source string + Target string + Minify string +} + +func (g *Generate) Bind(cmd *cobra.Command) error { + cmd.PersistentFlags().StringVar( + &g.Source, "source", "", `URL to the original CDN.`) + cmd.PersistentFlags().StringVar( + &g.Target, "target", "", `Name of the target file in assets/cdnmirror`) + cmd.PersistentFlags().StringVar( + &g.Minify, "minify", "", `Minify file with given type; allowed values: js`) + return nil +} + +func (g *Generate) Run(ctx context.Context) error { err := os.MkdirAll(targetPathPrefix, 0755) cmdutil.Must(err) writeGitignore() - - for _, name := range args { - source := resolve(name) - download(source) - } + return g.download() } func writeGitignore() { @@ -59,40 +70,28 @@ func writeGitignore() { cmdutil.Must(err) } -func resolve(name string) webutil.CDNMirrorSource { - switch name { - case "@hotwired/turbo": - return webutil.CDNMirrorSourceHotwiredTurbo() - case "bootstrap": - return webutil.CDNMirrorSourceBootstrap() - case "font-awesome-sprites": - return webutil.CDNMirrorSourceFontAwesomeSprites() - case "bulma": - return webutil.CDNMirrorSourceBulma() - default: - cmdutil.Must(errors.Errorf("invalid source name")) - return webutil.CDNMirrorSource{} - } -} +func (g *Generate) download() error { + targetFile := filepath.FromSlash(path.Join(targetPathPrefix, g.Target)) -func download(source webutil.CDNMirrorSource) { - targetFile := filepath.FromSlash(path.Join(targetPathPrefix, source.Target)) - - resp, err := http.Get(source.URL) - cmdutil.Must(err) + resp, err := http.Get(g.Source) + if err != nil { + return fmt.Errorf("request source: %w", err) + } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - cmdutil.Must(fmt.Errorf(resp.Status)) + return fmt.Errorf(resp.Status) } body, err := io.ReadAll(resp.Body) - cmdutil.Must(err) + if err != nil { + return fmt.Errorf("read source: %w", err) + } var code string - switch source.Minify { - case webutil.CDNMirrorMinifyJS: + switch g.Minify { + case "js": result := api.Transform(string(body), api.TransformOptions{ MinifyWhitespace: true, MinifyIdentifiers: true, @@ -103,14 +102,22 @@ func download(source webutil.CDNMirrorSource) { } code = string(result.Code) - default: + case "": code = string(body) + default: + return fmt.Errorf("invalid minify option %q", g.Minify) } f, err := os.Create(targetFile) - cmdutil.Must(err) + if err != nil { + return fmt.Errorf("create target file: %w", err) + } defer f.Close() _, err = io.WriteString(f, code) - cmdutil.Must(err) + if err != nil { + return fmt.Errorf("write file: %w", err) + } + + return nil } diff --git a/pkg/webutil/cdnmirror.go b/pkg/webutil/cdnmirror.go deleted file mode 100644 index 25031b1..0000000 --- a/pkg/webutil/cdnmirror.go +++ /dev/null @@ -1,43 +0,0 @@ -package webutil - -type CDNMirrorSource struct { - URL string - Target string - Minify CDNMirrorMinifier -} - -type CDNMirrorMinifier string - -const ( - CDNMirrorMinifyJS = "js" - CDNMirrorMinifyCSS = "css" -) - -func CDNMirrorSourceHotwiredTurbo() CDNMirrorSource { - return CDNMirrorSource{ - URL: "https://unpkg.com/@hotwired/turbo@7.1.0/dist/turbo.es2017-umd.js", - Target: "hotwired-turbo-7.1.0-min.js", - Minify: CDNMirrorMinifyJS, - } -} - -func CDNMirrorSourceBootstrap() CDNMirrorSource { - return CDNMirrorSource{ - URL: "https://unpkg.com/bootstrap@5.1.3/dist/css/bootstrap.min.css", - Target: "bootstrap-5.1.3-min.css", - } -} - -func CDNMirrorSourceFontAwesomeSprites() CDNMirrorSource { - return CDNMirrorSource{ - URL: "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.2/sprites/solid.svg", - Target: "font-awesome-6.1.2-sprites-solid.svg", - } -} - -func CDNMirrorSourceBulma() CDNMirrorSource { - return CDNMirrorSource{ - URL: "https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css", - Target: "bulma-0.7.4.min.css", - } -}