{"_id":"@1gr14/flat","_rev":"6-715d4f4d5971628239dfc440e41d13aa","name":"@1gr14/flat","dist-tags":{"latest":"0.1.4"},"versions":{"0.0.0":{"name":"@1gr14/flat","version":"0.0.0","license":"MIT","_id":"@1gr14/flat@0.0.0","maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"dist":{"shasum":"7969ddd926bc09e4c7026fef9ec5638a8ae4a5e6","tarball":"https://registry.npmjs.org/@1gr14/flat/-/flat-0.0.0.tgz","fileCount":1,"integrity":"sha512-TwZCqrbQaK98DXiGb0zut3iX6z19S9QNxUzwmLpKwU179Q33vRTijuDQU2AySOERaGD2WGITNs20lUIsqiGkZA==","signatures":[{"sig":"MEUCIQDyQYEXt9sscNPetJwBgNxjSl2h5AkcuTidP35D0fvKPQIgVYcBD4aNAOsLRYndgWCsDARKmiBhx15MoYTVBmys+3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135},"_npmUser":{"name":"iserdmi","email":"iserdmi@gmail.com"},"_npmVersion":"10.9.4","description":"Placeholder — real release follows via CI.","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/flat_0.0.0_1780581623803_0.23989813825244743","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@1gr14/flat","version":"0.1.0","keywords":["query-string","querystring","flatten","unflatten","nested-objects","serialize","url","search-params","bracket-notation","typescript"],"author":{"url":"https://p0nt.dev","name":"Sergei Dmitriev"},"license":"MIT","_id":"@1gr14/flat@0.1.0","maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"homepage":"https://github.com/1gr14/flat#readme","bugs":{"url":"https://github.com/1gr14/flat/issues"},"dist":{"shasum":"73ee0d203a3410936f0e6d61a15260df215a1970","tarball":"https://registry.npmjs.org/@1gr14/flat/-/flat-0.1.0.tgz","fileCount":5,"integrity":"sha512-cAjBwz5cH0DzRLKBgRJyNKt6GFHr4x2WvVqABqC61XicXk05c8sQr0OfSMjPjdd2VORwqSP+dWZ5s1AaN5qZEg==","signatures":[{"sig":"MEUCIGyrCLnPpLYXQoKQMZabdd4KlYFhpcNfVX54hK+8xO3rAiEAoTGQ/Ukxn3+hS3XXhXqIxArEMCv4VbzV83ftWuOSu6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1gr14%2fflat@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30665},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"funding":"https://p0nt.dev/support","gitHead":"7a6b61860feeada96698d67cb28e2c8fff103987","scripts":{"dev":"tsc-watch --preserveWatchOutput --project tsconfig.build.json","lint":"bun run lint:fix .","test":"bun test ./src","build":"tsdown","clean":"rimraf dist && rimraf dist-npm && rimraf node_modules/.cache","smoke":"node scripts/smoke.mjs","types":"bun run types:dev","format":"bun run format:fix .","dev:npm":"tsc-watch --preserveWatchOutput --project tsconfig.build.json --onSuccess 'bun run pack:dist'","prepare":"husky || true","test:us":"bun test ./src --update-snapshots","typesgo":"tsgo --noEmit","lint:fix":"bun run lint:base --fix","pack:dry":"npm pack --dry-run","lint:base":"eslint --cache --cache-location node_modules/.cache/eslint/.eslintcache","pack:dist":"mkdir -p dist-npm && npm pack --pack-destination dist-npm --silent && cd dist-npm && tar -xzf *.tgz && cp -r package/* . && rm -rf package && rm *.tgz","types:dev":"tsc --noEmit","format:fix":"bun run format:base --write","test:watch":"bun test --watch","format:base":"prettier --cache --cache-location node_modules/.cache/prettier/.prettiercache --ignore-path .gitignore --ignore-path .prettierignore","types:build":"tsc --noEmit --project tsconfig.build.json","check:package":"publint && attw --pack . --profile esm-only","test:coverage":"bun test ./src --coverage","pack:dist:hard":"rimraf dist-npm && bun run pack:dist"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0b7c5784-155d-4302-8ada-35f589349377"}},"repository":{"url":"git+https://github.com/1gr14/flat.git","type":"git"},"_npmVersion":"11.16.0","description":"Flatten and unflatten nested objects, and convert them to and from URL query strings — arrays, deep nesting, and custom value encoding.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{},"publishConfig":{"access":"public","provenance":true},"typesVersions":{"*":{"":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^10.4.1","rimraf":"^6.1.3","tsdown":"^0.22.1","publint":"^0.3.21","prettier":"^3.8.3","cross-env":"^10.1.0","tsc-watch":"^7.2.0","@types/bun":"^1.3.14","typescript":"^5.9.3","@types/node":"^20.0.0","lint-staged":"^17.0.7","@commitlint/cli":"^21.0.2","semantic-release":"^25.0.3","typescript-eslint":"^8.60.1","@arethetypeswrong/cli":"^0.18.3","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","prettier-plugin-jsdoc":"^1.8.1","eslint-config-prettier":"^10.1.8","@semantic-release/github":"^12.0.8","@typescript/native-preview":"^7.0.0-dev.20260602.1","@semantic-release/changelog":"^6.0.3","eslint-plugin-no-only-tests":"^3.4.0","@commitlint/config-conventional":"^21.0.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/flat_0.1.0_1780582988948_0.027582285586174926","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@1gr14/flat","version":"0.1.1","keywords":["query-string","querystring","flatten","unflatten","nested-objects","serialize","url","search-params","bracket-notation","typescript"],"author":{"url":"https://1gr14.dev","name":"Sergei Dmitriev"},"license":"MIT","_id":"@1gr14/flat@0.1.1","maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"homepage":"https://github.com/1gr14/flat#readme","bugs":{"url":"https://github.com/1gr14/flat/issues"},"dist":{"shasum":"0bb352601b34b436b27f73b95102d88975da7f89","tarball":"https://registry.npmjs.org/@1gr14/flat/-/flat-0.1.1.tgz","fileCount":5,"integrity":"sha512-eaMN6Q0L7uhuOxM4QhY3mgqLCnl73kzxjhg9bVIClxN3+BuWpCXlT0ySJZMBsO+pVWLF/2UKlNlEQlKPZCezXQ==","signatures":[{"sig":"MEYCIQCgfXNEFI0rU6aqZq3FqUQnoYamJm+7mW9zzrAQMuoBGwIhANYGLsC+MPJI+GTw1kVeD8NhQmP9zA+1FizSku7LqOm1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1gr14%2fflat@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30632},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"funding":"https://1gr14.dev/support","gitHead":"3ba01581bd4a188c72910e55cd74e9af465ff6e4","scripts":{"dev":"tsc-watch --preserveWatchOutput --project tsconfig.build.json","lint":"bun run lint:fix .","test":"bun test ./src","build":"tsdown","clean":"rimraf dist && rimraf dist-npm && rimraf node_modules/.cache","smoke":"node scripts/smoke.mjs","types":"bun run types:dev","format":"bun run format:fix .","dev:npm":"tsc-watch --preserveWatchOutput --project tsconfig.build.json --onSuccess 'bun run pack:dist'","prepare":"husky || true","test:us":"bun test ./src --update-snapshots","typesgo":"tsgo --noEmit","lint:fix":"bun run lint:base --fix","pack:dry":"npm pack --dry-run","lint:base":"eslint --cache --cache-location node_modules/.cache/eslint/.eslintcache","pack:dist":"mkdir -p dist-npm && npm pack --pack-destination dist-npm --silent && cd dist-npm && tar -xzf *.tgz && cp -r package/* . && rm -rf package && rm *.tgz","types:dev":"tsc --noEmit","format:fix":"bun run format:base --write","test:watch":"bun test --watch","format:base":"prettier --cache --cache-location node_modules/.cache/prettier/.prettiercache --ignore-path .gitignore --ignore-path .prettierignore","types:build":"tsc --noEmit --project tsconfig.build.json","check:package":"publint && attw --pack . --profile esm-only","test:coverage":"bun test ./src --coverage","pack:dist:hard":"rimraf dist-npm && bun run pack:dist"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0b7c5784-155d-4302-8ada-35f589349377"}},"repository":{"url":"git+https://github.com/1gr14/flat.git","type":"git"},"_npmVersion":"11.16.0","description":"Flatten and unflatten nested objects, and convert them to and from URL query strings — arrays, deep nesting, and custom value encoding.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{},"publishConfig":{"access":"public","provenance":true},"typesVersions":{"*":{"":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^10.4.1","rimraf":"^6.1.3","tsdown":"^0.22.1","publint":"^0.3.21","prettier":"^3.8.3","cross-env":"^10.1.0","tsc-watch":"^7.2.0","@types/bun":"^1.3.14","typescript":"^5.9.3","@types/node":"^20.0.0","lint-staged":"^17.0.7","@commitlint/cli":"^21.0.2","semantic-release":"^25.0.3","typescript-eslint":"^8.60.1","@arethetypeswrong/cli":"^0.18.3","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","prettier-plugin-jsdoc":"^1.8.1","eslint-config-prettier":"^10.1.8","@semantic-release/github":"^12.0.8","@typescript/native-preview":"^7.0.0-dev.20260602.1","@semantic-release/changelog":"^6.0.3","eslint-plugin-no-only-tests":"^3.4.0","@commitlint/config-conventional":"^21.0.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/flat_0.1.1_1781134600405_0.12996582915454602","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@1gr14/flat","version":"0.1.2","keywords":["query-string","querystring","flatten","unflatten","nested-objects","serialize","url","search-params","bracket-notation","typescript"],"author":{"url":"https://1gr14.dev","name":"Sergei Dmitriev"},"license":"MIT","_id":"@1gr14/flat@0.1.2","maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"homepage":"https://github.com/1gr14/flat#readme","bugs":{"url":"https://github.com/1gr14/flat/issues"},"dist":{"shasum":"15b63d13dad101ae7b585549be187a1d68634908","tarball":"https://registry.npmjs.org/@1gr14/flat/-/flat-0.1.2.tgz","fileCount":5,"integrity":"sha512-Vfol7NG28wKRUXhZw22G2NlvfewfNnMsu1Uyc7VNYFhUBIRi98PjrtIRBV5y06K2xXEKKDo9hpcqcUNHvTjU4g==","signatures":[{"sig":"MEUCIQDH+PghzkF7tSVt+bWwBPz8Z75aoMJRB+to76m+yBT6pwIgXOiwRTJRNweUCKIgor96zyxGYDZbkyC8mtpbr8doL1g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1gr14%2fflat@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30633},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"funding":"https://1gr14.dev/support","gitHead":"54d8b6e8a1b3b9047e82034adeeb172e73a8d2d8","scripts":{"dev":"tsc-watch --preserveWatchOutput --project tsconfig.build.json","lint":"bun run lint:fix .","test":"bun test ./src","build":"tsdown","clean":"rimraf dist && rimraf dist-npm && rimraf node_modules/.cache","smoke":"node scripts/smoke.mjs","types":"bun run types:dev","format":"bun run format:fix .","dev:npm":"tsc-watch --preserveWatchOutput --project tsconfig.build.json --onSuccess 'bun run pack:dist'","prepare":"husky || true","test:us":"bun test ./src --update-snapshots","typesgo":"tsgo --noEmit","lint:fix":"bun run lint:base --fix","pack:dry":"npm pack --dry-run","lint:base":"eslint --cache --cache-location node_modules/.cache/eslint/.eslintcache","pack:dist":"mkdir -p dist-npm && npm pack --pack-destination dist-npm --silent && cd dist-npm && tar -xzf *.tgz && cp -r package/* . && rm -rf package && rm *.tgz","types:dev":"tsc --noEmit","format:fix":"bun run format:base --write","test:watch":"bun test --watch","format:base":"prettier --cache --cache-location node_modules/.cache/prettier/.prettiercache --ignore-path .gitignore --ignore-path .prettierignore","types:build":"tsc --noEmit --project tsconfig.build.json","check:package":"publint && attw --pack . --profile esm-only","test:coverage":"bun test ./src --coverage","pack:dist:hard":"rimraf dist-npm && bun run pack:dist"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0b7c5784-155d-4302-8ada-35f589349377"}},"repository":{"url":"git+https://github.com/1gr14/flat.git","type":"git"},"_npmVersion":"11.16.0","description":"Flatten and unflatten nested objects, and convert them to and from URL query strings — arrays, deep nesting, and custom value encoding.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{},"publishConfig":{"access":"public","provenance":true},"typesVersions":{"*":{"":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^10.4.1","rimraf":"^6.1.3","tsdown":"^0.22.1","publint":"^0.3.21","prettier":"^3.8.3","cross-env":"^10.1.0","tsc-watch":"^7.2.0","@types/bun":"^1.3.14","typescript":"^5.9.3","@types/node":"^20.0.0","lint-staged":"^17.0.7","@commitlint/cli":"^21.0.2","semantic-release":"^25.0.3","typescript-eslint":"^8.60.1","@arethetypeswrong/cli":"^0.18.3","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^13.1.5","prettier-plugin-jsdoc":"^1.8.1","eslint-config-prettier":"^10.1.8","@semantic-release/github":"^12.0.8","@typescript/native-preview":"^7.0.0-dev.20260602.1","@semantic-release/changelog":"^6.0.3","eslint-plugin-no-only-tests":"^3.4.0","@commitlint/config-conventional":"^21.0.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/flat_0.1.2_1781135371102_0.732940867602963","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@1gr14/flat","version":"0.1.3","keywords":["query-string","querystring","flatten","unflatten","nested-objects","serialize","url","search-params","bracket-notation","typescript"],"author":{"url":"https://1gr14.dev","name":"Sergei Dmitriev"},"license":"MIT","_id":"@1gr14/flat@0.1.3","maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"homepage":"https://github.com/1gr14/flat#readme","bugs":{"url":"https://github.com/1gr14/flat/issues"},"dist":{"shasum":"b04f520c7253c3c2f5d2770cade7d8b67aad3bd7","tarball":"https://registry.npmjs.org/@1gr14/flat/-/flat-0.1.3.tgz","fileCount":5,"integrity":"sha512-JW4uUYMhRNFm+WBClWGfAfl0odQ7uXCtFq9MSnxiXZKC1hnvahzG7Z993kljT6Vyla46tQCkIbO0UF11oZuRbw==","signatures":[{"sig":"MEUCIQDoMVM2JtsbQFEJ5g7VuyBHBlB1c2funKukANdNEBNW5AIgW+5iZybhy1mkI6N/18iLaljXvSolw6mM1/KVPlmyoD8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1gr14%2fflat@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30586},"type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=20.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"funding":"https://1gr14.dev/support","gitHead":"2e62dee3ea322b39efc1ae89737e6094f063ee2e","scripts":{"dev":"tsc-watch --preserveWatchOutput --project tsconfig.build.json","lint":"bun run lint:fix .","test":"bun test ./src","build":"tsdown","clean":"rimraf dist && rimraf dist-npm && rimraf node_modules/.cache","smoke":"node scripts/smoke.mjs","types":"bun run types:dev","format":"bun run format:fix .","dev:npm":"tsc-watch --preserveWatchOutput --project tsconfig.build.json --onSuccess 'bun run pack:dist'","prepare":"husky || true","release":"bun run scripts/release.ts","test:us":"bun test ./src --update-snapshots","typesgo":"tsgo --noEmit","lint:fix":"bun run lint:base --fix","pack:dry":"npm pack --dry-run","lint:base":"eslint --cache --cache-location node_modules/.cache/eslint/.eslintcache","pack:dist":"mkdir -p dist-npm && npm pack --pack-destination dist-npm --silent && cd dist-npm && tar -xzf *.tgz && cp -r package/* . && rm -rf package && rm *.tgz","types:dev":"tsc --noEmit","format:fix":"bun run format:base --write","test:watch":"bun test --watch","format:base":"prettier --cache --cache-location node_modules/.cache/prettier/.prettiercache --ignore-path .gitignore --ignore-path .prettierignore","types:build":"tsc --noEmit --project tsconfig.build.json","check:channel":"bun run scripts/check-channel.ts","check:package":"publint && attw --pack . --profile esm-only","test:coverage":"bun test ./src --coverage","pack:dist:hard":"rimraf dist-npm && bun run pack:dist","publish:packages":"bun run scripts/publish.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0b7c5784-155d-4302-8ada-35f589349377"}},"repository":{"url":"git+https://github.com/1gr14/flat.git","type":"git"},"_npmVersion":"11.17.0","description":"Flatten and unflatten nested objects, and convert them to and from URL query strings — arrays, deep nesting, and custom value encoding.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{},"publishConfig":{"access":"public","provenance":true},"typesVersions":{"*":{"":["./dist/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^10.4.1","rimraf":"^6.1.3","tsdown":"^0.22.1","publint":"^0.3.21","prettier":"^3.8.3","cross-env":"^10.1.0","tsc-watch":"^7.2.0","@types/bun":"^1.3.14","typescript":"^5.9.3","@types/node":"^20.0.0","lint-staged":"^17.0.7","@commitlint/cli":"^21.0.2","typescript-eslint":"^8.60.1","@arethetypeswrong/cli":"^0.18.3","prettier-plugin-jsdoc":"^1.8.1","eslint-config-prettier":"^10.1.8","@typescript/native-preview":"^7.0.0-dev.20260602.1","eslint-plugin-no-only-tests":"^3.4.0","@commitlint/config-conventional":"^21.0.2"},"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/flat_0.1.3_1781521131123_0.9054999454329027","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@1gr14/flat","version":"0.1.4","description":"Flatten and unflatten nested objects, and convert them to and from URL query strings — arrays, deep nesting, and custom value encoding.","keywords":["query-string","querystring","flatten","unflatten","nested-objects","serialize","url","search-params","bracket-notation","typescript"],"license":"MIT","author":{"name":"Sergei Dmitriev","url":"https://1gr14.dev"},"homepage":"https://github.com/1gr14/flat#readme","repository":{"type":"git","url":"git+https://github.com/1gr14/flat.git"},"bugs":{"url":"https://github.com/1gr14/flat/issues"},"funding":"https://1gr14.dev/support","type":"module","sideEffects":false,"types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"typesVersions":{"*":{"":["./dist/index.d.ts"]}},"scripts":{"dev":"tsc-watch --preserveWatchOutput --project tsconfig.build.json","dev:npm":"tsc-watch --preserveWatchOutput --project tsconfig.build.json --onSuccess 'bun run pack:dist'","build":"tsdown","test":"bun test ./src","test:us":"bun test ./src --update-snapshots","test:watch":"bun test --watch","test:coverage":"bun test ./src --coverage","smoke":"node scripts/smoke.mjs","check:package":"publint && attw --pack . --profile esm-only","lint":"bun run lint:fix .","lint:base":"eslint --cache --cache-location node_modules/.cache/eslint/.eslintcache","lint:fix":"bun run lint:base --fix","format":"bun run format:fix .","format:base":"prettier --cache --cache-location node_modules/.cache/prettier/.prettiercache --ignore-path .gitignore --ignore-path .prettierignore","format:fix":"bun run format:base --write","types:build":"node node_modules/typescript/bin/tsc --noEmit --project tsconfig.build.json","types":"node node_modules/typescript-7/bin/tsc --noEmit","types:6":"node node_modules/typescript/bin/tsc --noEmit","release":"bun run scripts/release.ts","publish:packages":"bun run scripts/publish.ts","check:channel":"bun run scripts/check-channel.ts","pack:dry":"npm pack --dry-run","pack:dist":"mkdir -p dist-npm && npm pack --pack-destination dist-npm --silent && cd dist-npm && tar -xzf *.tgz && cp -r package/* . && rm -rf package && rm *.tgz","pack:dist:hard":"rimraf dist-npm && bun run pack:dist","prepare":"husky || true","clean":"rimraf dist && rimraf dist-npm && rimraf node_modules/.cache"},"dependencies":{},"peerDependencies":{},"devDependencies":{"@arethetypeswrong/cli":"^0.18.3","@commitlint/cli":"^21.0.2","@commitlint/config-conventional":"^21.0.2","@types/bun":"^1.3.14","@types/node":"^20.0.0","eslint":"^10.4.1","eslint-config-prettier":"^10.1.8","eslint-plugin-no-only-tests":"^3.4.0","husky":"^9.1.7","lint-staged":"^17.0.7","prettier":"^3.8.3","prettier-plugin-jsdoc":"^1.8.1","publint":"^0.3.21","rimraf":"^6.1.3","tsc-watch":"^7.2.0","tsdown":"^0.22.1","typescript":"^6.0.0","typescript-7":"npm:typescript@7.0.1-rc","typescript-eslint":"^8.60.1"},"engines":{"node":">=20.0.0","bun":">=1.0.0"},"publishConfig":{"access":"public","provenance":true},"gitHead":"e6849aaa9207f97b7c2cc683a6d2fb7312bb4e8e","_id":"@1gr14/flat@0.1.4","_nodeVersion":"24.16.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-M5QU8ShQojb/bI6I/otPOmENWLtp07fmE9jusKaLjmc9LUj9Owbrwk3JhbK47sMD10RrIkiJ+tuv3cW4Nh3SkQ==","shasum":"b90490deced94b594b782feab6a0583e9205c60c","tarball":"https://registry.npmjs.org/@1gr14/flat/-/flat-0.1.4.tgz","fileCount":5,"unpackedSize":31243,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@1gr14%2fflat@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCc1phNxlx9KIFg1MnhyW/MXjX0+zme2Hhm8Dh1KOgaBQIgHyXP/1UCXRzGcweyQu9QqcndxiRRPKvebXHLo5V8V30="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:0b7c5784-155d-4302-8ada-35f589349377"}},"directories":{},"maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/flat_0.1.4_1782131287802_0.40747355956986575"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T14:00:23.579Z","modified":"2026-06-22T12:28:08.333Z","0.0.0":"2026-06-04T14:00:23.931Z","0.1.0":"2026-06-04T14:23:09.082Z","0.1.1":"2026-06-10T23:36:40.678Z","0.1.2":"2026-06-10T23:49:31.235Z","0.1.3":"2026-06-15T10:58:51.247Z","0.1.4":"2026-06-22T12:28:07.994Z"},"bugs":{"url":"https://github.com/1gr14/flat/issues"},"author":{"name":"Sergei Dmitriev","url":"https://1gr14.dev"},"license":"MIT","homepage":"https://github.com/1gr14/flat#readme","keywords":["query-string","querystring","flatten","unflatten","nested-objects","serialize","url","search-params","bracket-notation","typescript"],"repository":{"type":"git","url":"git+https://github.com/1gr14/flat.git"},"description":"Flatten and unflatten nested objects, and convert them to and from URL query strings — arrays, deep nesting, and custom value encoding.","maintainers":[{"name":"iserdmi","email":"iserdmi@gmail.com"}],"readme":"# @1gr14/flat\n\n> Flatten a nested object into flat `key → value` pairs and back — the one piece\n> of code behind both URL query strings and multipart `FormData`. Arrays, deep\n> nesting, files, and custom encoding included.\n\n[![CI](https://github.com/1gr14/flat/actions/workflows/ci.yml/badge.svg)](https://github.com/1gr14/flat/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/@1gr14/flat.svg)](https://www.npmjs.com/package/@1gr14/flat)\n[![coverage](https://codecov.io/gh/1gr14/flat/branch/main/graph/badge.svg)](https://codecov.io/gh/1gr14/flat)\n[![gzip](https://deno.bundlejs.com/badge?q=@1gr14/flat)](https://bundlejs.com/?q=@1gr14/flat)\n[![license](https://img.shields.io/npm/l/@1gr14/flat.svg)](./LICENSE)\n\n<!-- docs:start -->\n\nURL query strings and multipart `FormData` look like two different problems, but\nunderneath they're the same one: each can only carry a **flat** list of\n`key → value` pairs. To push a **nested** object through either, you flatten it\nto bracket-notation keys on one side and rebuild it on the other — and that work\nis byte-for-byte identical whether the destination is a URL or a `FormData`.\n\n`qs` does the query-string half well, but it's heavier and aimed only at search\nparams. Building the [Point0](https://1gr14.dev/point0) framework, I needed to\nflatten _any_ object for both a search string and a `FormData` body — the same\ncode, two transports — so it belongs in one small package. That's `flat`.\n\nTwo pairs of functions, one for each transport. `serialize` / `deserialize` give\nyou the flat bracket-notation map (what you feed to `FormData`); `stringify` /\n`parse` add URL encoding on top and hand you a query string. Arrays, deep\nnesting, and repeated keys just work; `File` / `Blob` values ride along inside\n`FormData` untouched; and prototype-polluting keys are dropped.\n\n```ts\nimport { serialize, deserialize, stringify, parse } from '@1gr14/flat'\n\nconst obj = { q: 'shoes', filters: { price: { min: 10 } }, tags: ['a', 'b'] }\n\n// nested object ⇄ flat bracket-notation map (what you append to FormData)\nconst serialized = serialize(obj)\n// { q: 'shoes', 'filters[price][min]': 10, 'tags[0]': 'a', 'tags[1]': 'b' }  — types kept\nconst deserialized = deserialize(serialized)\n// { q: 'shoes', filters: { price: { min: 10 } }, tags: ['a', 'b'] }\n\n// nested object ⇄ URL query string\nconst stringified = stringify(obj)\n// 'q=shoes&filters[price][min]=10&tags[0]=a&tags[1]=b'  (brackets URL-encoded)\nconst parsed = parse(stringified)\n// { q: 'shoes', filters: { price: { min: '10' } }, tags: ['a', 'b'] }  — all strings\n```\n\nAll four are also bundled on a `flat` namespace (`flat.serialize`, …), which is\nthe package's default export — handy if you'd rather not name every import.\n\n## Install\n\n```sh\nbun add @1gr14/flat\n# or: npm install / pnpm add / yarn add\n```\n\nBun 1+ or Node.js 20+. ESM only.\n\n## Query strings: `stringify` and `parse`\n\n`stringify` turns a nested object into a query string; `parse` turns it back.\nArrays and nested objects round-trip, and repeated keys collapse into an array:\n\n```ts\nstringify({ x: '1', deep: { y: 2 }, list: ['a', 'b'] })\n// 'x=1&deep[y]=2&list[0]=a&list[1]=b'  (brackets URL-encoded)\n\nparse('x=1&deep[y]=2&list[0]=a&list[1]=b')\n// { x: '1', deep: { y: '2' }, list: ['a', 'b'] }\n\nparse('a=1&a=2') // { a: ['1', '2'] }  — repeated keys → array\n```\n\n`parse` accepts a string with or without a leading `?`, decodes percent-escapes,\nand reads `+` as a space. Every parsed value is a **string** — query strings\ncarry no types — so coerce on your side, or use `fromPrimitiveString` (below).\n\n## Flatten: `serialize` and `deserialize`\n\nNeed the flat key/value map instead of a string? `serialize` flattens a nested\nobject to bracket-notation keys; `deserialize` rebuilds it. Unlike a query\nstring, this keeps the original leaf **values** as-is — numbers stay numbers,\nand a `File` stays a `File`:\n\n```ts\nserialize({ x: 1, user: { profile: { name: 'john' } }, z: ['a', 'b'] })\n// { x: 1, 'user[profile][name]': 'john', 'z[0]': 'a', 'z[1]': 'b' }\n\ndeserialize({ 'user[profile][name]': 'john', 'z[0]': 'a', 'z[1]': 'b' })\n// { user: { profile: { name: 'john' } }, z: ['a', 'b'] }\n```\n\n`deserialize` drops the prototype-polluting keys `__proto__`, `prototype`, and\n`constructor`, so it's safe to run on untrusted input. (`serialize` skips them\ntoo.)\n\n## FormData\n\n`FormData` is flat as well — and unlike a query string it can carry files.\n`serialize` flattens your object while keeping `File` / `Blob` values intact, so\nyou append each entry as-is; on the server, read the entries back and\n`deserialize`:\n\n```ts\n// client — nested object (with a file) → FormData\nconst flat = serialize({ user: { name: 'Ada' }, avatar: fileFromInput })\nconst body = new FormData()\nfor (const [key, value] of Object.entries(flat)) {\n  for (const item of Array.isArray(value) ? value : [value]) {\n    body.append(key, item) // 'user[name]' → 'Ada', 'avatar' → the File\n  }\n}\n\n// server — FormData → nested object, file and all\nconst flatEntries = Object.fromEntries(body.entries())\ndeserialize(flatEntries) // { user: { name: 'Ada' }, avatar: File }\n```\n\n## Pair it with a serializer (Dates, numbers, ...)\n\nThere's a catch: `FormData` turns every non-`Blob` value into a string via\n`String(value)`, so a `Date`, number, or boolean won't survive the trip on its\nown. The fix is the serializer you're already using (superjson, or your own):\nlet it encode each leaf, and let `flat` handle the structure — files stay as\n`Blob`s.\n\n```ts\nimport { serialize, deserialize } from '@1gr14/flat'\nimport superjson from 'superjson'\n\n// client — encode each non-file leaf\nconst flat = serialize({\n  user: { name: 'Ada', since: new Date() },\n  avatar: file,\n})\nconst body = new FormData()\nfor (const [key, value] of Object.entries(flat)) {\n  for (const item of Array.isArray(value) ? value : [value]) {\n    body.append(key, item instanceof Blob ? item : superjson.stringify(item))\n  }\n}\n\n// server — decode each non-file leaf, then rebuild the object\nconst flatEntries = Object.fromEntries(\n  [...body.entries()].map(([key, value]) => [\n    key,\n    value instanceof Blob ? value : superjson.parse(value),\n  ]),\n)\ndeserialize(flatEntries) // { user: { name: 'Ada', since: Date }, avatar: File }\n```\n\nThis is exactly what `Point0` does: run the body through its serializer, flatten\nwith `flat`, then append — files as `Blob`s, everything else encoded.\n\n## Array keys: `arrayIndexes`\n\nBy default arrays use numeric indexes (`tags[0]`), which round-trip in order.\nPass `arrayIndexes: false` for empty brackets (`tags[]`) instead — the form many\nbackends and HTML forms expect:\n\n```ts\nserialize({ tags: ['x', 'y'] }) // { 'tags[0]': 'x', 'tags[1]': 'y' }\nserialize({ tags: ['x', 'y'] }, { arrayIndexes: false }) // { 'tags[]': ['x', 'y'] }\n```\n\n`stringify` takes the same option, since it flattens through `serialize` first.\n\n## Custom value encoding: `toPrimitiveString` / `fromPrimitiveString`\n\n`stringify` writes each leaf with `toPrimitiveString`, and you can override it\nto control exactly how values are written — return `undefined` to drop a key\nentirely. `parse` takes the inverse, `fromPrimitiveString`, to post-process each\ndecoded value:\n\n```ts\nstringify(\n  { id: 7, enabled: true, secret: 'skip-me' },\n  {\n    encode: false,\n    toPrimitiveString: (value) =>\n      value === 'skip-me' ? undefined : `v:${value}`,\n  },\n)\n// 'id=v:7&enabled=v:true'  — `secret` dropped\n```\n\nThe default `toPrimitiveString` is exported too, so you can wrap it instead of\nreimplementing it: it stringifies numbers/booleans/bigints, `JSON.stringify`s\nobjects, and drops `null` / `undefined` / blank strings.\n\n## Unencoded output: `encode`\n\nBy default `stringify` percent-encodes keys and values. Pass `encode: false` for\na human-readable query string — handy for prettier URLs. Note: unencoded output\ncan be ambiguous when keys or values contain `&`, `=`, or `?`.\n\n```ts\nstringify({ user: { name: 'Ada' } }) // 'user%5Bname%5D=Ada'\nstringify({ user: { name: 'Ada' } }, { encode: false }) // 'user[name]=Ada'\n```\n\n## Depth limit: `maxDepth`\n\nEvery function takes `maxDepth` (default `64`). Paths deeper than the limit stay\nflat instead of nesting — a guard against pathological input:\n\n```ts\nstringify({ a: { b: { c: 1 } } }, { maxDepth: 2, encode: false }) // 'a[b]={\"c\":1}'\ndeserialize({ 'a[b][c]': '1' }, { maxDepth: 2 }) // { 'a[b][c]': '1' }  — kept flat\n```\n\n## Requirements\n\n- **Bun 1+** or **Node.js 20+** (ESM only)\n- **TypeScript 5+** (optional — works in plain JS too)\n\n<!-- docs:end -->\n\n## Community\n\nQuestions, bugs, or want to hang with other builders? Join the 1gr14 community —\none hub for all our open-source projects, this one included. Get help, share\nwhat you built, or just say hi:\n[1gr14.dev/#community](https://1gr14.dev/#community)\n\n## Contributing\n\nIssues and PRs welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md) and the\n[Code of Conduct](./CODE_OF_CONDUCT.md). Commits follow\n[Conventional Commits](https://www.conventionalcommits.org/). Security reports:\n[SECURITY.md](./SECURITY.md).\n\n## License\n\n[MIT](./LICENSE)\n\n---\n\nMade by [1gr14](https://1gr14.dev), driven by\n[community](https://1gr14.dev/#community)\n","readmeFilename":"README.md"}