Skip to content

Commit cec7bad

Browse files
committed
fix: stable custom metadata field ordering and clean display
- Change registerMetadata to accept goja.Value directly to preserve JavaScript object key order - Disable SetAutoWrapText to prevent line combining and spacing issues - Custom fields now display in definition order without extra spaces
1 parent 84f6f3d commit cec7bad

3 files changed

Lines changed: 48 additions & 33 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
## [0.6.3] - 2025-10-22
10+
## [0.6.4] - 2025-01-07
11+
12+
### Fixed
13+
- Custom metadata field ordering now stable and consistent across runs
14+
- Removed extra leading spaces from custom field values in table display
15+
16+
## [0.6.3] - 2025-01-07
1117

1218
### Changed
1319
- **Enhanced metadata display in `comet list --details`**

internal/cli/print.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func PrintStacksList(stacks *schema.Stacks, details bool) {
5454
headers = append(headers, "path")
5555

5656
table.SetHeader(headers)
57-
table.SetAutoWrapText(true)
57+
table.SetAutoWrapText(false)
5858
table.SetRowLine(true)
5959
table.SetColWidth(20)
6060
table.SetAutoMergeCells(false)
@@ -96,19 +96,18 @@ func PrintStacksList(stacks *schema.Stacks, details bool) {
9696
if i+1 < len(orderedSlice) {
9797
k := fmt.Sprintf("%v", orderedSlice[i])
9898
v := orderedSlice[i+1]
99-
line := fmt.Sprintf("%-20s", fmt.Sprintf("%s=%v", k, v))
100-
customPairs = append(customPairs, line)
99+
customPairs = append(customPairs, fmt.Sprintf("%s=%v", k, v))
101100
}
102101
}
103102
} else if customMap, ok := s.Metadata.Custom.(map[string]any); ok {
104103
// Fallback to map (unordered)
105104
for k, v := range customMap {
106-
line := fmt.Sprintf("%-20s", fmt.Sprintf("%s=%v", k, v))
107-
customPairs = append(customPairs, line)
105+
customPairs = append(customPairs, fmt.Sprintf("%s=%v", k, v))
108106
}
109107
}
110108

111109
if len(customPairs) > 0 {
110+
// Join without manual padding - let tablewriter handle it
112111
custom = strings.Join(customPairs, "\n")
113112
}
114113
}

internal/parser/js/js.go

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -194,46 +194,56 @@ func (vm *jsinterpreter) registerStack(stack *schema.Stack) func(string, map[str
194194
}
195195
}
196196

197-
func (vm *jsinterpreter) registerMetadata(stack *schema.Stack) func(map[string]interface{}) {
198-
return func(meta map[string]interface{}) {
197+
func (vm *jsinterpreter) registerMetadata(stack *schema.Stack) func(goja.Value) {
198+
return func(metaValue goja.Value) {
199199
log.Debug("register metadata", "stack", stack.Name)
200200

201201
metadata := &schema.Metadata{}
202202

203-
if desc, ok := meta["description"].(string); ok {
204-
metadata.Description = desc
203+
// Get the metadata object
204+
metaObj := metaValue.ToObject(vm.rt)
205+
if metaObj == nil {
206+
return
205207
}
206208

207-
if owner, ok := meta["owner"].(string); ok {
208-
metadata.Owner = owner
209+
// Extract description
210+
if descVal := metaObj.Get("description"); descVal != nil && !goja.IsUndefined(descVal) {
211+
if desc, ok := descVal.Export().(string); ok {
212+
metadata.Description = desc
213+
}
209214
}
210215

211-
if tags, ok := meta["tags"].([]interface{}); ok {
212-
metadata.Tags = make([]string, 0, len(tags))
213-
for _, tag := range tags {
214-
if tagStr, ok := tag.(string); ok {
215-
metadata.Tags = append(metadata.Tags, tagStr)
216-
}
216+
// Extract owner
217+
if ownerVal := metaObj.Get("owner"); ownerVal != nil && !goja.IsUndefined(ownerVal) {
218+
if owner, ok := ownerVal.Export().(string); ok {
219+
metadata.Owner = owner
217220
}
218221
}
219222

220-
// Store custom fields preserving order
221-
if customObj, ok := meta["custom"].(map[string]interface{}); ok {
222-
// Use goja to get object keys in order
223-
if vm.rt != nil {
224-
customValue := vm.rt.ToValue(meta["custom"])
225-
if obj := customValue.ToObject(vm.rt); obj != nil {
226-
keys := obj.Keys()
227-
orderedCustom := make([]interface{}, 0, len(keys)*2)
228-
for _, key := range keys {
229-
val := obj.Get(key)
230-
orderedCustom = append(orderedCustom, key, val.Export())
223+
// Extract tags
224+
if tagsVal := metaObj.Get("tags"); tagsVal != nil && !goja.IsUndefined(tagsVal) {
225+
if tagsExport := tagsVal.Export(); tagsExport != nil {
226+
if tags, ok := tagsExport.([]interface{}); ok {
227+
metadata.Tags = make([]string, 0, len(tags))
228+
for _, tag := range tags {
229+
if tagStr, ok := tag.(string); ok {
230+
metadata.Tags = append(metadata.Tags, tagStr)
231+
}
231232
}
232-
metadata.Custom = orderedCustom
233233
}
234-
} else {
235-
// Fallback to map
236-
metadata.Custom = customObj
234+
}
235+
}
236+
237+
// Extract custom fields preserving order
238+
if customVal := metaObj.Get("custom"); customVal != nil && !goja.IsUndefined(customVal) {
239+
if customObj := customVal.ToObject(vm.rt); customObj != nil {
240+
keys := customObj.Keys()
241+
orderedCustom := make([]interface{}, 0, len(keys)*2)
242+
for _, key := range keys {
243+
val := customObj.Get(key)
244+
orderedCustom = append(orderedCustom, key, val.Export())
245+
}
246+
metadata.Custom = orderedCustom
237247
}
238248
}
239249

0 commit comments

Comments
 (0)