github.com/corylanou/buffalo@v0.8.0/generators/assets/webpack/webpack.go (about)

     1  package webpack
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  
     9  	"github.com/gobuffalo/buffalo/generators"
    10  	"github.com/gobuffalo/buffalo/generators/assets"
    11  	"github.com/gobuffalo/makr"
    12  )
    13  
    14  var logo = &makr.RemoteFile{
    15  	File:       makr.NewFile("assets/images/logo.svg", ""),
    16  	RemotePath: assets.LogoURL,
    17  }
    18  
    19  // BinPath is the path to the local install of webpack
    20  var BinPath = filepath.Join("node_modules", ".bin", "webpack")
    21  
    22  // New webpack generator
    23  func New(data makr.Data) (*makr.Generator, error) {
    24  	g := makr.New()
    25  
    26  	// if there's no npm, return!
    27  	_, err := exec.LookPath("npm")
    28  	if err != nil {
    29  		fmt.Println("Could not find npm/node. Skipping webpack generation.")
    30  		return g, nil
    31  	}
    32  
    33  	command := "npm"
    34  	args := []string{"install", "--save"}
    35  	// If yarn.lock exists then yarn is used by default (generate webpack)
    36  	_, ferr := os.Stat("yarn.lock")
    37  	if ferr == nil {
    38  		data["withYarn"] = true
    39  	}
    40  
    41  	if _, ok := data["withYarn"]; ok {
    42  		command = "yarn"
    43  		args = []string{"add"}
    44  		err := generateYarn(data)
    45  		if err != nil {
    46  			return g, err
    47  		}
    48  	}
    49  
    50  	g.Add(logo)
    51  
    52  	files, err := generators.Find(filepath.Join("assets", "webpack"))
    53  	if err != nil {
    54  		return g, err
    55  	}
    56  
    57  	for _, f := range files {
    58  		g.Add(makr.NewFile(f.WritePath, f.Body))
    59  	}
    60  
    61  	c := makr.NewCommand(exec.Command(command, "init", "-y"))
    62  	g.Add(c)
    63  
    64  	modules := []string{"webpack@~2.3.0", "sass-loader", "css-loader", "style-loader", "node-sass",
    65  		"babel-loader", "extract-text-webpack-plugin", "babel", "babel-core", "url-loader", "file-loader",
    66  		"jquery", "bootstrap", "path", "font-awesome", "npm-install-webpack-plugin", "jquery-ujs",
    67  		"copy-webpack-plugin", "expose-loader",
    68  	}
    69  
    70  	args = append(args, modules...)
    71  	g.Add(makr.NewCommand(exec.Command(command, args...)))
    72  	return g, nil
    73  }
    74  
    75  func generateYarn(data makr.Data) error {
    76  	// if there's no yarn, install it!
    77  	_, err := exec.LookPath("yarn")
    78  	// A new makr is necessary to have yarn available in path
    79  	if err != nil {
    80  		yg := makr.New()
    81  		yargs := []string{"install", "-g", "yarn"}
    82  		yg.Add(makr.NewCommand(exec.Command("npm", yargs...)))
    83  		err = yg.Run(".", data)
    84  		if err != nil {
    85  			return err
    86  		}
    87  	}
    88  	return nil
    89  }