Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/js/devtools/scrapefuncs/main.go
2070 views
1
package main
2
3
import (
4
"flag"
5
"fmt"
6
"go/ast"
7
"go/parser"
8
"go/token"
9
"os"
10
"path/filepath"
11
"sort"
12
"strings"
13
14
"golang.org/x/exp/maps"
15
)
16
17
var (
18
dir string
19
out string
20
)
21
22
type DSLHelperFunc struct {
23
Name string
24
Description string
25
Signatures []string
26
}
27
28
var pkg2NameMapping = map[string]string{
29
"code": "Code Protocol",
30
"javascript": "JavaScript Protocol",
31
"global": "Javascript Runtime",
32
"compiler": "Javascript Runtime",
33
"flow": "Template Flow",
34
}
35
36
var preferredOrder = []string{"Javascript Runtime", "Template Flow", "Code Protocol", "JavaScript Protocol"}
37
38
func main() {
39
flag.StringVar(&dir, "dir", "pkg/", "directory to process")
40
flag.StringVar(&out, "out", "", "output markdown file with helper file declarations")
41
flag.Parse()
42
43
dirList := []string{}
44
45
if err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error {
46
if err != nil {
47
return err
48
}
49
50
if d.IsDir() {
51
dirList = append(dirList, path)
52
}
53
return nil
54
}); err != nil {
55
panic(err)
56
}
57
58
dslHelpers := map[string][]DSLHelperFunc{}
59
60
//for _, pkg := range pkgs {
61
for _, dir := range dirList {
62
fset := token.NewFileSet()
63
list, err := os.ReadDir(dir)
64
if err != nil {
65
fmt.Println(err)
66
return
67
}
68
69
for _, f := range list {
70
if f.IsDir() {
71
continue
72
}
73
if !strings.HasSuffix(f.Name(), ".go") {
74
continue
75
}
76
77
astFile, err := parser.ParseFile(fset, filepath.Join(dir, f.Name()), nil, parser.AllErrors|parser.SkipObjectResolution)
78
if err != nil {
79
fmt.Println(err)
80
return
81
}
82
83
ast.Inspect(astFile, func(n ast.Node) bool {
84
switch x := n.(type) {
85
case *ast.CallExpr:
86
if sel, ok := x.Fun.(*ast.SelectorExpr); ok {
87
if sel.Sel.Name == "RegisterFuncWithSignature" {
88
hf := DSLHelperFunc{}
89
for _, arg := range x.Args {
90
if kv, ok := arg.(*ast.CompositeLit); ok {
91
for _, elt := range kv.Elts {
92
if kv, ok := elt.(*ast.KeyValueExpr); ok {
93
key := kv.Key.(*ast.Ident).Name
94
switch key {
95
case "Name":
96
hf.Name = strings.Trim(kv.Value.(*ast.BasicLit).Value, `"`)
97
case "Description":
98
hf.Description = strings.Trim(kv.Value.(*ast.BasicLit).Value, `"`)
99
case "Signatures":
100
if comp, ok := kv.Value.(*ast.CompositeLit); ok {
101
for _, signature := range comp.Elts {
102
hf.Signatures = append(hf.Signatures, strings.Trim(signature.(*ast.BasicLit).Value, `"`))
103
}
104
}
105
}
106
}
107
}
108
}
109
}
110
if hf.Name != "" {
111
identifier := pkg2NameMapping[astFile.Name.Name]
112
if identifier == "" {
113
identifier = astFile.Name.Name + " (" + dir + ")"
114
}
115
116
if dslHelpers[identifier] == nil {
117
dslHelpers[identifier] = []DSLHelperFunc{}
118
}
119
dslHelpers[identifier] = append(dslHelpers[identifier], hf)
120
}
121
}
122
}
123
}
124
return true
125
})
126
}
127
}
128
129
// DSL Helper functions stats
130
for pkg, funcs := range dslHelpers {
131
fmt.Printf("Found %d DSL Helper functions in package %s\n", len(funcs), pkg)
132
}
133
134
// Generate Markdown tables with ## as package name
135
if out != "" {
136
var sb strings.Builder
137
sb.WriteString(`---
138
title: "Javascript Helper Functions"
139
description: "Available JS Helper Functions that can be used in global js runtime & protocol specific helpers."
140
icon: "function"
141
iconType: "solid"
142
---
143
144
145
`)
146
147
actualKeys := maps.Keys(dslHelpers)
148
sort.Slice(actualKeys, func(i, j int) bool {
149
for _, preferredKey := range preferredOrder {
150
if actualKeys[i] == preferredKey {
151
return true
152
}
153
if actualKeys[j] == preferredKey {
154
return false
155
}
156
}
157
return actualKeys[i] < actualKeys[j]
158
})
159
160
for _, v := range actualKeys {
161
pkg := v
162
funcs := dslHelpers[pkg]
163
sb.WriteString("## " + pkg + "\n\n")
164
sb.WriteString("| Name | Description | Signatures |\n")
165
sb.WriteString("|------|-------------|------------|\n")
166
for _, f := range funcs {
167
sigSlice := []string{}
168
for _, sig := range f.Signatures {
169
sigSlice = append(sigSlice, "`"+sig+"`")
170
}
171
sb.WriteString(fmt.Sprintf("| %s | %s | %s |\n", f.Name, f.Description, strings.Join(sigSlice, ", ")))
172
}
173
sb.WriteString("\n")
174
}
175
176
if err := os.WriteFile(out, []byte(sb.String()), 0644); err != nil {
177
fmt.Println(err)
178
return
179
}
180
}
181
}
182
183