mirror of https://github.com/grafana/grafana.git
57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
|
package generators
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"cuelang.org/go/cue"
|
||
|
"cuelang.org/go/cue/cuecontext"
|
||
|
"github.com/grafana/cuetsy"
|
||
|
"github.com/grafana/cuetsy/ts"
|
||
|
"github.com/grafana/cuetsy/ts/ast"
|
||
|
)
|
||
|
|
||
|
type TSConfig struct {
|
||
|
CuetsyConfig *cuetsy.Config
|
||
|
IsGroup bool
|
||
|
RootName string
|
||
|
}
|
||
|
|
||
|
// GenerateTypesTS generates native TypeScript types and defaults corresponding to
|
||
|
// the provided Schema.
|
||
|
func GenerateTypesTS(v cue.Value, cfg *TSConfig) (*ast.File, error) {
|
||
|
if cfg == nil {
|
||
|
return nil, fmt.Errorf("configuration cannot be empty")
|
||
|
}
|
||
|
if cfg.CuetsyConfig == nil {
|
||
|
cfg.CuetsyConfig = &cuetsy.Config{
|
||
|
Export: true,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Thema #schema was a unification between the schema and cue.TopKind(_). For any reason, without this unification,
|
||
|
// cuetsy fails finding some enums ¯\_(ツ)_/¯.
|
||
|
oldSchema := cuecontext.New().CompileBytes([]byte("_"))
|
||
|
schdef := v.LookupPath(cue.ParsePath("lineage.schemas[0].schema")).Unify(oldSchema)
|
||
|
tf, err := cuetsy.GenerateAST(schdef, *cfg.CuetsyConfig)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("generating TS for child elements of schema failed: %w", err)
|
||
|
}
|
||
|
|
||
|
file := &ts.File{
|
||
|
Nodes: tf.Nodes,
|
||
|
}
|
||
|
|
||
|
if !cfg.IsGroup {
|
||
|
top, err := cuetsy.GenerateSingleAST(cfg.RootName, schdef, cuetsy.TypeInterface)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("generating TS for schema root failed: %w", err)
|
||
|
}
|
||
|
file.Nodes = append(file.Nodes, top.T)
|
||
|
if top.D != nil {
|
||
|
file.Nodes = append(file.Nodes, top.D)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return file, nil
|
||
|
}
|