{"_id":"@aoxborrow/dns-client","_rev":"7-7401a4a4b086c4011e15edce8e18470d","name":"@aoxborrow/dns-client","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@aoxborrow/dns-client","version":"0.1.0","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","_id":"@aoxborrow/dns-client@0.1.0","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"homepage":"https://github.com/aoxborrow/dns-client","bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"dist":{"shasum":"7fe3e10dbafea8d9194e9ebbea134e2ffd68c11e","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.1.0.tgz","fileCount":122,"integrity":"sha512-+dls7Is6ZgtnW+3yGPfRS1LU4C0LsFbK8BBSiA7/0g/sc+NPQTveoYLDr2f3N5nLH1i7xoDfMsThMr807pY2bQ==","signatures":[{"sig":"MEQCIBwGLTcZ59s9IB6lnW32or/f4FsYhC9FrO/2ghv620DeAiA5kv7XWEVMKkgVOaIVG3hALRZpV723Bc8ooRYkXmvyPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":744008},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"29fdd6b2eb111edeb454ae05861ecd0fece81645","scripts":{"ts":"npm run lint","tsc":"tsc --noEmit","lint":"npm run tsc && npm run eslint && npm run prettier","test":"jest --verbose","build":"tsc --project tsconfig.build.json","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","eslint":"eslint --cache --cache-location .eslintcache .","ts:fix":"npm run lint:fix","clear:ts":"rm -rf tsconfig.tsbuildinfo","lint:fix":"npm run eslint:fix && npm run prettier:fix","prettier":"prettier --check .","test:name":"jest --verbose --testNamePattern","test:path":"jest --verbose --testPathPattern","typecheck":"npm run tsc","clear:jest":"npx jest --clearCache","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:failed":"jest --verbose --onlyFailures","clear:eslint":"rm -rf .eslintcache","prettier:fix":"prettier --write --list-different .","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPattern","test:integration":"jest --testPathPattern='.*\\.integration\\.test.*$'","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test:no-integration":"jest --noStackTrace --testPathPattern='^(?!.*\\.integration\\.test).*$'"},"_npmUser":{"name":"aoxborrow","email":"aaron@oxborrow.com"},"repository":{"url":"git+https://github.com/aoxborrow/dns-client.git","type":"git"},"_npmVersion":"11.6.1","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","directories":{},"sideEffects":false,"_nodeVersion":"22.15.1","dependencies":{"dns-packet":"^5.6.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jest":"^29.7.0","eslint":"^9.37.0","ts-jest":"^29.4.5","prettier":"^3.6.2","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/jest":"^29.5.14","@types/node":"^18.19.0","@eslint/eslintrc":"^3.3.1","@types/dns-packet":"^5.6.5","typescript-eslint":"^8.46.1","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.1","@typescript-eslint/eslint-plugin":"^8.46.1","eslint-import-resolver-typescript":"^4.4.4"},"_npmOperationalInternal":{"tmp":"tmp/dns-client_0.1.0_1762355806922_0.6702851374532299","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@aoxborrow/dns-client","version":"0.1.4","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","_id":"@aoxborrow/dns-client@0.1.4","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"homepage":"https://github.com/aoxborrow/dns-client","bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"dist":{"shasum":"390eb21405355c39acf4b3f9a8ff0774622031b7","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.1.4.tgz","fileCount":62,"integrity":"sha512-p9dLNrxvdF6JMq1RCO2t86mC4QhlX2MnKyxKLdl7eRDMy0OPDOY1EKGriN7rVuWgB5/0ZjC3EqetInOsBohF2w==","signatures":[{"sig":"MEUCIHLJiFDS6C22NM9LXTpzSyh1kNCQ7w6zMoZViAy5AR8eAiEAn1ImZ/cdbGr7KjVl3N8sv6DX9cL6OWW8Pg/SofxoUdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aoxborrow%2fdns-client@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":468414},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"1a88f2a10ab53eaf3dbad9a33f3162fcc3fc4529","scripts":{"ts":"npm run lint","tsc":"tsc --noEmit","lint":"npm run tsc && npm run eslint && npm run prettier","test":"jest --verbose","build":"tsc --project tsconfig.build.json","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","eslint":"eslint --cache --cache-location .eslintcache .","ts:fix":"npm run lint:fix","clear:ts":"rm -rf tsconfig.tsbuildinfo","lint:fix":"npm run eslint:fix && npm run prettier:fix","prettier":"prettier --check .","test:name":"jest --verbose --testNamePattern","test:path":"jest --verbose --testPathPattern","typecheck":"npm run tsc","clear:jest":"npx jest --clearCache","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:failed":"jest --verbose --onlyFailures","clear:eslint":"rm -rf .eslintcache","prettier:fix":"prettier --write --list-different .","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPattern","test:integration":"jest --testPathPattern='.*\\.integration\\.test.*$'","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test:no-integration":"jest --noStackTrace --testPathPattern='^(?!.*\\.integration\\.test).*$'"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea7f834b-4f6c-4876-928d-dc23bc1431c7"}},"repository":{"url":"git+https://github.com/aoxborrow/dns-client.git","type":"git"},"_npmVersion":"11.6.2","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"dns-packet":"^5.6.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jest":"^29.7.0","eslint":"^9.39.1","ts-jest":"^29.4.5","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/jest":"^29.5.14","@types/node":"^18.19.0","@eslint/eslintrc":"^3.3.1","@types/dns-packet":"^5.6.5","typescript-eslint":"^8.46.3","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.3","@typescript-eslint/eslint-plugin":"^8.46.3","eslint-import-resolver-typescript":"^4.4.4"},"_npmOperationalInternal":{"tmp":"tmp/dns-client_0.1.4_1762377792494_0.8805162884574769","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@aoxborrow/dns-client","version":"0.1.5","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","_id":"@aoxborrow/dns-client@0.1.5","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"homepage":"https://github.com/aoxborrow/dns-client","bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"dist":{"shasum":"f3089dfc204a9f9510271c7a024f9d4cede92955","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.1.5.tgz","fileCount":62,"integrity":"sha512-Wt6MyJH9UWtvLG0JiSRto83CGHehQAL4arTWe4lF7oIq6yD1xbUkrkP+3IL223m4dWh/wSi0XBEvy4xwcqV66w==","signatures":[{"sig":"MEUCIG/ht+wvQzQQuwwm9TRyR0PADdh2ss5P/xzm3cchFN6AAiEA4pfFCRqBvaHbRLUxC3XAPpk5MIreMLMohhKJzytUHgk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aoxborrow%2fdns-client@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":469258},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"05313043ddcf1e25f92b16127dad067078045bd9","scripts":{"ts":"npm run lint","tsc":"tsc --noEmit","lint":"npm run tsc && npm run eslint && npm run prettier","test":"jest --verbose","build":"tsc --project tsconfig.build.json","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","eslint":"eslint --cache --cache-location .eslintcache .","ts:fix":"npm run lint:fix","clear:ts":"rm -rf tsconfig.tsbuildinfo","lint:fix":"npm run eslint:fix && npm run prettier:fix","prettier":"prettier --check .","test:name":"jest --verbose --testNamePattern","test:path":"jest --verbose --testPathPattern","typecheck":"npm run tsc","clear:jest":"npx jest --clearCache","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:failed":"jest --verbose --onlyFailures","clear:eslint":"rm -rf .eslintcache","prettier:fix":"prettier --write --list-different .","release:major":"npm version major && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:minor":"npm version minor && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:patch":"npm version patch && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPattern","test:integration":"jest --testPathPattern='.*\\.integration\\.test.*$'","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test:no-integration":"jest --noStackTrace --testPathPattern='^(?!.*\\.integration\\.test).*$'"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea7f834b-4f6c-4876-928d-dc23bc1431c7"}},"repository":{"url":"git+https://github.com/aoxborrow/dns-client.git","type":"git"},"_npmVersion":"11.6.2","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"dns-packet":"^5.6.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jest":"^29.7.0","eslint":"^9.39.1","ts-jest":"^29.4.5","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/jest":"^29.5.14","@types/node":"^18.19.0","@eslint/eslintrc":"^3.3.1","@types/dns-packet":"^5.6.5","typescript-eslint":"^8.46.3","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.3","@typescript-eslint/eslint-plugin":"^8.46.3","eslint-import-resolver-typescript":"^4.4.4"},"_npmOperationalInternal":{"tmp":"tmp/dns-client_0.1.5_1762380498149_0.24322372885714882","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@aoxborrow/dns-client","version":"0.1.6","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","_id":"@aoxborrow/dns-client@0.1.6","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"homepage":"https://github.com/aoxborrow/dns-client","bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"dist":{"shasum":"6cb28e9c014816d52176b0af890f197aa8cd91e7","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.1.6.tgz","fileCount":62,"integrity":"sha512-rq/U2qA4jvM0+YwoySNf94mmGP2hL0hcjrxiGvSHCfgUn5vVu8Q194NhCuuznXRiIam8KhJGVu3SX6PD0GgP0A==","signatures":[{"sig":"MEYCIQC9aixKnLYfTjM+V4qPh/KLpxrjj2eF4vLZaHdhcqKJuQIhAKqA9vICGiBWQLwmc0DMRq7ENKZqkFtBbty2Gcdje+vW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aoxborrow%2fdns-client@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":475663},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"c15da0e8bc28486e8e7cd14adbdbbcf7e60c55a9","scripts":{"ts":"npm run lint","tsc":"tsc --noEmit","lint":"npm run tsc && npm run eslint && npm run prettier","test":"jest --verbose","build":"tsc --project tsconfig.build.json","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","eslint":"eslint --cache --cache-location .eslintcache .","ts:fix":"npm run lint:fix","clear:ts":"rm -rf tsconfig.tsbuildinfo","lint:fix":"npm run eslint:fix && npm run prettier:fix","prettier":"prettier --check .","test:name":"jest --verbose --testNamePattern","test:path":"jest --verbose --testPathPattern","typecheck":"npm run tsc","clear:jest":"npx jest --clearCache","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:failed":"jest --verbose --onlyFailures","clear:eslint":"rm -rf .eslintcache","prettier:fix":"prettier --write --list-different .","release:major":"npm version major && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:minor":"npm version minor && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:patch":"npm version patch && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPattern","test:integration":"jest --testPathPattern='.*\\.integration\\.test.*$'","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test:no-integration":"jest --noStackTrace --testPathPattern='^(?!.*\\.integration\\.test).*$'"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea7f834b-4f6c-4876-928d-dc23bc1431c7"}},"repository":{"url":"git+https://github.com/aoxborrow/dns-client.git","type":"git"},"_npmVersion":"11.6.2","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"dns-packet":"^5.6.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jest":"^29.7.0","eslint":"^9.39.1","ts-jest":"^29.4.5","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/jest":"^29.5.14","@types/node":"^18.19.0","@eslint/eslintrc":"^3.3.1","@types/dns-packet":"^5.6.5","typescript-eslint":"^8.46.3","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.3","@typescript-eslint/eslint-plugin":"^8.46.3","eslint-import-resolver-typescript":"^4.4.4"},"_npmOperationalInternal":{"tmp":"tmp/dns-client_0.1.6_1762383741540_0.2840646390009851","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@aoxborrow/dns-client","version":"0.1.7","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","_id":"@aoxborrow/dns-client@0.1.7","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"homepage":"https://github.com/aoxborrow/dns-client","bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"dist":{"shasum":"678ff6eb5971863cd9bf5ce52f9613d829eeff4c","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.1.7.tgz","fileCount":62,"integrity":"sha512-2vfWTFRZaDBs/e//NMhYv3eh83/MMRzYDvIGZBdmNH45ObIk6w7Hj8ehForB3j2nQND2VTJbzNVpGUHivLldaQ==","signatures":[{"sig":"MEUCIQC7GnU7OEM3Veg3+Ux5oo1KIV1U+aj1rg4MPGlTZj+ADgIgOkxvSHrOvsaWsiUfOMLinFfKzp6U9/S0aepscgJM0Ic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aoxborrow%2fdns-client@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":476811},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"9fee24e3c243e37b2dbeead60f8892d33d875fb6","scripts":{"ts":"npm run lint","tsc":"tsc --noEmit","lint":"npm run tsc && npm run eslint && npm run prettier","test":"jest --verbose","build":"tsc --project tsconfig.build.json","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","eslint":"eslint --cache --cache-location .eslintcache .","ts:fix":"npm run lint:fix","clear:ts":"rm -rf tsconfig.tsbuildinfo","lint:fix":"npm run eslint:fix && npm run prettier:fix","prettier":"prettier --check .","test:name":"jest --verbose --testNamePattern","test:path":"jest --verbose --testPathPattern","typecheck":"npm run tsc","clear:jest":"npx jest --clearCache","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:failed":"jest --verbose --onlyFailures","clear:eslint":"rm -rf .eslintcache","prettier:fix":"prettier --write --list-different .","release:major":"npm version major && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:minor":"npm version minor && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:patch":"npm version patch && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPattern","test:integration":"jest --testPathPattern='.*\\.integration\\.test.*$'","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test:no-integration":"jest --noStackTrace --testPathPattern='^(?!.*\\.integration\\.test).*$'"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea7f834b-4f6c-4876-928d-dc23bc1431c7"}},"repository":{"url":"git+https://github.com/aoxborrow/dns-client.git","type":"git"},"_npmVersion":"11.6.2","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"buffer":"^6.0.3","dns-packet":"^5.6.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jest":"^29.7.0","eslint":"^9.39.1","ts-jest":"^29.4.5","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/jest":"^29.5.14","@types/node":"^18.19.0","@eslint/eslintrc":"^3.3.1","@types/dns-packet":"^5.6.5","typescript-eslint":"^8.46.3","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.3","@typescript-eslint/eslint-plugin":"^8.46.3","eslint-import-resolver-typescript":"^4.4.4"},"_npmOperationalInternal":{"tmp":"tmp/dns-client_0.1.7_1763155789353_0.32721683246877675","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@aoxborrow/dns-client","version":"0.1.8","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","_id":"@aoxborrow/dns-client@0.1.8","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"homepage":"https://github.com/aoxborrow/dns-client","bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"dist":{"shasum":"afc88218c97e5ce46839fb69d82e97956b485392","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.1.8.tgz","fileCount":62,"integrity":"sha512-jbwUWM38OF5JD8BMFEp6SWm47WGLXmTtcfwx+S4WEDQ+U+dePxLGFTyxAOdFLX7qcb6Q9YpaGcpGM9QxSG1PaA==","signatures":[{"sig":"MEYCIQCjxE/dlNtdJHG0eQL3OcZFltMpjcn89BIqCk2kUPDk0AIhAJXz3qBJtQFrzhRUHuTiztyLxY6TiWz+e1hFtVZS27wF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aoxborrow%2fdns-client@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":477125},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"gitHead":"e5af4a9300514b24e3eee7cbd9d6d2bd7a7854ab","scripts":{"ts":"npm run lint","tsc":"tsc --noEmit","lint":"npm run tsc && npm run eslint && npm run prettier","test":"jest --verbose","build":"tsc --project tsconfig.build.json","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","eslint":"eslint --cache --cache-location .eslintcache .","ts:fix":"npm run lint:fix","clear:ts":"rm -rf tsconfig.tsbuildinfo","lint:fix":"npm run eslint:fix && npm run prettier:fix","prettier":"prettier --check .","test:name":"jest --verbose --testNamePattern","test:path":"jest --verbose --testPathPattern","typecheck":"npm run tsc","clear:jest":"npx jest --clearCache","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:failed":"jest --verbose --onlyFailures","clear:eslint":"rm -rf .eslintcache","prettier:fix":"prettier --write --list-different .","release:major":"npm version major && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:minor":"npm version minor && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:patch":"npm version patch && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPattern","test:integration":"jest --testPathPattern='.*\\.integration\\.test.*$'","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test:no-integration":"jest --noStackTrace --testPathPattern='^(?!.*\\.integration\\.test).*$'"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea7f834b-4f6c-4876-928d-dc23bc1431c7"}},"repository":{"url":"git+https://github.com/aoxborrow/dns-client.git","type":"git"},"_npmVersion":"11.6.2","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","directories":{},"sideEffects":false,"_nodeVersion":"20.19.5","dependencies":{"buffer":"^6.0.3","dns-packet":"^5.6.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jest":"^29.7.0","eslint":"^9.39.1","ts-jest":"^29.4.5","prettier":"^3.6.2","@eslint/js":"^9.39.1","typescript":"^5.9.3","@types/jest":"^29.5.14","@types/node":"^18.19.0","@eslint/eslintrc":"^3.3.1","@types/dns-packet":"^5.6.5","typescript-eslint":"^8.46.3","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.46.3","@typescript-eslint/eslint-plugin":"^8.46.3","eslint-import-resolver-typescript":"^4.4.4"},"_npmOperationalInternal":{"tmp":"tmp/dns-client_0.1.8_1763504144806_0.9891873632702124","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aoxborrow/dns-client","version":"0.2.0","description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","homepage":"https://github.com/aoxborrow/dns-client","repository":{"type":"git","url":"git+https://github.com/aoxborrow/dns-client.git"},"bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"engines":{"node":">=18.0.0"},"sideEffects":false,"scripts":{"build":"tsup","lint":"npm run tsc && npm run eslint && npm run prettier","lint:fix":"npm run eslint:fix && npm run prettier:fix","eslint":"eslint --cache --cache-location .eslintcache .","eslint:fix":"eslint --cache --cache-location .eslintcache . --fix","prettier":"prettier --check .","prettier:fix":"prettier --write --list-different .","ts":"npm run lint","ts:fix":"npm run lint:fix","tsc":"tsc --noEmit","typecheck":"npm run tsc","typecheck:verbose":"tsc --noEmit --listFiles --diagnostics","test":"jest --verbose","test:path":"jest --verbose --testPathPatterns","test:name":"jest --verbose --testNamePattern","test:path:debug":"jest --verbose --runInBand --bail=1 --testPathPatterns","test:name:debug":"jest --verbose --runInBand --bail=1 --testNamePattern","test:failed":"jest --verbose --onlyFailures","test:retry":"jest --verbose --passWithNoTests --onlyFailures","test:no-integration":"jest --noStackTrace --testPathPatterns='^(?!.*\\.integration\\.test).*$'","test:integration":"jest --testPathPatterns='.*\\.integration\\.test.*$'","clear:ts":"rm -rf tsconfig.tsbuildinfo","clear:jest":"npx jest --clearCache","clear:eslint":"rm -rf .eslintcache","clear":"npm run clear:ts && npm run clear:jest && npm run clear:eslint","flush":"npm run clear && npm run generate","query":"tsx scripts/dns-client.ts","generate-fixtures":"node -e \"const args = process.argv.slice(1); require('child_process').spawn('tsx', ['scripts/generate-fixtures.ts'].concat(args), {stdio: 'inherit'});\"","release:patch":"npm version patch && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:minor":"npm version minor && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes","release:major":"npm version major && git push --follow-tags && gh release create v$(node -p \"require('./package.json').version\") --generate-notes"},"dependencies":{"buffer":"^6.0.3","dns-packet":"^5.6.1"},"devDependencies":{"@eslint/eslintrc":"^3.3.6","@eslint/js":"^9.39.5","@types/dns-packet":"^5.6.5","@types/jest":"^30.0.0","@types/node":"^18.19.0","@typescript-eslint/eslint-plugin":"^8.68.0","@typescript-eslint/parser":"^8.68.0","eslint":"^9.39.5","eslint-config-prettier":"^10.1.8","eslint-import-resolver-typescript":"^4.4.5","eslint-plugin-import":"^2.32.0","jest":"^30.4.2","prettier":"^3.9.6","ts-jest":"^29.4.12","tsup":"^8.5.1","tsx":"^4.23.12","typescript":"^5.9.3","typescript-eslint":"^8.68.0"},"gitHead":"41c5249b732b9be0cc15bc420f0651e897fecf83","_id":"@aoxborrow/dns-client@0.2.0","_nodeVersion":"24.19.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-psk1A6raDBDFpITvdlvMrSR2jeiZEzra8BdGOdwIBeJdHWeq9WIl+EhVJCzyICpMtlEcmkDroeoGzxVI6kmeYg==","shasum":"119e7341c0954097a8770d4fee615c9f46cd78cb","tarball":"https://registry.npmjs.org/@aoxborrow/dns-client/-/dns-client-0.2.0.tgz","fileCount":25,"unpackedSize":406275,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aoxborrow%2fdns-client@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDe7ESAuu0YT19ZJY/dtLY9PB0muRJmkX2U/VQ4PrQ7JAIhAMtpnCcFy5BFGm/0wDpy3pknEkEpwj4AOczCHueuOIpE"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ea7f834b-4f6c-4876-928d-dc23bc1431c7"}},"directories":{},"maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dns-client_0.2.0_1787811191845_0.9186676556962581"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-05T15:16:46.779Z","modified":"2026-08-27T06:13:12.374Z","0.1.0":"2025-11-05T15:16:47.136Z","0.1.4":"2025-11-05T21:23:12.710Z","0.1.5":"2025-11-05T22:08:18.383Z","0.1.6":"2025-11-05T23:02:21.735Z","0.1.7":"2025-11-14T21:29:49.540Z","0.1.8":"2025-11-18T22:15:45.008Z","0.2.0":"2026-08-27T06:13:12.023Z"},"bugs":{"url":"https://github.com/aoxborrow/dns-client/issues"},"author":{"name":"Aaron Oxborrow","email":"aaron@oxborrow.com"},"license":"MIT","homepage":"https://github.com/aoxborrow/dns-client","keywords":["dns","dns-client","dns-resolver","doh","dig","dns-over-https","dnssec","authoritative","dns-query","recursive","udp","tcp","typescript"],"repository":{"type":"git","url":"git+https://github.com/aoxborrow/dns-client.git"},"description":"Fully-typed DNS resolver with support for UDP, TCP, and DNS-over-HTTPS (DoH) transports","maintainers":[{"name":"aoxborrow","email":"aaron@oxborrow.com"}],"readme":"# dns-client\n\n[![npm version](https://img.shields.io/npm/v/@aoxborrow/dns-client.svg)](https://www.npmjs.com/package/@aoxborrow/dns-client)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg)](https://www.typescriptlang.org)\n\n> A fully-typed DNS client with support for UDP, TCP, and DoH.\n\n- **30+ Record Types** - All common DNS records parsed into strongly-typed objects\n- **Multiple Transports** - UDP, TCP, and DoH support with automatic TCP fallback for truncation\n- **Authoritative Mode** - Iterative resolution from root servers with hop-by-hop trace (similar to `dig +trace`)\n- **DNSSEC Support** - Query and validate DNSSEC records (DNSKEY, DS, RRSIG, NSEC, NSEC3)\n- **Advanced Features** - Parallel queries, concurrency control, query caching, retries with backoff\n\nThis library is extracted from [dns.tools](https://dns.tools). Check out our [DNS API](https://dns.tools/docs#dns) if you need a hosted version of this library.\n\n| Transport | Requirements                                                       |\n| --------- | ------------------------------------------------------------------ |\n| `udp`     | Node.js only (uses `dgram` module)                                 |\n| `tcp`     | Node.js only (uses `net` module)                                   |\n| `doh`     | Any runtime with `fetch` global (Node.js 18+, Deno, Bun, browsers) |\n\n## Installation\n\n```bash\nnpm install @aoxborrow/dns-client\n```\n\n### Basic Queries\n\n```typescript\nimport { DnsClient } from '@aoxborrow/dns-client';\n\n// create a client with default options\nconst client = new DnsClient();\n\n// query multiple record types\nconst answers: DnsAnswer[] = await client.query({\n  query: 'example.com',\n  types: ['A', 'MX', 'TXT'],\n});\n\n// execute multiple queries in parallel\nconst answers: DnsAnswer[] = await client.queryAll([\n  {\n    query: 'example.com',\n    types: ['A', 'AAAA', 'NS'],\n  },\n  {\n    query: 'www.example.com',\n    types: ['CNAME'],\n  },\n]);\n\n// extract records from answers\nconst records: DnsRecord[] = answers.flatMap(answer => answer.records);\n```\n\n### Query with Options\n\n```typescript\nimport { DnsClient } from '@aoxborrow/dns-client';\n\n// configure client with default options\nconst client = new DnsClient({\n  server: '1.1.1.1', // DNS server IP or hostname (default: '1.1.1.1' or root servers for authoritative mode)\n  transport: 'udp', // transport protocol: 'udp' | 'tcp' | 'doh' (default: 'udp')\n  authoritative: false, // resolution follows referrals iteratively from root (default: false)\n  flags: ['RD'], // list of DNS query flags: 'RD' (Recursion Desired), 'CD' (Checking Disabled), 'DO' (DNSSEC OK) (default: ['RD'])\n  tcpFallback: true, // retry over TCP if the UDP response has TC=1 (truncated) (default: true)\n  timeout: 5000, // timeout in milliseconds (default: 5000)\n  retries: 0, // number of retry attempts (default: 0)\n  backoff: 100, // base delay for exponential backoff in ms (default: 100ms)\n  signal: AbortSignal.timeout(10_000), // for cancellation/timeout\n  cache: true, // enable query cache (default: true)\n  cacheSize: 1000, // maximum cache entries (default: 1000)\n  concurrency: 10, // maximum concurrent queries (default: 10)\n});\n\n// set/override server and flags per query\nconst answers: DnsAnswer[] = await client.query({\n  query: 'example.com',\n  types: ['A', 'AAAA'],\n  server: 'ns1.example.com', // set the nameserver for this query\n  flags: ['CD', 'DO'], // override the DNS flags for this query (completely replaces client flags)\n});\n\n// execute multiple queries in parallel with overrides\nconst answers: DnsAnswer[] = await client.queryAll([\n  {\n    query: 'example.com',\n    types: ['NSEC3', 'DNSKEY', 'DS'],\n    server: '8.8.8.8',\n    flags: ['CD', 'DO', 'RD'], // override the DNS flags for this query (completely replaces client flags)\n  },\n  {\n    query: 'www.example.com',\n    types: ['CNAME'],\n    server: 'ns1.example.com',\n    // server and flags are optional\n  },\n]);\n```\n\n### Authoritative Queries + Trace\n\n```typescript\nimport { DnsClient } from '@aoxborrow/dns-client';\n\n// perform recursive resolution starting from root servers\nconst client = new DnsClient({\n  authoritative: true,\n  // flags: [], // RD flag disabled by default for authoritative mode\n});\nconst answers: DnsAnswer[] = await client.query({\n  query: 'example.com',\n  types: ['NS'],\n});\n\n// each answer includes a full resolution trace of delegation hops\nanswers.forEach(answer => {\n  console.log('Trace:', answer.trace);\n});\n```\n\n### DNS-over-HTTPS (DoH)\n\n```typescript\nimport { DnsClient } from '@aoxborrow/dns-client';\n\n// use DoH with Cloudflare\nconst client = new DnsClient({\n  server: 'https://cloudflare-dns.com/dns-query',\n  transport: 'doh',\n  // authoritative: false, // unavailable for DoH transport\n});\nconst answers: DnsAnswer[] = await client.query({\n  query: 'example.com',\n  types: ['A'],\n});\n```\n\n**Popular DoH Providers:**\n\n| Provider   | DoH Server URL                         |\n| ---------- | -------------------------------------- |\n| Cloudflare | `https://cloudflare-dns.com/dns-query` |\n| Google     | `https://dns.google/dns-query`         |\n| Quad9      | `https://dns.quad9.net/dns-query`      |\n| OpenDNS    | `https://doh.opendns.com/dns-query`    |\n\n### DNSSEC Queries\n\nQuery and validate DNSSEC records using the `DO` (DNSSEC OK) flag. The response will include the `AD` (Authenticated Data) flag if the resolver validated the DNSSEC chain.\n\n```typescript\nimport { DnsClient } from '@aoxborrow/dns-client';\n\n// enable DNSSEC with DO flag\nconst client = new DnsClient({\n  flags: ['DO', 'RD'], // request DNSSEC records\n});\n\n// query for DNSSEC records\nconst answers = await client.query({\n  query: 'cloudflare.com',\n  types: ['DNSKEY', 'DS', 'RRSIG'],\n});\n\n// check if the response was DNSSEC validated\nanswers.forEach(answer => {\n  if (answer.flags.includes('AD')) {\n    console.log('Response was DNSSEC validated (AD flag set)');\n  }\n});\n```\n\n### Reverse DNS Lookup (PTR Records)\n\n```typescript\nimport { DnsClient, reverseIp } from '@aoxborrow/dns-client';\n\nconst client = new DnsClient();\n\n// reverse lookup for IPv4/6 addresses using reverseIp utility\nconst answers = await client.query({\n  query: reverseIp('8.8.8.8'); // returns '8.8.8.8.in-addr.arpa',\n  types: ['PTR'],\n});\n\nconsole.log('Hostname:', answers[0].records); // [{ name: '8.8.8.8.in-addr.arpa', ttl: 69, type: 'PTR', value: 'dns.google' }]\n```\n\n### Utility Functions\n\n```typescript\nimport { DnsClient, getRecords, deduplicateRecords, flattenRecords } from '@aoxborrow/dns-client';\n\nconst client = new DnsClient();\nconst answers: DnsAnswer[] = await client.query({\n  query: 'example.com',\n  types: ['A', 'AAAA', 'NS', 'MX', 'TXT'],\n});\n\n// extract all records from multiple DnsAnswers\nconst records: DnsRecord[] = getRecords(answers);\n\n// deduplicate records, ignoring TTL and SOA serial numbers\nconst uniqueRecords: DnsRecord[] = deduplicateRecords(records);\n\n// flatten records into simplified/stringified representations for display\nconst flattenedRecords: FlatDnsRecord[] = flattenRecords(uniqueRecords);\n\ninterface FlatDnsRecord {\n  name: string;\n  type: DnsRecordType;\n  ttl?: number;\n  content: string; // rdata/zonefile format\n}\n```\n\n### DnsOptions\n\nAll are optional when creating a `DnsClient`. Defaults are provided for all settings.\n\n```typescript\ninterface DnsOptions {\n  // server and transport\n  server: string; // DNS server IP or hostname (default: '1.1.1.1' or root servers for authoritative mode)\n  transport: 'udp' | 'tcp' | 'doh'; // transport protocol (default: 'udp')\n  authoritative: boolean; // resolution follows referrals iteratively from root (default: false)\n  flags: DnsQueryFlag[]; // list of DNS query flags: 'RD' (Recursion Desired), 'CD' (Checking Disabled), 'DO' (DNSSEC OK) (default: ['RD'])\n\n  // error handling and timeouts\n  tcpFallback: boolean; // retry over TCP if the UDP response has TC=1 (truncated) (default: true)\n  timeout: number; // timeout in milliseconds (default: 5000)\n  retries: number; // number of retry attempts (default: 0)\n  backoff: number; // base delay for exponential backoff in ms (default: 100ms)\n  signal?: AbortSignal; // for cancellation/timeout\n\n  // performance\n  cache: boolean; // enable query cache (default: true)\n  cacheSize: number; // maximum cache entries (default: 1000)\n  concurrency: number; // maximum concurrent queries (default: 10)\n}\n```\n\n### Query Cache Behavior\n\n- Query cache keys are based on: name, type, server, and flags\n- Cache entries respect DNS TTL values\n- Query Caching can be disabled per client with `cache: false`\n\n### Record Types\n\nSupported DNS record types include:\n\n`A`, `AAAA`, `CAA`, `CDNSKEY`, `CDS`, `CERT`, `CNAME`, `DNAME`, `DNSKEY`, `DS`, `HINFO`, `HTTPS`, `KEY`, `LOC`, `MX`, `NAPTR`, `NS`, `NSEC`, `NSEC3`, `NSEC3PARAM`, `OPENPGPKEY`, `PTR`, `RP`, `RRSIG`, `SIG`, `SOA`, `SRV`, `SSHFP`, `SVCB`, `TLSA`, `TSIG`, `TXT`, `URI`\n\n### Query Flags\n\nDNS query flags (case-insensitive):\n\n- `RD` - Recursion Desired (default for stub mode)\n- `CD` - Checking Disabled (disables DNSSEC validation)\n- `DO` - DNSSEC OK (requests extended DNSSEC records)\n\nDNS response flags (case-insensitive):\n\n- `AA` - Authoritative Answer (indicates the answer is authoritative)\n- `TC` - Truncated Response (indicates the response is truncated)\n- `RD` - Recursion Desired (indicates the request asked for recursion)\n- `RA` - Recursion Available (indicates the server supports recursion)\n- `AD` - Authenticated Data (indicates the response was DNSSEC authenticated)\n- `CD` - Checking Disabled (indicates the server disabled DNSSEC validation)\n\n### DnsAnswer\n\nThe response object returned by `query()` and `queryAll()`:\n\n```typescript\ninterface DnsAnswer {\n  query: string; // the domain name queried, e.g. 'example.com'\n  type: DnsRecordType; // the record type queried, e.g. 'A'\n  server: string; // the server that answered the query, e.g. '1.1.1.1'\n  serverHost: string | null; // the hostname of the server if resolved, e.g. 'one.one.one.one'\n  elapsed: number | null; // query duration in milliseconds\n  bytes: number | null; // the number of bytes in the response\n  rcode: number | null; // the DNS response code, e.g. 0 (NOERROR), 2 (SERVFAIL), 3 (NXDOMAIN)\n  rcodeName: string | null; // the DNS response code name, e.g. 'NOERROR', 'SERVFAIL', 'NXDOMAIN'\n  extendedErrors: DnsExtendedErrors | null; // extended DNS error codes, e.g. { 'DNSSEC_BOGUS': 'signature validation failed' }\n  ednsOptions: EdnsOption[] | null; // EDNS options, e.g. [{ code: 3, nsid: '4m847' }]\n  flags: DnsFlag[]; // DNS flags from the response, e.g. ['RD', 'RA', 'AD']\n  records: DnsRecord[]; // the DNS records returned in the answer section\n  authorities: DnsRecord[]; // the DNS records returned in the authority section\n  additionals: DnsRecord[]; // the DNS records returned in the additional section\n  trace: DnsResolutionHop[]; // delegation trace showing each nameserver hop, e.g. [{ server: 'g.root-servers.net', elapsed: 66 }]\n  error: DnsError | null; // DnsError object if query failed\n}\n```\n\n### DnsRecord Examples\n\nSome example DNS record interfaces:\n\n```typescript\n// SOA (Start of Authority) - zone information\ninterface SoaRecord {\n  name: string; // the domain name, e.g. 'example.com'\n  ttl: number; // time to live in seconds, e.g. 3600\n  type: 'SOA'; // record type\n  class: 'IN'; // DNS class, almost always 'IN' (Internet)\n  nsname: string; // primary nameserver, e.g. 'a.iana-servers.net'\n  hostmaster: string; // responsible party email, e.g. 'hostmaster.example.com'\n  serial: number; // zone serial number, e.g. 2024110501\n  refresh: number; // refresh interval in seconds, e.g. 7200\n  retry: number; // retry interval in seconds, e.g. 3600\n  expire: number; // expiration time in seconds, e.g. 1209600\n  minimum: number; // negative caching TTL in seconds, e.g. 3600\n}\n\n// A (Address) - IPv4 address record\ninterface ARecord {\n  name: string; // the domain name, e.g. 'example.com'\n  ttl: number; // time to live in seconds, e.g. 300\n  type: 'A'; // record type\n  class: 'IN'; // DNS class, almost always 'IN' (Internet)\n  address: string; // IPv4 address, e.g. '93.184.216.34'\n}\n\n// MX (Mail Exchange) - mail server records\ninterface MxRecord {\n  name: string; // the domain name, e.g. 'example.com'\n  ttl: number; // time to live in seconds, e.g. 3600\n  type: 'MX'; // record type\n  class: 'IN'; // DNS class, almost always 'IN' (Internet)\n  exchange: string; // mail server hostname, e.g. 'mail.example.com'\n  priority: number; // preference value (lower is higher priority), e.g. 10\n}\n\n// DS (Delegation Signer) - DNSSEC delegation information\ninterface DsRecord {\n  name: string; // the domain name, e.g. 'example.com'\n  ttl: number; // time to live in seconds, e.g. 3600\n  type: 'DS'; // record type\n  class: 'IN'; // DNS class, almost always 'IN' (Internet)\n  key_tag: number; // key tag identifier, e.g. 12345\n  algorithm: number; // cryptographic algorithm number, e.g. 8 (RSA/SHA-256)\n  digest_type: number; // digest algorithm, e.g. 2 (SHA-256)\n  digest: string; // hexadecimal digest hash, e.g. 'A1B2C3D4E5F6...'\n}\n```\n\n### DnsResolutionHop\n\nEach entry in the `trace` array represents a single DNS query hop during authoritative resolution.\n\n```typescript\ninterface DnsResolutionHop {\n  server: string; // the IP address or hostname of the nameserver queried\n  serverHost: string | null; // the hostname of the nameserver if resolved\n  timestamp: Date; // when this query was made\n  elapsed: number | null; // query duration in milliseconds\n  bytes: number | null; // size of the response in bytes\n  rcode: number | null; // DNS response code (0 = NOERROR, 2 = SERVFAIL, 3 = NXDOMAIN)\n  rcodeName: string | null; // DNS response code name ('NOERROR', 'SERVFAIL', 'NXDOMAIN')\n  flags: DnsFlag[]; // DNS flags from the response (e.g., ['AA', 'RD', 'RA'])\n}\n```\n\n## Modes of Operation\n\n### Stub Mode (default)\n\nTalk to a normal recursive resolver and rely on its caching and DNS policies. This is the standard mode used by most applications. This is usually what you want.\n\n```typescript\nconst client = new DnsClient({\n  authoritative: false, // this is the default\n  flags: ['RD'], // this is the default\n});\n```\n\n- Sends queries with the RD (Recursion Desired) flag set\n- Specify a server to use, or use the default public server (Cloudflare's `1.1.1.1`)\n- The upstream server performs recursive resolution and caching and returns the final answer\n\n### Authoritative Mode\n\nPerform iterative resolution following delegation referrals starting from root servers.\n\n```typescript\nconst client = new DnsClient({\n  authoritative: true,\n  // flags: [], // no RD flag (no recursion requested)\n});\n```\n\n- Sends queries without RD (Recursion Desired) flag (no recursion requested)\n- Starts from root servers (or configured server if provided) and follows NS referrals iteratively until reaching authoritative nameservers\n- Returns full delegation trace in `answer.trace` (similar to `dig +trace`)\n\n## API\n\n### `DnsClient`\n\n#### `constructor(options?: Partial<DnsOptions>)`\n\nCreate a new DNS client with optional default options.\n\n#### `query(query: DnsQuery): Promise<DnsAnswer[]>`\n\nExecute a DNS query for one or more record types.\n\n- `query` - A `DnsQuery` object with the following properties:\n  - `query` (required) - The domain name to query\n  - `types` (optional) - Array of record types to query (default: `['A']`). Case-insensitive.\n  - `server` (optional) - Override the nameserver for this query\n  - `flags` (optional) - Override the DNS flags for this query. Case-insensitive.\n\nReturns an array of `DnsAnswer` objects, one per record type.\n\n#### `queryAll(queries: DnsQuery[]): Promise<DnsAnswer[]>`\n\nExecute multiple DNS queries in parallel. Each query can optionally specify multiple record types and override the `server` and `flags` from the client defaults.\n\n```typescript\n// the DnsQuery object used by query() and queryAll()\ninterface DnsQuery {\n  query: string; // the domain name to query, e.g. 'example.com'\n  types?: RecordType[]; // array of record types to query (default: ['A']), e.g. ['A', 'AAAA', 'MX']\n  server?: string; // override the nameserver for this query, e.g. '8.8.8.8'\n  flags?: QueryFlag[]; // override the DNS flags for this query, e.g. ['RD', 'DO']\n}\n```\n\n## Generate Test Fixtures\n\nGenerate DNS test fixtures for integration testing, based on the list in `DNS_TEST_DOMAINS`. Fixtures are transport-agnostic and are used to test UDP, TCP, and DoH clients.\n\n**Usage:** `npm run generate-fixtures [cloudflare|google]`\n","readmeFilename":"README.md"}