audit fixes, repo restructure, and documentation

Soundness and performance audit (17 fixes):
- See AUDIT.md for full details and @claude comments in code

Repo restructure:
- Inline json-ptr and json-patch submodules as regular directories
- Remove cbor submodule, replace serde_cbor with ciborium
- Rename patch-db/ -> core/, patch-db-macro/ -> macro/,
  patch-db-macro-internals/ -> macro-internals/, patch-db-util/ -> util/
- Purge upstream CI/CD, bench, and release cruft from json-patch
- Remove .gitmodules

Test fixes:
- Fix proptest doesnt_crash (unique file paths, proper close/cleanup)
- Add PatchDb::close() for clean teardown

Documentation:
- Add README.md, ARCHITECTURE.md, CONTRIBUTING.md, CLAUDE.md, AUDIT.md
- Add TSDocs to TypeScript client exports

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt Hill
2026-02-23 19:06:42 -07:00
parent 05c93290c7
commit 86b0768bbb
46 changed files with 5744 additions and 95 deletions

View File

@@ -0,0 +1,343 @@
[
{
"comment": "4.1. add with missing object",
"doc": {
"q": {
"bar": 2
}
},
"patch": [
{
"op": "add",
"path": "/a/b",
"value": 1
}
],
"error": "path /a does not exist -- missing objects are not created recursively"
},
{
"comment": "A.1. Adding an Object Member",
"doc": {
"foo": "bar"
},
"patch": [
{
"op": "add",
"path": "/baz",
"value": "qux"
}
],
"expected": {
"baz": "qux",
"foo": "bar"
}
},
{
"comment": "A.2. Adding an Array Element",
"doc": {
"foo": [
"bar",
"baz"
]
},
"patch": [
{
"op": "add",
"path": "/foo/1",
"value": "qux"
}
],
"expected": {
"foo": [
"bar",
"qux",
"baz"
]
}
},
{
"comment": "A.3. Removing an Object Member",
"doc": {
"baz": "qux",
"foo": "bar"
},
"patch": [
{
"op": "remove",
"path": "/baz"
}
],
"expected": {
"foo": "bar"
}
},
{
"comment": "A.4. Removing an Array Element",
"doc": {
"foo": [
"bar",
"qux",
"baz"
]
},
"patch": [
{
"op": "remove",
"path": "/foo/1"
}
],
"expected": {
"foo": [
"bar",
"baz"
]
}
},
{
"comment": "A.5. Replacing a Value",
"doc": {
"baz": "qux",
"foo": "bar"
},
"patch": [
{
"op": "replace",
"path": "/baz",
"value": "boo"
}
],
"expected": {
"baz": "boo",
"foo": "bar"
}
},
{
"comment": "A.6. Moving a Value",
"doc": {
"foo": {
"bar": "baz",
"waldo": "fred"
},
"qux": {
"corge": "grault"
}
},
"patch": [
{
"op": "move",
"from": "/foo/waldo",
"path": "/qux/thud"
}
],
"expected": {
"foo": {
"bar": "baz"
},
"qux": {
"corge": "grault",
"thud": "fred"
}
}
},
{
"comment": "A.7. Moving an Array Element",
"doc": {
"foo": [
"all",
"grass",
"cows",
"eat"
]
},
"patch": [
{
"op": "move",
"from": "/foo/1",
"path": "/foo/3"
}
],
"expected": {
"foo": [
"all",
"cows",
"eat",
"grass"
]
}
},
{
"comment": "A.8. Testing a Value: Success",
"doc": {
"baz": "qux",
"foo": [
"a",
2,
"c"
]
},
"patch": [
{
"op": "test",
"path": "/baz",
"value": "qux"
},
{
"op": "test",
"path": "/foo/1",
"value": 2
}
],
"expected": {
"baz": "qux",
"foo": [
"a",
2,
"c"
]
}
},
{
"comment": "A.9. Testing a Value: Error",
"doc": {
"baz": "qux"
},
"patch": [
{
"op": "test",
"path": "/baz",
"value": "bar"
}
],
"error": "string not equivalent"
},
{
"comment": "A.10. Adding a nested Member Object",
"doc": {
"foo": "bar"
},
"patch": [
{
"op": "add",
"path": "/child",
"value": {
"grandchild": {}
}
}
],
"expected": {
"foo": "bar",
"child": {
"grandchild": {
}
}
}
},
{
"comment": "A.11. Ignoring Unrecognized Elements",
"doc": {
"foo": "bar"
},
"patch": [
{
"op": "add",
"path": "/baz",
"value": "qux",
"xyz": 123
}
],
"expected": {
"foo": "bar",
"baz": "qux"
}
},
{
"comment": "A.12. Adding to a Non-existent Target",
"doc": {
"foo": "bar"
},
"patch": [
{
"op": "add",
"path": "/baz/bat",
"value": "qux"
}
],
"error": "add to a non-existent target"
},
{
"comment": "A.13 Invalid JSON Patch Document",
"doc": {
"foo": "bar"
},
"patch": [
{
"op": "add",
"path": "/baz",
"value": "qux",
"op": "remove"
}
],
"error": "operation has two 'op' members",
"disabled": true
},
{
"comment": "A.14. ~ Escape Ordering",
"doc": {
"/": 9,
"~1": 10
},
"patch": [
{
"op": "test",
"path": "/~01",
"value": 10
}
],
"expected": {
"/": 9,
"~1": 10
}
},
{
"comment": "A.15. Comparing Strings and Numbers",
"doc": {
"/": 9,
"~1": 10
},
"patch": [
{
"op": "test",
"path": "/~01",
"value": "10"
}
],
"error": "number is not equal to string"
},
{
"comment": "A.16. Adding an Array Value",
"doc": {
"foo": [
"bar"
]
},
"patch": [
{
"op": "add",
"path": "/foo/-",
"value": [
"abc",
"def"
]
}
],
"expected": {
"foo": [
"bar",
[
"abc",
"def"
]
]
}
}
]