/
customizer_init.go
101 lines (84 loc) · 2.5 KB
/
customizer_init.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright (c) 2023, SailPoint Technologies, Inc. All rights reserved.
package connector
import (
"embed"
"errors"
"fmt"
"io/fs"
"os"
"path/filepath"
"strings"
"github.com/spf13/cobra"
)
//go:embed static/customizer/*
var customizerStaticDir embed.FS
const (
customizerDirName = "customizer"
customizerTemplatePath = "static/" + customizerDirName
)
func newCustomizerInitCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "init <customizer-name>",
Short: "Initialize new connector customizer project",
Long: `init sets up a new TypeScript project with sample connector customizer included for reference.`,
Example: "sail conn customizers init \"My Customizer\"",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
projName := args[0]
if projName == "" {
printError(cmd.ErrOrStderr(), errors.New("connector customizer name cannot be empty"))
return
}
if f, err := os.Stat(projName); err == nil && f.IsDir() && f.Name() == projName {
printError(cmd.ErrOrStderr(), fmt.Errorf("Error: project '%s' already exists.\n", projName))
return
}
if err := createDir(projName); err != nil {
_ = os.RemoveAll(projName)
printError(cmd.ErrOrStderr(), err)
return
}
err := fs.WalkDir(customizerStaticDir, customizerTemplatePath, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.Name() == customizerDirName {
return nil
}
if d.IsDir() {
if err := createDir(filepath.Join(projName, d.Name())); err != nil {
return err
}
} else {
fileName := filepath.Join(projName, strings.TrimPrefix(path, customizerTemplatePath))
data, err := customizerStaticDir.ReadFile(path)
if err != nil {
return err
}
if err := createFile(fileName, data); err != nil {
return err
}
}
if d.Name() == packageJsonName {
fileAbsPath, err := filepath.Abs(filepath.Join(projName, strings.TrimPrefix(path, customizerTemplatePath)))
if err != nil {
return err
}
if err := createFileFromTemplate(projName, d.Name(), fileAbsPath); err != nil {
return err
}
return nil
}
return nil
})
if err != nil {
_ = os.RemoveAll(projName)
printError(cmd.ErrOrStderr(), err)
return
}
printDir(cmd.OutOrStdout(), projName, 0)
_, _ = fmt.Fprintf(cmd.OutOrStdout(), "Successfully created project '%s'.\nRun `npm install` to install dependencies.\n", projName)
},
}
return cmd
}