Skip to content

Commit 20e5002

Browse files
authored
Merge pull request #582 from marle3003/develop
fix patching array list
2 parents 33b9ad4 + 6a303cc commit 20e5002

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

js/mokapi/patch.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,13 @@ func patch(target, patch any) any {
1616
if isTargetMap && isPatchMap {
1717
return patchMap(mapTarget, mapPatch)
1818
} else {
19-
return patch
19+
arrTarget, isTargetArray := target.([]any)
20+
arrPatch, isPatchArray := patch.([]any)
21+
if isTargetArray && isPatchArray {
22+
return patchArray(arrTarget, arrPatch)
23+
} else {
24+
return patch
25+
}
2026
}
2127
}
2228

@@ -42,3 +48,26 @@ func patchMap(t, p map[string]any) map[string]any {
4248
}
4349
return result
4450
}
51+
52+
func patchArray(t, p []any) []any {
53+
result := make([]any, 0, len(p))
54+
55+
// copy original value
56+
for _, v := range t {
57+
result = append(result, v)
58+
}
59+
60+
for i, v := range p {
61+
if v == Delete {
62+
result = append(result[:i], result[i+1:]...)
63+
continue
64+
}
65+
if i < len(result) {
66+
result[i] = patch(result[i], v)
67+
} else {
68+
result = append(result, v)
69+
}
70+
}
71+
72+
return result
73+
}

js/mokapi/patch_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,50 @@ func TestModule_Patch(t *testing.T) {
139139
r.Equal(t, map[string]any{}, v.Export())
140140
},
141141
},
142+
{
143+
name: "patch array",
144+
test: func(t *testing.T, vm *goja.Runtime, host *enginetest.Host) {
145+
v, err := vm.RunString(`
146+
const m = require('mokapi')
147+
m.patch([1,2,3,4], [1,3,4])
148+
`)
149+
r.NoError(t, err)
150+
r.Equal(t, []interface{}{int64(1), int64(3), int64(4), int64(4)}, v.Export())
151+
},
152+
},
153+
{
154+
name: "patch array has more items",
155+
test: func(t *testing.T, vm *goja.Runtime, host *enginetest.Host) {
156+
v, err := vm.RunString(`
157+
const m = require('mokapi')
158+
m.patch([1,2], [1,2,3,4])
159+
`)
160+
r.NoError(t, err)
161+
r.Equal(t, []interface{}{int64(1), int64(2), int64(3), int64(4)}, v.Export())
162+
},
163+
},
164+
{
165+
name: "array with delete",
166+
test: func(t *testing.T, vm *goja.Runtime, host *enginetest.Host) {
167+
v, err := vm.RunString(`
168+
const m = require('mokapi')
169+
m.patch([1,2], [1,m.Delete])
170+
`)
171+
r.NoError(t, err)
172+
r.Equal(t, []interface{}{int64(1)}, v.Export())
173+
},
174+
},
175+
{
176+
name: "array with undefined",
177+
test: func(t *testing.T, vm *goja.Runtime, host *enginetest.Host) {
178+
v, err := vm.RunString(`
179+
const m = require('mokapi')
180+
m.patch([1,2], [undefined])
181+
`)
182+
r.NoError(t, err)
183+
r.Equal(t, []interface{}{int64(1), int64(2)}, v.Export())
184+
},
185+
},
142186
}
143187

144188
t.Parallel()

0 commit comments

Comments
 (0)