{"_id":"aywson","_rev":"15-a4c9a38b845db0104c8b9aa603d5b5a7","name":"aywson","dist-tags":{"latest":"0.0.16"},"versions":{"0.0.1":{"name":"aywson","version":"0.0.1","keywords":[],"author":"","license":"ISC","_id":"aywson@0.0.1","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"dist":{"shasum":"bc75e22f49a3df50d0e88e0495670681c2f0bee2","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.1.tgz","fileCount":2,"integrity":"sha512-eZzNHLsQCm6yaT5Svelbv8zmJfQETqoGq586AAIFeHyrtlyVa1PBnmACZxZIwSAESlbAMzr6cd1pmHvbDf8/Sw==","signatures":[{"sig":"MEUCIAgfIMd7kapCQ6gcGwUfea+lARIzURPecdlhj8c81HgbAiEAj9niKGxIdiNB3HOGr07NNdh2FextezVOjFjF4O0haOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":249},"main":"index.js","type":"module","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"threepointone","email":"threepointone@gmail.com"},"_npmVersion":"11.6.2","description":"","directories":{},"_nodeVersion":"25.1.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.1_1765719344774_0.5843388999739441","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"aywson","version":"0.0.3","keywords":["jsonc","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.3","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"dist":{"shasum":"dabe445074e3e9540db4f507609903aa566e5785","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.3.tgz","fileCount":11,"integrity":"sha512-zfrGSogcUEDv0uJcm4fBdFSqe8eCkJ4tgv0zvQhCRUzFCWa8ndEZv2tARxKb5jduZ/w3S06H2beEXXGyO2yQVA==","signatures":[{"sig":"MEYCIQC8H86mSmHmhUGbgzqaKHs71RkaaNNzwKg7wKiDica8WAIhAPYCWmeomLBmYFVcXe6RknWJ3hrUZTbzHVuwcBMUx3/n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81410},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"da03ed8bae8c735e5e54f7a29ebda2575552bed9","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","typescript":"^5.9.3","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.3_1765727954281_0.17738047233688858","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"aywson","version":"0.0.4","keywords":["jsonc","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.4","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"dist":{"shasum":"985d87413a46e882492c9126b56bf0a0fff24b13","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.4.tgz","fileCount":11,"integrity":"sha512-3taB0lVf4YIEYC78vSM2A+Yc+OVcyyu1rUn0erAt1dsAwE9iPntXytyxPMhDfF9+pegpCCKMMAH7G7pIVZviYg==","signatures":[{"sig":"MEUCIQCDSr+PVDrGClI3DeZsQQ3q50QrcjtS7Hq4pdbPMvzKSwIgbNPhvTDf6YaZXwOepdfuGBp297mLIwQyIdv7qelBDmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81410},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"58ae332c3cabff66ec9acd469a4bccb258124c54","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","typescript":"^5.9.3","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.4_1765728144690_0.5879851585071347","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"aywson","version":"0.0.5","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.5","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"dist":{"shasum":"f192068406b79294c38acb1c7a31f5050e604511","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.5.tgz","fileCount":11,"integrity":"sha512-jOI8iCEasd3HipkWIgCaI2jsE1F+6HpQ+xaReuzGjy2FpduY4KB1CgN/6R4l/5Zt5xyOVbDwa7V1cxPPEQBaIA==","signatures":[{"sig":"MEUCIQC4ETV90Xh0gVFVIw5ENZQtp9rqu/YrCq4MNjiKTvRZQwIgNJbsUNTrEM8Ag3aDQi0o9ZkxhY0u2ofES+eSAYSMrvo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":81468},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"6297538856c5b5ba344e5c9a176683bb8c1f3cd8","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.5_1765728567780_0.01372381820315538","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"aywson","version":"0.0.6","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.6","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"dist":{"shasum":"5f8a176ad1fb6329e43f6a3009c304c09c6fdf5d","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.6.tgz","fileCount":11,"integrity":"sha512-evhdziNfHfwZ+d9Swl51FUbqDPFhxaGkEZbS4b70hWZ+19GtC95rPw2C54chvuseK312BBQnYyowPu88Z+kC0g==","signatures":[{"sig":"MEQCIHenRfJkROfdJmlFaYGEA5/IUrvZrb1kpKvHoPR0HrHJAiBx/dj80PoYF19e2Ot37thJcq3XVdoCeesJwRCuPPadnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79746},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"0d25b3c9a6928c602a2fdf2cd6c180de34a77527","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.6_1765730700490_0.6721011846281544","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"aywson","version":"0.0.7","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.7","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"d86763473b55a78eb7818c6589ed337097662593","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.7.tgz","fileCount":19,"integrity":"sha512-PgfKuY+fWKODJ0E303KYAJSLeDnPAnPhCwhDpWfIzwyzF2nDS49m1V0e3R34lpbQxdJpXFZTsfuMwE4SCVt1Wg==","signatures":[{"sig":"MEQCIDmk7F2W8nzRDysKSc/kbfmRBSY2+jBiaXsVo+KlVGYAAiALSBc13Rf+qaOAffdjUZVNNG8+TrlQyINypAe6JCraxQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133103},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"4ff3874eff0cd88196137f2b675320cbc70fe0ce","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.7_1765735696224_0.98011192500157","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"aywson","version":"0.0.8","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.8","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"2196307530bc42d53d408e164f2ef1de069d0305","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.8.tgz","fileCount":19,"integrity":"sha512-aJwj6+yDKKct6K9inVmCpZBz7nydr23X5hkCj+Qmp/uAqblHgPAmvU6qEeP4yWpqfkNmFzEYVX9trNFBAwbD5Q==","signatures":[{"sig":"MEQCIA7rm4x0qhaXOfIADxwrh6DZlPgErQyZtHOiQh23XWk7AiAWHOCLubnqZyOL6rn1YvRF/Z2Gnor2XtoW5hK9MqTvpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133485},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"9a5900b57a8c9be7ea2c881048973ba3ab3b486d","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.8_1765736330187_0.24713201461027512","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"aywson","version":"0.0.9","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.9","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"17e85a4c6a29818726e1022f053a930f37629b2e","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.9.tgz","fileCount":19,"integrity":"sha512-om07+vodMQeokchNW5kqlbMsdsCFQ5cSAZhLxL6tDjCUbikye2Gn0EwaZkXHWUYks9Zp0v7C0b5pvMx4C2R76w==","signatures":[{"sig":"MEYCIQDhpeyIppYN1VGgjolG8uPFwE2McA4aOwo2AGKrFXzHbQIhAMostlDBG8odDJXgbk2esk4rVhbmrhSHYiYBwGESHW77","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":192496},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"1c0bf68ee5b06d7ee7bc6aea366bbecaba4091e3","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.9_1765810604456_0.4696705209274703","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"aywson","version":"0.0.10","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.10","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"a1d63da8900bd4980b37268a592b0950fc54fd83","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.10.tgz","fileCount":19,"integrity":"sha512-copVVPzydsnV6Zy16CR9h3y+7Rq1bgc3elzBMOzfU89IaynS+onmSA6kiQi9fQXVdq6n1AiEqfHWD1JdImy0GA==","signatures":[{"sig":"MEYCIQD//TsxQ1EE4PBTb5whCGP+XqjpS7bW8+8A8sA9YcDsXgIhAO3aKE1ay+/XmuzHvPdU/FOHB8lhrfjS5k/Q3xqqHs89","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":195097},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"a5a7587986d86dad1ad099892582a7de27978758","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.10_1765810980874_0.6353984375499535","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"aywson","version":"0.0.11","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.11","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"0d0c3c652c7efba662909b8e9d365039c9b3ec26","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.11.tgz","fileCount":19,"integrity":"sha512-F6fopLeuBTST87+503JR8hBHxKjEO172prDs/v/8wL1oDvUn/WS81LsKMOk++1CUPduS7/3fwNg0VN5ZJUm7Ew==","signatures":[{"sig":"MEYCIQCXJre0zXLGg+MIP2ggA+BtesqFsOosuixL/ofiVsvIkgIhAM5NyDrWibWpVZ7EBoV7PVjcL5HfQ/IVlk5fZV4n1PSa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":197454},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"c494379ecfb461414b0eeb6930479f897f8fe43e","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.11_1765816187802_0.07461491532863818","host":"s3://npm-registry-packages-npm-production"}},"0.0.12":{"name":"aywson","version":"0.0.12","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.12","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"30797536cab38e21ab3c551b4c48d164a483db9d","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.12.tgz","fileCount":19,"integrity":"sha512-qPLuYIirDRkMwGrlQj2nEz2Tk/U6NrDmtlrxjIHv40SZRqm+bg2GRKsije+HjbRAiP35HLJDes7lWOOCxhbCHg==","signatures":[{"sig":"MEUCIQDDOkrI3lnPOhW/bT6SCSVJp1nbeKkkFcYQ0zQsk/Q14AIgfdlyAx6+/Yfz6QI1g1VMx/x+C9iBIszUMedO9OHBf14=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":227259},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"dd7d2aef46e11d77b20848fc84ec00fb5cc40301","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.12_1765821046887_0.17572929269465454","host":"s3://npm-registry-packages-npm-production"}},"0.0.13":{"name":"aywson","version":"0.0.13","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.13","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"4621e9839afc523fb542aa942581f10b0e7f331d","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.13.tgz","fileCount":19,"integrity":"sha512-29HLw7PpSYEc6R/NDnjVbX17E71ZT9hYIlxw5xEKQc1MQSSJVoWmmoav5WNxcP45J9NWmxs54H1bonY3tdRBqg==","signatures":[{"sig":"MEQCIBJV2RNYKia41iNkE9+fQ8iiW2vL5yu17ZPlSPgCrfVNAiBdP5hA6HsC9+8FcpyRroE1muykL3OukzaaF8aAOSwpiA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":227358},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"2e37a869c80f7f9767a588f5c748e6340b543e35","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.13_1765822256858_0.5284217597408181","host":"s3://npm-registry-packages-npm-production"}},"0.0.14":{"name":"aywson","version":"0.0.14","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.14","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"65d529fcc7bbe62d2cecae0272ed7a7bcf899bc5","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.14.tgz","fileCount":19,"integrity":"sha512-H1cFoS9VTZJ2M6XAEMlZa5xtfTO2xrzU2+2bSaXiS4nkft7hS+40+Aw3KOti9suGtinKYpbYUv/iRaiZHGNfxw==","signatures":[{"sig":"MEUCIQDSgXQuQ2ulnowSwNQ0nN9BiogxJuoB7U3G5VWbzuo55AIgA+mGEQlzRg8GVin6X1+swhY0WwBTc+8oa5wzGKWo2ZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":237676},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"6f4983c6707ffd84cabba2cef5aa508fdb931b9d","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.14_1765842675494_0.1090313996895571","host":"s3://npm-registry-packages-npm-production"}},"0.0.15":{"name":"aywson","version":"0.0.15","keywords":["jsonc","json","configuration","comments","formatting","modify"],"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","_id":"aywson@0.0.15","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"bin":{"aywson":"dist/cli.mjs"},"dist":{"shasum":"52835fc7fd864a8bace75d24dbe8f75f7e456c0d","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.15.tgz","fileCount":19,"integrity":"sha512-jV4OxIkVZ1Uax5IS3ChwSiZpeX7hLENg++4i+/dSECc3dX83JVQaUOSVBx5F0Bnhx23hgzlzdiJaGQkVsnMwFg==","signatures":[{"sig":"MEQCICM2/YUOq/yeTRmpdKe4awCDLQ5Tdbrp8KLdO44UGNXbAiADlDiSS4W2Oi41yKzXfKAuuzofTFqvXXLvBbuUWchU8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":278893},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.mts","module":"./dist/index.mjs","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"gitHead":"a3196d2edb31df35f8a926af8dfbcfefdbde0bf4","scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"repository":{"url":"git+https://github.com/threepointone/aywson.git","type":"git"},"_npmVersion":"11.6.2","description":"Modify JSONC while preserving comments and formatting.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"_hasShrinkwrap":false,"devDependencies":{"tsdown":"^0.17.4","vitest":"^4.0.15","pkg-pr-new":"^0.0.62","typescript":"^5.9.3","@types/node":"^25.0.2","@biomejs/biome":"^2.3.8","@changesets/cli":"^2.29.8","@changesets/changelog-github":"^0.5.2"},"_npmOperationalInternal":{"tmp":"tmp/aywson_0.0.15_1765975529478_0.24877657367301143","host":"s3://npm-registry-packages-npm-production"}},"0.0.16":{"name":"aywson","version":"0.0.16","description":"Modify JSONC while preserving comments and formatting.","author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","type":"module","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.mts","bin":{"aywson":"dist/cli.mjs"},"repository":{"type":"git","url":"git+https://github.com/threepointone/aywson.git"},"homepage":"https://github.com/threepointone/aywson","bugs":{"url":"https://github.com/threepointone/aywson/issues"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs"}},"scripts":{"test":"vitest","build":"tsdown --outDir dist src/index.ts src/cli.ts --format esm,cjs --dts --sourcemap","check":"biome check && tsc --noEmit"},"keywords":["jsonc","json","configuration","comments","formatting","modify"],"devDependencies":{"@biomejs/biome":"^2.3.8","@changesets/changelog-github":"^0.5.2","@changesets/cli":"^2.29.8","@types/node":"^25.0.2","pkg-pr-new":"^0.0.62","tsdown":"^0.17.4","typescript":"^5.9.3","vitest":"^4.0.15"},"dependencies":{"chalk":"^5.6.2","jsonc-parser":"^3.3.1"},"gitHead":"535d70418323292ceb01b3c4cdb4c5a829c64532","_id":"aywson@0.0.16","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-xLFICM6OgSMcysNHCgrhri7hpcn0TfuyU5KxtjpIAJAUuD0Bjph2pSkLgxjn45iQBjBxs4S5Fq+RmXhIYuQtNw==","shasum":"0fd4fb7c76808d15a7b2582345378a6322cdf90c","tarball":"https://registry.npmjs.org/aywson/-/aywson-0.0.16.tgz","fileCount":19,"unpackedSize":278918,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/aywson@0.0.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHqjfAKwJXl4/uT6apsDNprbOXnJcrrNYxUp4AHH4drOAiEA95FpgnAp32b2XhAeVssolpFkaErvGP6RcNIe/mOo2iY="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:9cae2c2d-e7ba-444c-8c41-e6b1c646fd7f"}},"directories":{},"maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/aywson_0.0.16_1766237869468_0.7637779477748292"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-14T13:35:44.773Z","modified":"2025-12-20T13:37:49.996Z","0.0.1":"2025-12-14T13:35:44.927Z","0.0.3":"2025-12-14T15:59:14.421Z","0.0.4":"2025-12-14T16:02:24.857Z","0.0.5":"2025-12-14T16:09:27.932Z","0.0.6":"2025-12-14T16:45:00.626Z","0.0.7":"2025-12-14T18:08:16.369Z","0.0.8":"2025-12-14T18:18:50.334Z","0.0.9":"2025-12-15T14:56:44.592Z","0.0.10":"2025-12-15T15:03:01.055Z","0.0.11":"2025-12-15T16:29:47.961Z","0.0.12":"2025-12-15T17:50:47.029Z","0.0.13":"2025-12-15T18:10:57.018Z","0.0.14":"2025-12-15T23:51:15.652Z","0.0.15":"2025-12-17T12:45:29.609Z","0.0.16":"2025-12-20T13:37:49.644Z"},"bugs":{"url":"https://github.com/threepointone/aywson/issues"},"author":{"name":"Sunil Pai","email":"threepointone@gmail.com"},"license":"MIT","homepage":"https://github.com/threepointone/aywson","keywords":["jsonc","json","configuration","comments","formatting","modify"],"repository":{"type":"git","url":"git+https://github.com/threepointone/aywson.git"},"description":"Modify JSONC while preserving comments and formatting.","maintainers":[{"name":"threepointone","email":"threepointone@gmail.com"}],"readme":"# aywson\n\n𝖆𝖗𝖊 𝖞𝖆 𝖜𝖎𝖓𝖓𝖎𝖓𝖌, 𝖘𝖔𝖓?\n\n![Are ya winning, son?](aywson.png)\n\nModify JSONC while preserving comments and formatting.\n\n```sh\nnpm install aywson\n```\n\n## Usage\n\n```ts\nimport {\n  parse, // parse JSONC to object\n  modify, // replace fields, delete unlisted\n  get, // read value at path\n  set, // write value at path (with optional comment)\n  remove, // delete field at path\n  merge, // update fields, keep unlisted\n  replace, // alias for modify\n  patch, // alias for merge\n  rename, // rename a key\n  move, // move field to new path\n  getComment, // read comment (above or trailing)\n  setComment, // add comment above field\n  removeComment, // remove comment above field\n  getTrailingComment, // read trailing comment\n  setTrailingComment, // add trailing comment\n  removeTrailingComment, // remove trailing comment\n  sort, // sort object keys\n  format // format/prettify JSONC\n} from \"aywson\";\n```\n\n## `modify`\n\nReplace fields, delete unlisted. Comments above deleted fields are also deleted, unless they start with `**`.\n\n```ts\nimport { modify } from \"aywson\";\n\nmodify('{ /* keep this */ \"a\": 1, \"b\": 2 }', { a: 10 });\n// → '{ /* keep this */ \"a\": 10 }' — comment preserved, b deleted\n```\n\n`modify` uses **replace semantics** — fields not in `changes` are deleted. Comments (both above and trailing) on deleted fields are also deleted, unless they start with `**`.\n\n## `parse`\n\nParse a JSONC string into a JavaScript value. Unlike `JSON.parse()`, this handles comments and trailing commas.\n\n```ts\nimport { parse } from \"aywson\";\n\nparse(`{\n  // database config\n  \"host\": \"localhost\",\n  \"port\": 5432,\n}`);\n// → { host: \"localhost\", port: 5432 }\n\n// With TypeScript generics\ninterface Config {\n  host: string;\n  port: number;\n}\nconst config = parse<Config>(jsonString);\n```\n\n## Path-based Operations\n\nPaths can be specified as either:\n\n- **String paths**: `\"config.database.host\"` or `\"items[0].name\"` (dot-notation, like the CLI)\n- **Array paths**: `[\"config\", \"database\", \"host\"]` or `[\"items\", 0, \"name\"]`\n\nBoth formats work for all path-based operations.\n\n### `get(json, path)`\n\nGet a value at a path.\n\n```ts\n// Using string path\nget('{ \"config\": { \"enabled\": true } }', \"config.enabled\");\n// → true\n\n// Using array path\nget('{ \"config\": { \"enabled\": true } }', [\"config\", \"enabled\"]);\n// → true\n```\n\n### `has(json, path)`\n\nCheck if a path exists.\n\n```ts\nhas('{ \"foo\": \"bar\" }', \"foo\"); // → true (string path)\nhas('{ \"foo\": \"bar\" }', [\"foo\"]); // → true (array path)\nhas('{ \"foo\": \"bar\" }', \"baz\"); // → false\n```\n\n### `set(json, path, value, comment?)`\n\nSet a value at a path, optionally with a comment.\n\n```ts\n// Using string path\nset('{ \"foo\": \"bar\" }', \"foo\", \"baz\");\n// → '{ \"foo\": \"baz\" }'\n\n// Using array path\nset('{ \"foo\": \"bar\" }', [\"foo\"], \"baz\");\n// → '{ \"foo\": \"baz\" }'\n\n// With a comment\nset('{ \"foo\": \"bar\" }', \"foo\", \"baz\", \"this is foo\");\n// → adds \"// this is foo\" above the field\n\n// Nested paths work with both formats\nset('{ \"config\": {} }', \"config.enabled\", true);\n// or\nset('{ \"config\": {} }', [\"config\", \"enabled\"], true);\n```\n\n### `remove(json, path)`\n\nRemove a field. Comments (both above and trailing) are also removed, unless they start with `**`.\n\n```ts\n// Using string path\nremove(\n  `{\n  // this is foo\n  \"foo\": \"bar\",\n  \"baz\": 123\n}`,\n  \"foo\"\n);\n// → '{ \"baz\": 123 }' — comment removed too\n\n// Using array path\nremove(\n  `{\n  \"foo\": \"bar\", // trailing comment\n  \"baz\": 123\n}`,\n  [\"foo\"]\n);\n// → '{ \"baz\": 123 }' — trailing comment removed too\n\n// Nested paths\nremove(json, \"config.database.host\");\n// or\nremove(json, [\"config\", \"database\", \"host\"]);\n```\n\n## Merge Strategies\n\n### `merge(json, changes)`\n\nUpdate/add fields, never delete (unless explicit `undefined`).\n\n```ts\nmerge('{ \"a\": 1, \"b\": 2 }', { a: 10 });\n// → '{ \"a\": 10, \"b\": 2 }' — b preserved\n```\n\n### `replace(json, changes)`\n\nDelete fields not in changes (same as `modify`).\n\n```ts\nreplace('{ \"a\": 1, \"b\": 2 }', { a: 10 });\n// → '{ \"a\": 10 }' — b deleted\n```\n\n### `patch(json, changes)`\n\nAlias for `merge`. Use `undefined` to delete.\n\n```ts\npatch('{ \"a\": 1, \"b\": 2 }', { a: undefined });\n// → '{ \"b\": 2 }' — a explicitly deleted\n```\n\n## Key Operations\n\n### `rename(json, path, newKey)`\n\nRename a key while preserving its value.\n\n```ts\n// Using string path\nrename('{ \"oldName\": 123 }', \"oldName\", \"newName\");\n// → '{ \"newName\": 123 }'\n\n// Using array path\nrename('{ \"oldName\": 123 }', [\"oldName\"], \"newName\");\n// → '{ \"newName\": 123 }'\n\n// Nested paths\nrename(json, \"config.oldKey\", \"newKey\");\n// or\nrename(json, [\"config\", \"oldKey\"], \"newKey\");\n```\n\n### `move(json, fromPath, toPath)`\n\nMove a field to a different location.\n\n```ts\n// Using string paths\nmove(\n  '{ \"source\": { \"value\": 123 }, \"target\": {} }',\n  \"source.value\",\n  \"target.value\"\n);\n// → '{ \"source\": {}, \"target\": { \"value\": 123 } }'\n\n// Using array paths\nmove(\n  '{ \"source\": { \"value\": 123 }, \"target\": {} }',\n  [\"source\", \"value\"],\n  [\"target\", \"value\"]\n);\n// → '{ \"source\": {}, \"target\": { \"value\": 123 } }'\n\n// Mixed formats also work\nmove(json, \"source.value\", [\"target\", \"value\"]);\n```\n\n## Sort Operations\n\n### `sort(json, path?, options?)`\n\nSort object keys alphabetically while preserving comments (both above and trailing) with their respective keys.\n\n```ts\nsort(`{\n  // z comment\n  \"z\": 1,\n  // a comment\n  \"a\": 2\n}`);\n// → '{ \"a\": 2, \"z\": 1 }' with comments preserved\n\n// Trailing comments are also preserved\nsort(`{\n  \"z\": 1, // z trailing\n  \"a\": 2 // a trailing\n}`);\n// → '{ \"a\": 2 // a trailing, \"z\": 1 // z trailing }'\n```\n\n**Path:** Specify a path to sort only a nested object (defaults to `\"\"` or `[]` for root).\n\n```ts\n// Using string path\nsort(json, \"config.database\"); // Sort only the database object\n\n// Using array path\nsort(json, [\"config\", \"database\"]); // Sort only the database object\n\n// Root level (both equivalent)\nsort(json); // or sort(json, \"\") or sort(json, [])\n```\n\n**Options:**\n\n- `comparator?: (a: string, b: string) => number` — Custom sort function. Defaults to alphabetical.\n- `deep?: boolean` — Sort nested objects recursively. Defaults to `true`.\n\n```ts\n// Custom sort order (reverse alphabetical)\nsort(json, \"\", { comparator: (a, b) => b.localeCompare(a) });\n\n// Only sort top-level keys (not nested objects)\nsort(json, \"\", { deep: false });\n\n// Sort only a specific nested object, non-recursively\nsort(json, \"config\", { deep: false });\n```\n\n````\n\n## Format Operations\n\n### `format(json, options?)`\n\nFormat a JSONC document with consistent indentation. Preserves comments while normalizing whitespace.\n\n```ts\nimport { format } from \"aywson\";\n\n// Format minified JSON\nformat('{\"foo\":\"bar\",\"baz\":123}');\n// → '{\n//   \"foo\": \"bar\",\n//   \"baz\": 123\n// }'\n\n// Comments are preserved\nformat('{ /* important */ \"foo\": \"bar\" }');\n// → '{\n//   /* important */\n//   \"foo\": \"bar\"\n// }'\n````\n\n**Options:**\n\n- `tabSize?: number` — Number of spaces per indentation level. Defaults to `2`.\n- `insertSpaces?: boolean` — Use spaces instead of tabs. Defaults to `true`.\n- `eol?: string` — End of line character. Defaults to `'\\n'`.\n\n```ts\n// Use 4 spaces for indentation\nformat(json, { tabSize: 4 });\n\n// Use tabs instead of spaces\nformat(json, { insertSpaces: false });\n\n// Use Windows-style line endings\nformat(json, { eol: \"\\r\\n\" });\n```\n\n## Comment Operations\n\n### `setComment(json, path, comment)`\n\nAdd or update a comment above a field.\n\n```ts\n// Using string path\nsetComment(\n  `{\n  \"enabled\": true\n}`,\n  \"enabled\",\n  \"controls the feature\"\n);\n// → adds \"// controls the feature\" above the field\n\n// Using array path\nsetComment(json, [\"config\", \"enabled\"], \"controls the feature\");\n```\n\n### `removeComment(json, path)`\n\nRemove the comment above a field.\n\n```ts\n// Using string path\nremoveComment(\n  `{\n  // this will be removed\n  \"foo\": \"bar\"\n}`,\n  \"foo\"\n);\n// → '{ \"foo\": \"bar\" }'\n\n// Using array path\nremoveComment(json, [\"config\", \"enabled\"]);\n```\n\n### `getComment(json, path)`\n\nGet the comment associated with a field. First checks for a comment above, then falls back to a trailing comment.\n\n```ts\n// Using string path\ngetComment(\n  `{\n  // this is foo\n  \"foo\": \"bar\"\n}`,\n  \"foo\"\n);\n// → \"this is foo\"\n\n// Using array path\ngetComment(\n  `{\n  \"foo\": \"bar\" // trailing comment\n}`,\n  [\"foo\"]\n);\n// → \"trailing comment\"\n\ngetComment('{ \"foo\": \"bar\" }', \"foo\");\n// → null (no comment)\n```\n\n## Trailing Comments\n\nTrailing comments are comments on the same line after a field value:\n\n```jsonc\n{\n  \"foo\": \"bar\", // this is a trailing comment\n  \"baz\": 123 // another trailing comment\n}\n```\n\n### `getTrailingComment(json, path)`\n\nGet the trailing comment after a field (explicitly, ignoring comments above).\n\n```ts\n// Using string path\ngetTrailingComment(\n  `{\n  \"foo\": \"bar\", // trailing comment\n  \"baz\": 123\n}`,\n  \"foo\"\n);\n// → \"trailing comment\"\n\n// Using array path\ngetTrailingComment(json, [\"config\", \"database\", \"host\"]);\n```\n\n### `setTrailingComment(json, path, comment)`\n\nAdd or update a trailing comment after a field.\n\n```ts\n// Using string path\nsetTrailingComment(\n  `{\n  \"foo\": \"bar\",\n  \"baz\": 123\n}`,\n  \"foo\",\n  \"this is foo\"\n);\n// → '{ \"foo\": \"bar\" // this is foo, \"baz\": 123 }'\n\n// Using array path\nsetTrailingComment(\n  `{\n  \"foo\": \"bar\", // old comment\n  \"baz\": 123\n}`,\n  [\"foo\"],\n  \"new comment\"\n);\n// → replaces \"old comment\" with \"new comment\"\n```\n\n### `removeTrailingComment(json, path)`\n\nRemove the trailing comment after a field.\n\n```ts\n// Using string path\nremoveTrailingComment(\n  `{\n  \"foo\": \"bar\", // this will be removed\n  \"baz\": 123\n}`,\n  \"foo\"\n);\n// → '{ \"foo\": \"bar\", \"baz\": 123 }'\n\n// Using array path\nremoveTrailingComment(json, [\"config\", \"database\", \"host\"]);\n```\n\n### Comments Above vs Trailing\n\nYou can have both a comment above and a trailing comment:\n\n```ts\nconst json = `{\n  // comment above\n  \"foo\": \"bar\", // trailing comment\n  \"baz\": 123\n}`;\n\ngetComment(json, \"foo\"); // → \"comment above\" (prefers above)\ngetTrailingComment(json, \"foo\"); // → \"trailing comment\"\n\n// Set comment above (preserves trailing)\nsetComment(json, \"foo\", \"new above\");\n// → both comments preserved, above is updated\n\n// Remove comment above (preserves trailing)\nremoveComment(json, \"foo\");\n// → trailing comment still there\n```\n\n## Preserving Comments\n\nWhen deleting fields, comments are deleted by default. Start a comment with `**` to preserve it:\n\n```ts\nremove(\n  `{\n  // this comment will be deleted\n  \"config\": {}\n}`,\n  \"config\"\n);\n// → '{}' — comment deleted with field\n\nremove(\n  `{\n  // ** this comment will be preserved\n  \"config\": {}\n}`,\n  \"config\"\n);\n// → '{ // ** this comment will be preserved }' — comment kept\n```\n\n## Object Iteration & Transformation\n\nEven though aywson works on strings, you can still do full object manipulation:\n\n```ts\nimport { parse, set, remove, merge } from \"aywson\";\n\nlet json = `{\n  // Database settings\n  \"database\": {\n    \"host\": \"localhost\",\n    \"port\": 5432\n  },\n  // Feature flags\n  \"features\": {\n    \"darkMode\": false,\n    \"beta\": true\n  }\n}`;\n\n// Parse to iterate/transform\nconst config = parse<Record<string, unknown>>(json);\n\n// Example: Update all feature flags to false\nfor (const [key, value] of Object.entries(config.features as object)) {\n  if (typeof value === \"boolean\") {\n    json = set(json, `features.${key}`, false); // String path\n    // or: json = set(json, [\"features\", key], false); // Array path\n  }\n}\n\n// Example: Remove fields based on condition\nfor (const key of Object.keys(config)) {\n  if (key.startsWith(\"_\")) {\n    json = remove(json, key); // String path\n    // or: json = remove(json, [key]); // Array path\n  }\n}\n\n// Example: Bulk update from transformed object\nconst updates = Object.fromEntries(\n  Object.entries(config.database as object).map(([k, v]) => [\n    k,\n    typeof v === \"string\" ? v.toUpperCase() : v\n  ])\n);\njson = merge(json, { database: updates });\n```\n\nThe key insight: use `parse()` to read and decide _what_ to change, then use `set()`/`remove()`/`merge()` to apply changes while preserving formatting and comments.\n\n## Building JSONC from Scratch\n\nYou can build a JSONC file from scratch using `set()` with comments:\n\n```ts\nimport { set } from \"aywson\";\n\nlet json = \"{}\";\n\n// Build up the structure with comments (using string paths)\njson = set(json, \"database\", {}, \"Database configuration\");\njson = set(json, \"database.host\", \"localhost\", \"Primary database host\");\njson = set(json, \"database.port\", 5432);\njson = set(json, \"database.ssl\", true, \"Enable SSL in production\");\n\njson = set(json, \"features\", {}, \"Feature flags\");\njson = set(json, \"features.darkMode\", false);\njson = set(json, \"features.beta\", true, \"Beta features - use with caution\");\n// Note: Array paths like [\"database\", \"host\"] are also supported\n\nconsole.log(json);\n```\n\nOutput:\n\n```jsonc\n{\n  // Database configuration\n  \"database\": {\n    // Primary database host\n    \"host\": \"localhost\",\n    \"port\": 5432,\n    // Enable SSL in production\n    \"ssl\": true\n  },\n  // Feature flags\n  \"features\": {\n    \"darkMode\": false,\n    // Beta features - use with caution\n    \"beta\": true\n  }\n}\n```\n\nFor more complex construction, you can also use `merge()`:\n\n```ts\nimport { merge, setComment } from \"aywson\";\n\nlet json = \"{}\";\n\n// Add multiple fields at once\njson = merge(json, {\n  name: \"my-app\",\n  version: \"1.0.0\",\n  scripts: {\n    build: \"tsc\",\n    test: \"vitest\"\n  }\n});\n\n// Add comments where needed\njson = setComment(json, \"scripts\", \"Available npm scripts\");\n// Note: Array paths like [\"scripts\"] are also supported\n```\n\n## CLI\n\n```bash\n# Parse JSONC to JSON (strips comments, handles trailing commas)\naywson parse config.jsonc\n\n# Read a value\naywson get config.json database.host\n\n# Set a value (shows diff and writes to file)\naywson set config.json database.port 5433\n\n# Preview without writing\naywson set --dry-run config.json database.port 5433\n\n# Modify with replace semantics\naywson modify config.json '{\"database\": {\"host\": \"prod.db.com\"}}'\n\n# Merge without deleting existing fields\naywson merge config.json '{\"newField\": true}'\n\n# Remove a field\naywson remove config.json database.debug\n\n# Sort object keys alphabetically\naywson sort config.json\n\n# Sort only a specific nested object\naywson sort config.json dependencies\n\n# Sort without recursing into nested objects\naywson sort config.json --no-deep\n\n# Format/prettify JSONC\naywson format config.json\n\n# Format with 4-space indentation\naywson format config.json --tab-size 4\n\n# Format with tabs instead of spaces\naywson format config.json --tabs\n\n# Get a comment (above, or trailing as fallback)\naywson comment config.json database.host\n\n# Set a comment above a field\naywson comment config.json database.host \"production database\"\n\n# Remove a comment above a field\naywson uncomment config.json database.host\n\n# Get a trailing comment explicitly\naywson comment --trailing config.json database.port\n\n# Set a trailing comment\naywson comment --trailing config.json database.port \"default: 5432\"\n\n# Remove a trailing comment\naywson uncomment --trailing config.json database.port\n```\n\nMutating commands always show a colored diff. Use `--dry-run` (`-n`) to preview without writing.\n\n**Path syntax:** The CLI uses dot-notation: `config.database.host` or bracket notation for indices: `items[0].name`. The API supports both string paths (same as CLI) and array paths: `[\"config\", \"database\", \"host\"]`.\n\n### Security Options\n\n```bash\n# Path validation (prevents path traversal attacks)\naywson get config.json database.host  # ✅ Works\naywson get ../etc/passwd root          # ❌ Blocked by default\naywson get --allow-path-traversal ../etc/passwd root  # ✅ Override (not recommended)\n\n# File size limits (default: 50MB)\naywson parse large.json  # ✅ Works if < 50MB\naywson parse --max-file-size 100000000 large.json  # ✅ Custom limit (100MB)\naywson parse --no-file-size-limit huge.json  # ✅ Disable limit (not recommended)\n\n# JSON parsing limits (via environment variables)\nAYWSON_MAX_JSON_SIZE=20000000 aywson modify config.json '{\"large\": \"data\"}'\nAYWSON_MAX_JSON_DEPTH=200 aywson merge config.json '{\"deep\": {\"nested\": {...}}}'\n```\n\n## Security\n\naywson includes several security features to protect against common attacks when processing untrusted input:\n\n### Path Validation\n\nBy default, the CLI prevents path traversal attacks by validating that all file paths stay within the current working directory. This prevents access to files outside the intended directory (e.g., `../etc/passwd`).\n\n**Override:** Use the `--allow-path-traversal` flag to bypass this protection (not recommended for untrusted input).\n\n```bash\n# Blocked by default\naywson get ../sensitive-file.json key\n\n# Override (use with caution)\naywson get --allow-path-traversal ../sensitive-file.json key\n```\n\n### File Size Limits\n\nTo prevent memory exhaustion attacks, file size is limited by default to **50MB**. Files larger than this limit will be rejected.\n\n**Override:** Use `--max-file-size <bytes>` to set a custom limit, or `--no-file-size-limit` to disable the limit entirely.\n\n```bash\n# Default 50MB limit\naywson parse large.json\n\n# Custom limit (100MB)\naywson parse --max-file-size 104857600 large.json\n\n# No limit (not recommended)\naywson parse --no-file-size-limit huge.json\n```\n\n**Note:** Stdin (`-`) is exempt from file size limits.\n\n### JSON Parsing Limits\n\nJSON input is validated for both size and nesting depth to prevent denial-of-service attacks:\n\n- **Default max size:** 10MB\n- **Default max depth:** 100 levels\n\n**Override:** Set environment variables to customize these limits:\n\n```bash\n# Increase JSON size limit to 20MB\nAYWSON_MAX_JSON_SIZE=20971520 aywson modify config.json '{\"large\": \"data\"}'\n\n# Increase depth limit to 200 levels\nAYWSON_MAX_JSON_DEPTH=200 aywson merge config.json '{\"deep\": {...}}'\n\n# Both limits\nAYWSON_MAX_JSON_SIZE=20971520 AYWSON_MAX_JSON_DEPTH=200 aywson modify config.json '...'\n```\n\nThese limits apply to JSON arguments in `set`, `modify`, and `merge` commands.\n\n### Security Best Practices\n\n1. **Don't disable security features** unless you fully trust your input sources\n2. **Use appropriate limits** for your use case rather than disabling them entirely\n3. **Validate input** before passing it to aywson when processing untrusted data\n4. **Run with least privilege** - don't run aywson as root or with elevated permissions\n5. **Keep dependencies updated** - regularly update aywson and its dependencies for security patches\n\n## Comparison with `comment-json`\n\n[`comment-json`](https://www.npmjs.com/package/comment-json) is another popular package for working with JSON files that contain comments. Here's how the two packages differ:\n\n### Architecture\n\n| Aspect              | aywson                                | comment-json                           |\n| ------------------- | ------------------------------------- | -------------------------------------- |\n| **Approach**        | String-in, string-out                 | Parse to object, modify, stringify     |\n| **Formatting**      | Preserves original formatting exactly | Re-stringifies (may change formatting) |\n| **Mutations**       | Immutable (returns new string)        | Mutable (modifies object in place)     |\n| **Comment storage** | Stays in the string                   | Symbol properties on object            |\n\n### Feature Set\n\n| Category              | aywson                                                       | comment-json                         |\n| --------------------- | ------------------------------------------------------------ | ------------------------------------ |\n| **Core**              | `parse()`                                                    | `parse()`, `stringify()`, `assign()` |\n| **Path operations**   | `get()`, `has()`, `set()`, `remove()`                        | Object/array access                  |\n| **Bulk updates**      | `merge()`, `modify()`                                        | `assign()`                           |\n| **Key manipulation**  | `rename()`, `move()`, `sort()`                               | ❌                                   |\n| **Comment API**       | `getComment()`, `setComment()`, `getTrailingComment()`, etc. | Symbol-based access                  |\n| **Comment positions** | Above field and trailing (same line)                         | Many (before, after, inline, etc.)   |\n| **Extras**            | CLI, `**` prefix to preserve comments                        | `CommentArray` for array operations  |\n\n### When to use aywson\n\n- You need **exact formatting preservation** (whitespace, indentation, trailing commas)\n- You want **surgical edits** without re-serializing the entire file\n- You prefer **immutable operations** that return new strings\n- You need **high-level operations** like rename, move, or sort\n- You want **explicit comment manipulation** with a simple API\n\n### When to use comment-json\n\n- You want to work with a **JavaScript object** and make many modifications before writing back\n- You're comfortable with **Symbol-based comment access**\n- Re-stringifying the entire file is acceptable for your use case\n\n### Example comparison\n\n**comment-json:**\n\n```js\nconst { parse, stringify, assign } = require(\"comment-json\");\n\nconst obj = parse(jsonString);\nobj.database.port = 5433;\nassign(obj.database, { ssl: true });\nconst result = stringify(obj, null, 2);\n```\n\n**aywson:**\n\n```js\nimport { set, merge } from \"aywson\";\n\nlet result = set(jsonString, \"database.port\", 5433);\nresult = merge(result, { database: { ssl: true } });\n// Original formatting preserved exactly\n```\n","readmeFilename":"README.md"}