Skip to content
This repository was archived by the owner on Apr 30, 2025. It is now read-only.

Commit 40bb73f

Browse files
committed
Fix override parent type values with defaults
1 parent 792ffe7 commit 40bb73f

File tree

3 files changed

+72
-49
lines changed

3 files changed

+72
-49
lines changed

analyze.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func hasOverrideValues(v cue.Value, kinds ...TSType) bool {
130130
}
131131

132132
defaultOp, _ := values[1].Expr()
133-
if defaultOp == cue.AndOp {
133+
if defaultOp == cue.AndOp || defaultOp == cue.OrOp {
134134
return false
135135
}
136136

generator.go

Lines changed: 27 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -506,10 +506,11 @@ func (g *generator) genInterface(name string, v cue.Value) []ts.Decl {
506506
}
507507

508508
sub := nolit.LookupPath(cue.MakePath(sel))
509-
// Theoretically, lattice equality can be defined as bijective
510-
// subsumption. In practice, Subsume() seems to ignore optional
511-
// fields, and Equals() doesn't. So, use Equals().
512-
if sub.Exists() && sub.Equals(iter.Value()) {
509+
op, _ := iter.Value().Expr()
510+
// Also we need to check if the sub operator to discard the one that have validators and if it has a default
511+
subOp, _ := sub.Expr()
512+
_, def := iter.Value().Default()
513+
if sub.Exists() && sub.Equals(iter.Value()) && (subOp == cue.AndOp || op != cue.AndOp || !def) {
513514
continue
514515
}
515516
}
@@ -656,52 +657,14 @@ func (g *generator) genInterfaceField(v cue.Value) (*typeRef, error) {
656657
return g.genEnumReference(v)
657658
}
658659

659-
// One path for when there's a ref to a cuetsy node, and a separate one otherwise
660-
if !containsCuetsyReference(v) {
661-
tref.T, err = tsprintField(v, true)
662-
if err != nil {
660+
tref.T, err = tsprintField(v, true)
661+
if err != nil {
662+
if !containsCuetsyReference(v) {
663663
g.addErr(valError(v, "could not generate field: %w", err))
664664
return nil, err
665665
}
666-
} else {
667-
expr, err := tsprintField(v, true)
668-
if err != nil {
669-
g.addErr(err)
670-
return nil, nil
671-
}
672-
tref.T = expr
673-
674-
// Deconstruct the field's expressions.
675-
// conjuncts := appendSplit(nil, cue.AndOp, v)
676-
677-
// var expr ts.Expr
678-
//
679-
// for _, cv := range conjuncts {
680-
// disjuncts := appendSplit(nil, cue.OrOp, cv)
681-
// for i, dv := range disjuncts {
682-
// if _, r := dv.Reference(); len(r) == 0 {
683-
// disjuncts[i] = dv.Eval()
684-
// }
685-
// }
686-
// switch len(disjuncts) {
687-
// case 0:
688-
// // conjunct eliminated - need more preprocessing to actually make this possible
689-
// panic("TODO, unreachable")
690-
// case 1:
691-
// err := disjuncts[0].Err()
692-
// if err != nil {
693-
// g.addErr(valError(v, "invalid value"))
694-
// return nil
695-
// }
696-
// expr, err = tsprintField(disjuncts[0])
697-
// if err != nil {
698-
// g.addErr(valError(v, "invalid value"))
699-
// return nil
700-
// }
701-
// default:
702-
// // TODO create disjunction handler
703-
// }
704-
// }
666+
g.addErr(err)
667+
return nil, nil
705668
}
706669

707670
exists, defExpr, err := tsPrintDefault(v)
@@ -859,6 +822,7 @@ func tsPrintDefault(v cue.Value) (bool, ts.Expr, error) {
859822
// }
860823

861824
if ok {
825+
d = getTypeDefaultOverride(d)
862826
expr, err := tsprintField(d, false)
863827
if err != nil {
864828
return false, nil, err
@@ -879,9 +843,22 @@ func tsPrintDefault(v cue.Value) (bool, ts.Expr, error) {
879843

880844
return true, expr, nil
881845
}
846+
882847
return false, nil, nil
883848
}
884849

850+
func getTypeDefaultOverride(v cue.Value) cue.Value {
851+
op, expr := v.Expr()
852+
if op != cue.AndOp || len(expr) < 2 {
853+
return v
854+
}
855+
856+
if def, ok := expr[1].Default(); ok {
857+
return def
858+
}
859+
return v
860+
}
861+
885862
// Render a string containing a Typescript semantic equivalent to the provided
886863
// Value for placement in a single field, if possible.
887864
func tsprintField(v cue.Value, isType bool) (ts.Expr, error) {
@@ -1198,7 +1175,7 @@ func refAsInterface(v cue.Value) (ts.Expr, error) {
11981175
// attribute. The variadic parameter determines which kinds will be treated as
11991176
// permissible. By default, all kinds are permitted.
12001177
//
1201-
// An nil expr indicates a reference is not allowable, including the case
1178+
// A nil expr indicates a reference is not allowable, including the case
12021179
// that the provided Value is not actually a reference. A non-nil error
12031180
// indicates a deeper problem.
12041181
func referenceValueAs(v cue.Value, kinds ...TSType) (ts.Expr, error) {
@@ -1269,6 +1246,8 @@ func referenceValueAs(v cue.Value, kinds ...TSType) (ts.Expr, error) {
12691246
Sel: ts.Ident(dstr),
12701247
}, nil
12711248
}
1249+
1250+
return ts.Ident(dstr), nil
12721251
default:
12731252
return nil, valError(v, "unknown selector subject type %T, cannot translate path %s", dvals[0].Source(), v.Path().String())
12741253
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
-- cue --
2+
3+
#Type: "a" | "b" | "c" @cuetsy(kind="type")
4+
5+
#Base: {
6+
valueType: #Type
7+
defaultType: #Type
8+
} @cuetsy(kind="interface")
9+
10+
#StructWithDefaults: {
11+
#Base
12+
baseType: #Type
13+
valueType: #Type
14+
defaultType: #Type | (*"a" | _)
15+
noOverrideDefaultType: #Type | (*"b" | _)
16+
noOverrideType: #Type
17+
defaultString: #Type | *"invalid"
18+
defaultNumber: #Type | "something" | *34
19+
} @cuetsy(kind="interface")
20+
21+
-- ts --
22+
23+
export type Type = ('a' | 'b' | 'c');
24+
25+
export interface Base {
26+
defaultType: Type;
27+
valueType: Type;
28+
}
29+
30+
export interface StructWithDefaults extends Base {
31+
baseType: Type;
32+
defaultNumber: Type;
33+
defaultString: Type;
34+
defaultType: Type;
35+
noOverrideDefaultType: Type;
36+
noOverrideType: Type;
37+
}
38+
39+
export const defaultStructWithDefaults: Partial<StructWithDefaults> = {
40+
defaultNumber: 34,
41+
defaultString: 'invalid',
42+
defaultType: 'a',
43+
noOverrideDefaultType: 'b',
44+
};

0 commit comments

Comments
 (0)