etoon 0.3.0

Fast TOON (Token-Oriented Object Notation) encoder. 8x faster than toons, 2.7x faster than the official TS SDK.
Documentation
{
  "version": "3.0",
  "category": "encode",
  "description": "Arrays of objects encoding - list format for non-uniform objects and complex structures",
  "tests": [
    {
      "name": "uses list format for objects with different fields",
      "input": {
        "items": [
          { "id": 1, "name": "First" },
          { "id": 2, "name": "Second", "extra": true }
        ]
      },
      "expected": "items[2]:\n  - id: 1\n    name: First\n  - id: 2\n    name: Second\n    extra: true",
      "specSection": "9.4"
    },
    {
      "name": "uses list format for objects with nested values",
      "input": {
        "items": [
          { "id": 1, "nested": { "x": 1 } }
        ]
      },
      "expected": "items[1]:\n  - id: 1\n    nested:\n      x: 1",
      "specSection": "9.4"
    },
    {
      "name": "preserves field order in list items - array first",
      "input": {
        "items": [{ "nums": [1, 2, 3], "name": "Ada" }]
      },
      "expected": "items[1]:\n  - nums[3]: 1,2,3\n    name: Ada",
      "specSection": "10"
    },
    {
      "name": "preserves field order in list items - primitive first",
      "input": {
        "items": [{ "name": "Ada", "nums": [1, 2, 3] }]
      },
      "expected": "items[1]:\n  - name: Ada\n    nums[3]: 1,2,3",
      "specSection": "10"
    },
    {
      "name": "uses list format for objects containing arrays of arrays",
      "input": {
        "items": [
          { "matrix": [[1, 2], [3, 4]], "name": "grid" }
        ]
      },
      "expected": "items[1]:\n  - matrix[2]:\n      - [2]: 1,2\n      - [2]: 3,4\n    name: grid",
      "specSection": "10"
    },
    {
      "name": "uses tabular format for nested uniform object arrays",
      "input": {
        "items": [
          { "users": [{ "id": 1, "name": "Ada" }, { "id": 2, "name": "Bob" }], "status": "active" }
        ]
      },
      "expected": "items[1]:\n  - users[2]{id,name}:\n      1,Ada\n      2,Bob\n    status: active",
      "specSection": "10",
      "note": "YAML-style encoding for list-item objects with tabular array as first field"
    },
    {
      "name": "uses list format for nested object arrays with mismatched keys",
      "input": {
        "items": [
          { "users": [{ "id": 1, "name": "Ada" }, { "id": 2 }], "status": "active" }
        ]
      },
      "expected": "items[1]:\n  - users[2]:\n      - id: 1\n        name: Ada\n      - id: 2\n    status: active",
      "specSection": "10"
    },
    {
      "name": "uses list format for objects with multiple array fields",
      "input": {
        "items": [{ "nums": [1, 2], "tags": ["a", "b"], "name": "test" }]
      },
      "expected": "items[1]:\n  - nums[2]: 1,2\n    tags[2]: a,b\n    name: test",
      "specSection": "10"
    },
    {
      "name": "uses list format for objects with only array fields",
      "input": {
        "items": [{ "nums": [1, 2, 3], "tags": ["a", "b"] }]
      },
      "expected": "items[1]:\n  - nums[3]: 1,2,3\n    tags[2]: a,b",
      "specSection": "10"
    },
    {
      "name": "encodes objects with empty arrays in list format",
      "input": {
        "items": [
          { "name": "Ada", "data": [] }
        ]
      },
      "expected": "items[1]:\n  - name: Ada\n    data[0]:",
      "specSection": "10"
    },
    {
      "name": "uses canonical encoding for multi-field list-item objects with tabular arrays",
      "input": {
        "items": [{ "users": [{ "id": 1 }, { "id": 2 }], "note": "x" }]
      },
      "expected": "items[1]:\n  - users[2]{id}:\n      1\n      2\n    note: x",
      "specSection": "10",
      "note": "Tabular header on hyphen line with rows at depth +2 and sibling fields at depth +1"
    },
    {
      "name": "uses canonical encoding for single-field list-item tabular arrays",
      "input": {
        "items": [{ "users": [{ "id": 1, "name": "Ada" }, { "id": 2, "name": "Bob" }] }]
      },
      "expected": "items[1]:\n  - users[2]{id,name}:\n      1,Ada\n      2,Bob",
      "specSection": "10",
      "note": "Tabular header on hyphen line with rows at depth +2"
    },
    {
      "name": "places empty arrays on hyphen line when first",
      "input": {
        "items": [{ "data": [], "name": "x" }]
      },
      "expected": "items[1]:\n  - data[0]:\n    name: x",
      "specSection": "10"
    },
    {
      "name": "encodes empty object list items as bare hyphen",
      "input": {
        "items": ["first", "second", {}]
      },
      "expected": "items[3]:\n  - first\n  - second\n  -",
      "specSection": "10",
      "note": "Empty object list items encode as a single \"-\" line at the list-item depth"
    },
    {
      "name": "uses field order from first object for tabular headers",
      "input": {
        "items": [
          { "a": 1, "b": 2, "c": 3 },
          { "c": 30, "b": 20, "a": 10 }
        ]
      },
      "expected": "items[2]{a,b,c}:\n  1,2,3\n  10,20,30",
      "specSection": "9.3"
    },
    {
      "name": "uses list format when one object has nested field",
      "input": {
        "items": [
          { "id": 1, "data": "string" },
          { "id": 2, "data": { "nested": true } }
        ]
      },
      "expected": "items[2]:\n  - id: 1\n    data: string\n  - id: 2\n    data:\n      nested: true",
      "specSection": "9.4"
    }
  ]
}