feat(stdlib): vim.json.encode(...,{escape_slash:boolean}) #30561

Problem:
vim.json.encode escapes every slash in string values (for example in
file paths), and is not optional. Use-case is for preventing HTML
injections (eg. injecting `</script>` closing tag); in the context of
Nvim this is rarely useful.

Solution:
- Add a `escape_slash` flag to `vim.json.encode`.
- Defaults to `false`. (This is a "breaking" change, but more like
  a bug fix.)
This commit is contained in:
Bartłomiej Maryńczak
2024-12-06 21:43:41 +01:00
committed by GitHub
parent fac96b72a5
commit 517ecb85f5
5 changed files with 136 additions and 38 deletions

View File

@@ -152,6 +152,45 @@ describe('vim.json.encode()', function()
clear()
end)
it('dumps strings with & without escaped slash', function()
-- With slash
eq('"Test\\/"', exec_lua([[return vim.json.encode('Test/', { escape_slash = true })]]))
eq(
'Test/',
exec_lua([[return vim.json.decode(vim.json.encode('Test/', { escape_slash = true }))]])
)
-- Without slash
eq('"Test/"', exec_lua([[return vim.json.encode('Test/')]]))
eq('"Test/"', exec_lua([[return vim.json.encode('Test/', {})]]))
eq('"Test/"', exec_lua([[return vim.json.encode('Test/', { _invalid = true })]]))
eq('"Test/"', exec_lua([[return vim.json.encode('Test/', { escape_slash = false })]]))
eq(
'"Test/"',
exec_lua([[return vim.json.encode('Test/', { _invalid = true, escape_slash = false })]])
)
eq(
'Test/',
exec_lua([[return vim.json.decode(vim.json.encode('Test/', { escape_slash = false }))]])
)
-- Checks for for global side-effects
eq(
'"Test/"',
exec_lua([[
vim.json.encode('Test/', { escape_slash = true })
return vim.json.encode('Test/')
]])
)
eq(
'"Test\\/"',
exec_lua([[
vim.json.encode('Test/', { escape_slash = false })
return vim.json.encode('Test/', { escape_slash = true })
]])
)
end)
it('dumps strings', function()
eq('"Test"', exec_lua([[return vim.json.encode('Test')]]))
eq('""', exec_lua([[return vim.json.encode('')]]))