From c119b17908bf0b1d863b1b439d7da755b6913bad Mon Sep 17 00:00:00 2001 From: sam boyer Date: Thu, 19 May 2022 06:21:05 -0400 Subject: [PATCH] ts/ast: Add regexp Ident validator --- generator.go | 7 ++++++- ts/ast/ast.go | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/generator.go b/generator.go index 53f6808..45b1088 100644 --- a/generator.go +++ b/generator.go @@ -444,10 +444,15 @@ func orEnum(v cue.Value) ([]ts.Expr, error) { return nil, valError(v, "typescript enums may only be generated from a disjunction of concrete strings or numbers") } + id := ts.Ident(strings.Title(text)) + if id.Validate() != nil { + return nil, valError(v, "title casing of enum member %q produces an invalid typescript identifier; memberNames must be explicitly given in @cuetsy attribute", text) + } + fields = append(fields, tsast.AssignExpr{ // Simple mapping of all enum values (which we are assuming are in // lowerCamelCase) to corresponding CamelCase - Name: ts.Ident(strings.Title(text)), + Name: id, Value: tsprintConcrete(dv), }) } diff --git a/ts/ast/ast.go b/ts/ast/ast.go index 3f33683..989c28b 100644 --- a/ts/ast/ast.go +++ b/ts/ast/ast.go @@ -1,7 +1,9 @@ package ast import ( + "errors" "fmt" + "regexp" "strings" ) @@ -96,6 +98,10 @@ type Ident struct { As string } +var identRegexp = regexp.MustCompile("^[a-zA-Z_$][0-9a-zA-Z_$]*$") + +var ErrBadIdent = errors.New("typescript idents must contain only alphanumeric characters") + func (i Ident) ident() {} func (i Ident) expr() {} func (i Ident) String() string { @@ -107,6 +113,16 @@ func (i Ident) String() string { return n } +func (i Ident) Validate() error { + if !identRegexp.MatchString(i.Name) { + return ErrBadIdent + } + if i.As != "" && !identRegexp.MatchString(i.Name) { + return ErrBadIdent + } + return nil +} + func None() Expr { return Ident{} }