diff --git a/src/parser.js b/src/parser.js index a6d4223e..2056fe58 100644 --- a/src/parser.js +++ b/src/parser.js @@ -637,6 +637,10 @@ const parser = (() => { } if (node.id !== ',') break; advance(','); + // support trailing comma - break if next token is closing parenthesis + if (node.id === ')') { + break; + } } } advance(")", true); @@ -720,6 +724,10 @@ const parser = (() => { break; } advance(","); + // support trailing comma - break if next token is closing bracket + if (node.id === "]") { + break; + } } } advance("]", true); @@ -792,6 +800,10 @@ const parser = (() => { break; } advance(","); + // support trailing comma - break if next token is closing brace + if (node.id === "}") { + break; + } } } advance("}", true); diff --git a/test/test-suite/groups/trailing-comma/case001.json b/test/test-suite/groups/trailing-comma/case001.json new file mode 100644 index 00000000..ed7cccbc --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case001.json @@ -0,0 +1,6 @@ +{ + "expr": "[1, 2, 3,]", + "data": {}, + "bindings": {}, + "result": [1, 2, 3] +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case002.json b/test/test-suite/groups/trailing-comma/case002.json new file mode 100644 index 00000000..6220fe8a --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case002.json @@ -0,0 +1,6 @@ +{ + "expr": "{\"a\": 1, \"b\": 2,}", + "data": {}, + "bindings": {}, + "result": {"a": 1, "b": 2} +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case003.json b/test/test-suite/groups/trailing-comma/case003.json new file mode 100644 index 00000000..87903a0b --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case003.json @@ -0,0 +1,6 @@ +{ + "expr": "[]", + "data": {}, + "bindings": {}, + "result": [] +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case004.json b/test/test-suite/groups/trailing-comma/case004.json new file mode 100644 index 00000000..21101801 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case004.json @@ -0,0 +1,6 @@ +{ + "expr": "{}", + "data": {}, + "bindings": {}, + "result": {} +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case005.json b/test/test-suite/groups/trailing-comma/case005.json new file mode 100644 index 00000000..edd346a8 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case005.json @@ -0,0 +1,6 @@ +{ + "expr": "[1,]", + "data": {}, + "bindings": {}, + "result": [1] +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case006.json b/test/test-suite/groups/trailing-comma/case006.json new file mode 100644 index 00000000..2283c800 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case006.json @@ -0,0 +1,6 @@ +{ + "expr": "{\"x\": 42,}", + "data": {}, + "bindings": {}, + "result": {"x": 42} +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case007.json b/test/test-suite/groups/trailing-comma/case007.json new file mode 100644 index 00000000..cffbd78b --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case007.json @@ -0,0 +1,6 @@ +{ + "expr": "[{\"a\": 1,}, {\"b\": 2,},]", + "data": {}, + "bindings": {}, + "result": [{"a": 1}, {"b": 2}] +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case008.json b/test/test-suite/groups/trailing-comma/case008.json new file mode 100644 index 00000000..2282a417 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case008.json @@ -0,0 +1,6 @@ +{ + "expr": "{\"nested\": [{\"items\": [1, 2, 3,],}, {\"more\": \"data\",},],}", + "data": {}, + "bindings": {}, + "result": {"nested": [{"items": [1, 2, 3]}, {"more": "data"}]} +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case009.json b/test/test-suite/groups/trailing-comma/case009.json new file mode 100644 index 00000000..78bc9704 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case009.json @@ -0,0 +1,6 @@ +{ + "expr": "[1, 2, 3]", + "data": {}, + "bindings": {}, + "result": [1, 2, 3] +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case010.json b/test/test-suite/groups/trailing-comma/case010.json new file mode 100644 index 00000000..e53e5ae0 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case010.json @@ -0,0 +1,6 @@ +{ + "expr": "{\"a\": 1, \"b\": 2}", + "data": {}, + "bindings": {}, + "result": {"a": 1, "b": 2} +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case011.json b/test/test-suite/groups/trailing-comma/case011.json new file mode 100644 index 00000000..f84ce3fd --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case011.json @@ -0,0 +1,6 @@ +{ + "expr": "$sum([1, 2, 3,])", + "data": {}, + "bindings": {}, + "result": 6 +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case012.json b/test/test-suite/groups/trailing-comma/case012.json new file mode 100644 index 00000000..68fdab24 --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case012.json @@ -0,0 +1,6 @@ +{ + "expr": "$max([5, 10, 15,])", + "data": {}, + "bindings": {}, + "result": 15 +} \ No newline at end of file diff --git a/test/test-suite/groups/trailing-comma/case013.json b/test/test-suite/groups/trailing-comma/case013.json new file mode 100644 index 00000000..b62b357c --- /dev/null +++ b/test/test-suite/groups/trailing-comma/case013.json @@ -0,0 +1,6 @@ +{ + "expr": "$substring(\"hello\", 1, 3,)", + "data": {}, + "bindings": {}, + "result": "ell" +} \ No newline at end of file