{"_id":"@d0paminedriven/metadata","_rev":"15-61001b6c76bbbe5d6707cde910acab8a","name":"@d0paminedriven/metadata","dist-tags":{"latest":"6.0.1"},"versions":{"1.0.0":{"name":"@d0paminedriven/metadata","version":"1.0.0","license":"MIT","_id":"@d0paminedriven/metadata@1.0.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"dist":{"shasum":"d75bf55a4280c69bfdd16c2f86e69bcfedd7f6eb","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-1.0.0.tgz","fileCount":14,"integrity":"sha512-m0iiS1vCY21q0lg9xzFGYpC7X6jvORWjr79qf8lWvOX97xRwF/j4p3PfqN5ATlAyo5dpbJZPxUzUUH47mMDX+g==","signatures":[{"sig":"MEYCIQDUzTSAZ5PdM0dsgNF9Pit2A/qBnffmk10QO5UeBAVLGgIhAIPH9J0WNIp1/zWKlQKwbb3SZlNHjeOjE3/0wyt0qUtv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77548},"type":"module","_from":"file:d0paminedriven-metadata-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./images":"./dist/images/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","build":"tsup","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@slipstream/prettier-config","_resolved":"/tmp/9d004e92a9521cd1357e586d681461e3/d0paminedriven-metadata-1.0.0.tgz","_integrity":"sha512-m0iiS1vCY21q0lg9xzFGYpC7X6jvORWjr79qf8lWvOX97xRwF/j4p3PfqN5ATlAyo5dpbJZPxUzUUH47mMDX+g==","_npmVersion":"11.6.1","description":"convenient metadata helpers","directories":{},"sideEffects":false,"_nodeVersion":"24.9.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tsup":"^8.5.0","tslib":"^2.8.1","eslint":"^9.37.0","terser":"^5.44.0","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.6.2","@d0paminedriven/fs":"^7.6.0","@slipstream/tsconfig":"0.1.0","@slipstream/eslint-config":"0.1.0","@slipstream/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_1.0.0_1759644834851_0.8596472708520093","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@d0paminedriven/metadata","version":"2.0.0","license":"MIT","_id":"@d0paminedriven/metadata@2.0.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"dist":{"shasum":"248232f12892bef462dc785f96f1dc014e2dab6a","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-2.0.0.tgz","fileCount":16,"integrity":"sha512-6m+8TkfmCiWAHpr2/9z10A13MRSgXFNbk/huSftvjB8rCTauKaODLAN8UNPMd+nzKyrjBR30NXJFiY5ntzaClw==","signatures":[{"sig":"MEUCIQCIduQyBr/5GSLpo7hj9hYu4tSgTL7CZ8XY2IyE5d/ItwIgYT9Op2PCV8nTUzbDP67UYqfqrfJJaYNjderZzD0kj7I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120677},"type":"module","_from":"file:d0paminedriven-metadata-2.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/workup.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@slipstream/prettier-config","_resolved":"/tmp/8f064649f70f171ec646b382401f4d47/d0paminedriven-metadata-2.0.0.tgz","_integrity":"sha512-6m+8TkfmCiWAHpr2/9z10A13MRSgXFNbk/huSftvjB8rCTauKaODLAN8UNPMd+nzKyrjBR30NXJFiY5ntzaClw==","_npmVersion":"11.6.2","description":"convenient metadata helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.0.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.9","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@slipstream/tsconfig":"0.1.0","@slipstream/eslint-config":"0.1.0","@slipstream/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_2.0.0_1761373391858_0.04112563723351981","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@d0paminedriven/metadata","version":"2.0.1","license":"MIT","_id":"@d0paminedriven/metadata@2.0.1","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"dist":{"shasum":"0a20080c4fac6e060c58e09f08fa13edaaf2b168","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-2.0.1.tgz","fileCount":16,"integrity":"sha512-D9TWHuyNySl0QhKo/wW4uSZ6xcVGHF6YatYbi1Q0kmCH96LtzCTKYBlvrEw/bnxnxDWPSGgp5nHZLWBD5vS3bA==","signatures":[{"sig":"MEYCIQC/gQbeuQWxbs4pUKuoM/OoUC/e8cfY5WFDW8rGCdGblgIhAOp53qoWf4/QW63H4Y+zmaL8aWUcUF9cE7oq+2R6cHLr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120749},"type":"module","_from":"file:d0paminedriven-metadata-2.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/workup.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@slipstream/prettier-config","_resolved":"/tmp/97de49bd8f4d59062894d43564d451a2/d0paminedriven-metadata-2.0.1.tgz","_integrity":"sha512-D9TWHuyNySl0QhKo/wW4uSZ6xcVGHF6YatYbi1Q0kmCH96LtzCTKYBlvrEw/bnxnxDWPSGgp5nHZLWBD5vS3bA==","_npmVersion":"11.6.2","description":"convenient metadata helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.0.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.9","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@slipstream/tsconfig":"0.1.0","@slipstream/eslint-config":"0.1.0","@slipstream/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_2.0.1_1761373572336_0.4734291105280062","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@d0paminedriven/metadata","version":"2.1.0","license":"MIT","_id":"@d0paminedriven/metadata@2.1.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"dist":{"shasum":"1f12bc99f6b00c0bca24b834363cbb3b93423142","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-2.1.0.tgz","fileCount":16,"integrity":"sha512-/zrFD39siAYj4KQsGvjOeH2prm+UYFc+Ic+SR6qxirEzWvak7T6KLRy4ldkOEufu1Pxeu7NRC1rrKTOSSxejJg==","signatures":[{"sig":"MEUCIQCk4P85Fo4s6+8Kvqjmrsd8aruaymqARUVQBHcgtz1ziQIgZBHPPQFamncHfX64KAxqgoBZ2QcPe+THMX0knN7JdmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124407},"type":"module","_from":"file:d0paminedriven-metadata-2.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/workup.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@slipstream/prettier-config","_resolved":"/tmp/5639a75abbb7b2256d74904d499f5a90/d0paminedriven-metadata-2.1.0.tgz","_integrity":"sha512-/zrFD39siAYj4KQsGvjOeH2prm+UYFc+Ic+SR6qxirEzWvak7T6KLRy4ldkOEufu1Pxeu7NRC1rrKTOSSxejJg==","_npmVersion":"11.6.2","description":"convenient metadata helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.0.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.9","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@slipstream/tsconfig":"0.1.0","@slipstream/eslint-config":"0.1.0","@slipstream/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_2.1.0_1761381866336_0.4433354990878111","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@d0paminedriven/metadata","version":"2.1.1","license":"MIT","_id":"@d0paminedriven/metadata@2.1.1","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"dist":{"shasum":"00e2bbac59186a8bd0e1fd6e2939511d1a93a642","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-2.1.1.tgz","fileCount":16,"integrity":"sha512-xkgcPUEdeXeT0APiz3f/+hli684nmRw2BL4ZtnUsBEbiKhRZClarHoAJGNBqmexJXU0yfzUQI2xxuvKebkpu9Q==","signatures":[{"sig":"MEUCIQDnYMd4zmDBkH618FXry1WzQ4ifgFylkLv5hFn+P5znHQIgFaONBkXjWFM67R72RKBDturEHey+KuBaU6xqp7Eg20Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124479},"type":"module","_from":"file:d0paminedriven-metadata-2.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/workup.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@slipstream/prettier-config","_resolved":"/tmp/8a98b0f2b1e19d94949bc790c8088cca/d0paminedriven-metadata-2.1.1.tgz","_integrity":"sha512-xkgcPUEdeXeT0APiz3f/+hli684nmRw2BL4ZtnUsBEbiKhRZClarHoAJGNBqmexJXU0yfzUQI2xxuvKebkpu9Q==","_npmVersion":"11.6.2","description":"convenient metadata helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.0.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.9","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@slipstream/tsconfig":"0.1.0","@slipstream/eslint-config":"0.1.0","@slipstream/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_2.1.1_1761381943775_0.8702040296123765","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@d0paminedriven/metadata","version":"3.0.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@3.0.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"758e1dc702e5ac242798547e42cb4b9ce06b64a2","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-3.0.0.tgz","fileCount":4,"integrity":"sha512-EAUibp2IM5b0hm9ny7zHc3qBC+zIIcLQbXfuhxT8RweLhUtjDCJ/X3uzpG+bH/hvyTX8HE1ET/I+svcp0AHPlg==","signatures":[{"sig":"MEUCIHNBeQhHhEKwxjRYGAEcD+s2it00T9s3I/wGR5eGAF7tAiEA37IxQjBDMn6SS97oeVM+zVf+IKGuPl3zZIA3eBcWmcw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122190},"type":"module","_from":"file:d0paminedriven-metadata-3.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/workup.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/a6f3fdd097d35531ef3073690aa8bae5/d0paminedriven-metadata-3.0.0.tgz","_integrity":"sha512-EAUibp2IM5b0hm9ny7zHc3qBC+zIIcLQbXfuhxT8RweLhUtjDCJ/X3uzpG+bH/hvyTX8HE1ET/I+svcp0AHPlg==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git","type":"git","directory":"packages/metadata"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.0.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.10","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_3.0.0_1761488677483_0.34208872584301764","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@d0paminedriven/metadata","version":"3.1.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@3.1.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"f49feb35845457336edca986b12fb4c6d193fe27","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-3.1.0.tgz","fileCount":16,"integrity":"sha512-tsgps9uR6ywfipQUhOlt3UbQGMQLCdj4DHcdsJbzHPVweeStNyAdmBnxqCAv7yLZ8tcT4bYIsVvrPk3TGWSt3g==","signatures":[{"sig":"MEUCIQCdMzyNZ+MfjTETLSfqtznb9CtC1nH5ISit6Ou/tiRFCwIgE7QhnJjOMjZ4mEkI5S9JzUt1UHNzsk3bZfOjGeAF5Pk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124778},"type":"module","_from":"file:d0paminedriven-metadata-3.1.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/workup.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/30e7f34f4c9f9ace8f03eaffded6f78f/d0paminedriven-metadata-3.1.0.tgz","_integrity":"sha512-tsgps9uR6ywfipQUhOlt3UbQGMQLCdj4DHcdsJbzHPVweeStNyAdmBnxqCAv7yLZ8tcT4bYIsVvrPk3TGWSt3g==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git","type":"git","directory":"packages/metadata"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.0.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.10","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_3.1.0_1761489211586_0.4802831941874177","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@d0paminedriven/metadata","version":"3.2.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@3.2.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"2d70b6694416e2fc40ccf12449d67eda161ed962","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-3.2.0.tgz","fileCount":16,"integrity":"sha512-WSbyWECsZhctNyIhkw1sJWLZcJGYDdFSFxXnvUf7Y5MHkOqpDq5OMO/4P/mqaMe15VthRa4kdgGkl7Falu5Tgg==","signatures":[{"sig":"MEQCIDlDNqqfD4okpItCvQAYtVNZTve7i7mPtgoP2aMo25AnAiA4YztIRZv2B64H5ibNhF7GYv8rbqi3L1vRNg62IpHJIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126730},"type":"module","_from":"file:d0paminedriven-metadata-3.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/5cbfd4fa529a20bf1a8922f1798efde2/d0paminedriven-metadata-3.2.0.tgz","_integrity":"sha512-WSbyWECsZhctNyIhkw1sJWLZcJGYDdFSFxXnvUf7Y5MHkOqpDq5OMO/4P/mqaMe15VthRa4kdgGkl7Falu5Tgg==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git","type":"git","directory":"packages/metadata"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.1.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.10","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_3.2.0_1761714350645_0.04915523641227382","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@d0paminedriven/metadata","version":"3.3.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@3.3.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"ad15a7a91be24bc848830643dc2688d52f1d07be","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-3.3.0.tgz","fileCount":16,"integrity":"sha512-smtuvOp64Jy0oX3zrQxn3QAsMUSaZVk0LhjQS8TO/eM/1mwTPTodUBczh+JrorAWsN3sASx0wcxnUklCQZ6yHw==","signatures":[{"sig":"MEUCIQDtP6O4KPRHSFyMhRpHtDJQ/5jh85MjmMeTH8Q25MrkzAIgP8U9GOwkW1Wg5G8IF9hh4U/NoGaWUfbxjZ02VaTWIlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126730},"type":"module","_from":"file:d0paminedriven-metadata-3.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/c3bc05a4d73716047bfc6e932fccbb4d/d0paminedriven-metadata-3.3.0.tgz","_integrity":"sha512-smtuvOp64Jy0oX3zrQxn3QAsMUSaZVk0LhjQS8TO/eM/1mwTPTodUBczh+JrorAWsN3sASx0wcxnUklCQZ6yHw==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git","type":"git","directory":"packages/metadata"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.1.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.10","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_3.3.0_1761737862037_0.5562440851531354","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"@d0paminedriven/metadata","version":"3.4.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@3.4.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"d27cfbc8c466ef1be670a1337c1e0bd4e8b57738","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-3.4.0.tgz","fileCount":16,"integrity":"sha512-wfvqqJVaNUQT36uyYLLsMGMBBAGlWggzJNDZhcWh3BIcstujm0GfcjHXXFxuTrVhtn/oxSi90XhRLlsHMfYJ3w==","signatures":[{"sig":"MEUCIQCXXKZ0JvsLrkR25sPSri5JZqi3TyYUqvlyRKT1caMdZAIgD05Elqy5lqtzMFn8OM96TBdYKM20D3sYpHRVQ0RMcFc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128296},"type":"module","_from":"file:d0paminedriven-metadata-3.4.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/e905ee93ea91f364272eb1301f0ab5d2/d0paminedriven-metadata-3.4.0.tgz","_integrity":"sha512-wfvqqJVaNUQT36uyYLLsMGMBBAGlWggzJNDZhcWh3BIcstujm0GfcjHXXFxuTrVhtn/oxSi90XhRLlsHMfYJ3w==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git","type":"git","directory":"./packages/metadata"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.1.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.38.0","terser":"^5.44.0","tsdown":"^0.15.10","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.9.1","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_3.4.0_1762041366399_0.18199645103672268","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@d0paminedriven/metadata","version":"4.0.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@4.0.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"d6ffb19ff126c78980fdc74730603b2fe9c21981","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-4.0.0.tgz","fileCount":18,"integrity":"sha512-JlN1/qJs7YNE9asfykBzWde5gxtX+dHObbaGNjx0411VbRfnQt4boOKua5EGSPpsJkCyyOvHQf/X86/QeAPshw==","signatures":[{"sig":"MEUCIQCa3qzcbZr4W/y2nr1mkuMnVbPcJQRJeJcSPSGKvt1mIgIgYiSGuCy3piE4dzFp8oYXQCs54vqXWZN3Znnjug4F0WQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136735},"type":"module","_from":"file:d0paminedriven-metadata-4.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/79d80f9d01c3b3de9a18408a50a75786/d0paminedriven-metadata-4.0.0.tgz","_integrity":"sha512-JlN1/qJs7YNE9asfykBzWde5gxtX+dHObbaGNjx0411VbRfnQt4boOKua5EGSPpsJkCyyOvHQf/X86/QeAPshw==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git#master","type":"git"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.1.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.39.0","terser":"^5.44.0","tsdown":"^0.15.12","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.10.0","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_4.0.0_1762145675182_0.0643192878317238","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@d0paminedriven/metadata","version":"4.0.1","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@4.0.1","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"075718e3fc66233efb85a7e6c8f375624503d0e0","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-4.0.1.tgz","fileCount":18,"integrity":"sha512-BBJglfVWEtJQ2WlJPvsu3yGtJy0y5YD/CYF34TsRx0EXgdBONFa14JQ5w9cIca4F+rlRQm1e+owyFIdIu3y6Cw==","signatures":[{"sig":"MEUCIGU4EjZ7rHkmo3N7XJlxWWEKITXYYog7Drbo+aRLPTEQAiEAv5LIxJbOfkLx364zGNkG2HSfv8Q5OzsVfWIxWKVMDvE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136823},"type":"module","_from":"file:d0paminedriven-metadata-4.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./images/workup":"./dist/images/workup.js","./extract/client":"./dist/extract/client.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/6a9606d72dd9ef53917fdae6f0393b1b/d0paminedriven-metadata-4.0.1.tgz","_integrity":"sha512-BBJglfVWEtJQ2WlJPvsu3yGtJy0y5YD/CYF34TsRx0EXgdBONFa14JQ5w9cIca4F+rlRQm1e+owyFIdIu3y6Cw==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git#master","type":"git"},"_npmVersion":"11.6.2","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.1.0","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts","dist/extract/client.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.39.0","terser":"^5.44.0","tsdown":"^0.15.12","prettier":"^3.6.2","typescript":"^5.9.3","@types/node":"^24.10.0","@d0paminedriven/fs":"^7.6.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_4.0.1_1762145851017_0.06822049602259583","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@d0paminedriven/metadata","version":"5.0.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@5.0.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"73a2b2c232bf1e64b416d9bbaf26cf24af4a4c6c","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-5.0.0.tgz","fileCount":20,"integrity":"sha512-2GTkIK3L3943N3Dn+JE3R//FOpUXJ2wxw8HThRCSkxhW79HsuGmXquv7qtd6iDJzmFBoAYpEeyOCFrtiSJY2Lw==","signatures":[{"sig":"MEUCIQC1miypXpf5lUz29vMLzjUiAgk5o8iQI6AcNGV3zhWscQIgeRwJoiGLBrjnIbVfQ64ioNaLcAfKiWJ/zTxk6L0PJkU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172639},"type":"module","_from":"file:d0paminedriven-metadata-5.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./types/utils":"./dist/types/utils.js","./images/workup":"./dist/images/workup.js","./extract/client":"./dist/extract/client.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/392f1184b5f993228539c986537b0e29/d0paminedriven-metadata-5.0.0.tgz","_integrity":"sha512-2GTkIK3L3943N3Dn+JE3R//FOpUXJ2wxw8HThRCSkxhW79HsuGmXquv7qtd6iDJzmFBoAYpEeyOCFrtiSJY2Lw==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git#master","type":"git"},"_npmVersion":"11.6.3","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts","dist/types/utils.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts","dist/extract/client.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.39.1","terser":"^5.44.1","tsdown":"^0.17.0","prettier":"^3.7.4","typescript":"^5.9.3","@types/node":"^24.10.1","@d0paminedriven/fs":"^10.1.0","@d0paminedriven/tsconfig":"0.1.0","@typescript/native-preview":"7.0.0-dev.20251206.1","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_5.0.0_1765081858861_0.19314239722769955","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"@d0paminedriven/metadata","version":"6.0.0","author":{"name":"Andrew Ross"},"license":"MIT","_id":"@d0paminedriven/metadata@6.0.0","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"dist":{"shasum":"5452652e0f9bb7df99b63f03cec814364a77670a","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-6.0.0.tgz","fileCount":20,"integrity":"sha512-wdno56N4jRNBOndPbWrQsDr1sWK308at8yy71Xinx04dzKIyxoO0umSscR0HqxKJU2pzyZQ/CECwIRz8vq6tDg==","signatures":[{"sig":"MEUCID2CUZdMOhS7ogSyRC+Tzph16Ihw5HMaQchUJDGqq3h3AiEA1On/yixiRsfxYjAyfnojdwqzNVnr+DgPOGiKJKZd6Fs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154898},"type":"module","_from":"file:d0paminedriven-metadata-6.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","source":"src/index.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./types":"./dist/types/index.js","./images":"./dist/images/index.js","./mixins":"./dist/mixins/index.js","./extract":"./dist/extract/index.js","./types/utils":"./dist/types/utils.js","./images/workup":"./dist/images/workup.js","./extract/client":"./dist/extract/client.js"},"scripts":{"dev":"pnpm build","lint":"eslint","test":"tsx src/test/index.test.ts","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","prebuild":"rm -rf dist"},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"prettier":"@d0paminedriven/prettier-config","_resolved":"/tmp/aebb80bc3ce864afa75472feed13ec57/d0paminedriven-metadata-6.0.0.tgz","_integrity":"sha512-wdno56N4jRNBOndPbWrQsDr1sWK308at8yy71Xinx04dzKIyxoO0umSscR0HqxKJU2pzyZQ/CECwIRz8vq6tDg==","repository":{"url":"git+https://github.com/DopamineDriven/d0paminedriven.git#master","type":"git"},"_npmVersion":"11.6.3","description":"convenient metadata extraction helpers","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","dependencies":{"fflate":"^0.8.2"},"publishConfig":{"access":"public"},"typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"docs":["dist/docs/index.d.ts"],"types":["dist/types/index.d.ts","dist/types/utils.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"mixins":["dist/mixins/index.d.ts"],"extract":["dist/extract/index.d.ts","dist/extract/client.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jiti":"^2.6.1","tslib":"^2.8.1","eslint":"^9.39.1","terser":"^5.44.1","tsdown":"^0.17.0","prettier":"^3.7.4","typescript":"^5.9.3","@types/node":"^24.10.1","@d0paminedriven/fs":"^10.1.0","@d0paminedriven/tsconfig":"0.1.0","@typescript/native-preview":"7.0.0-dev.20251206.1","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/metadata_6.0.0_1765090065869_0.19993118337696036","host":"s3://npm-registry-packages-npm-production"}},"6.0.1":{"name":"@d0paminedriven/metadata","version":"6.0.1","description":"convenient metadata extraction helpers","author":{"name":"Andrew Ross"},"repository":{"type":"git","url":"git+https://github.com/DopamineDriven/d0paminedriven.git#master"},"homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","license":"MIT","sideEffects":false,"type":"module","typesVersions":{"*":{"*":["dist/*.d.ts","dist/*/index.d.ts"],"images":["dist/images/index.d.ts","dist/images/workup.d.ts"],"docs":["dist/docs/index.d.ts"],"extract":["dist/extract/index.d.ts","dist/extract/client.d.ts"],"mixins":["dist/mixins/index.d.ts"],"types":["dist/types/index.d.ts","dist/types/utils.d.ts"]}},"publishConfig":{"access":"public"},"source":"src/index.ts","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":"./dist/index.js","./docs":"./dist/docs/index.js","./extract":"./dist/extract/index.js","./extract/client":"./dist/extract/client.js","./images":"./dist/images/index.js","./images/workup":"./dist/images/workup.js","./mixins":"./dist/mixins/index.js","./types":"./dist/types/index.js","./types/utils":"./dist/types/utils.js"},"dependencies":{"fflate":"^0.8.2"},"devDependencies":{"@d0paminedriven/fs":"^10.1.0","@typescript/native-preview":"7.0.0-dev.20251206.1","@types/node":"^24.10.1","eslint":"^9.39.1","jiti":"^2.6.1","prettier":"^3.7.4","terser":"^5.44.1","tsdown":"^0.17.0","tslib":"^2.8.1","tsx":"^4.21.0","typescript":"^5.9.3","@d0paminedriven/eslint-config":"0.1.0","@d0paminedriven/tsconfig":"0.1.0","@d0paminedriven/prettier-config":"0.1.0"},"prettier":"@d0paminedriven/prettier-config","scripts":{"lint":"eslint","dev":"pnpm build","prebuild":"rm -rf dist","build":"tsdown","clean":"git clean -xdf dist node_modules","types":"tsc --emitDeclarationOnly","pretest":"tsx src/test/output-local.ts","test":"tsx src/test/index.test.ts","test:pdf":"tsx src/test/pdf-page-count.test.ts"},"_id":"@d0paminedriven/metadata@6.0.1","bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"_integrity":"sha512-BweUGRDb/3vs4vkxQNFox9lnvpOxObdOqhb0/oDFt+K7Zg76VMMM2111TjaiHGBRKmf03ER3m03SS1sypofMrQ==","_resolved":"/tmp/075aa646c1870f526a3a69dcf7750195/d0paminedriven-metadata-6.0.1.tgz","_from":"file:d0paminedriven-metadata-6.0.1.tgz","_nodeVersion":"25.2.1","_npmVersion":"11.6.3","dist":{"integrity":"sha512-BweUGRDb/3vs4vkxQNFox9lnvpOxObdOqhb0/oDFt+K7Zg76VMMM2111TjaiHGBRKmf03ER3m03SS1sypofMrQ==","shasum":"53ae3d0f310e5139942d4264a92eda6d848d8f00","tarball":"https://registry.npmjs.org/@d0paminedriven/metadata/-/metadata-6.0.1.tgz","fileCount":20,"unpackedSize":154953,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICin9Z9snl81ucdd1i1GeQCAh0d9cPaOh/SBRau0eZnIAiEAp8hRs5QPSObpHjxDv3IgxpfDkqulhwoPpdiSzgzzb0U="}]},"_npmUser":{"name":"d0paminedriven","email":"andrew@windycitydevs.io"},"directories":{},"maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/metadata_6.0.1_1765144654615_0.6524225441838567"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-05T06:13:54.757Z","modified":"2025-12-07T21:57:34.942Z","1.0.0":"2025-10-05T06:13:55.052Z","2.0.0":"2025-10-25T06:23:12.065Z","2.0.1":"2025-10-25T06:26:12.612Z","2.1.0":"2025-10-25T08:44:26.527Z","2.1.1":"2025-10-25T08:45:44.015Z","3.0.0":"2025-10-26T14:24:37.724Z","3.1.0":"2025-10-26T14:33:31.785Z","3.2.0":"2025-10-29T05:05:50.825Z","3.3.0":"2025-10-29T11:37:42.212Z","3.4.0":"2025-11-01T23:56:06.596Z","4.0.0":"2025-11-03T04:54:35.369Z","4.0.1":"2025-11-03T04:57:31.220Z","5.0.0":"2025-12-07T04:30:59.012Z","6.0.0":"2025-12-07T06:47:46.045Z","6.0.1":"2025-12-07T21:57:34.754Z"},"bugs":{"url":"https://github.com/DopamineDriven/d0paminedriven/issues"},"author":{"name":"Andrew Ross"},"license":"MIT","homepage":"https://github.com/DopamineDriven/d0paminedriven/blob/master/packages/metadata/README.md","repository":{"type":"git","url":"git+https://github.com/DopamineDriven/d0paminedriven.git#master"},"description":"convenient metadata extraction helpers","maintainers":[{"name":"d0paminedriven","email":"andrew@windycitydevs.io"}],"readme":"# @d0paminedriven/metadata\n\n1. **`Extract`** - Full-featured Remote URL/Buffer extractor with network capabilities (Node.js/Server-side first) &rarr; isomorphic by design (edge cases being handled as they emerge)\n2. **`ExtractClient`** - Client-side extractor for synchronous buffer processing (Browser-friendly) &rarr; all the same metadata with no remote fetching capabilites\n\nLightweight, zero‑native metadata extraction for images and documents. Designed to be fast, safe, and “header‑first” so you can classify and preview files without downloading entire objects.\n\n- Minimal bytes fetched (range requests, idle and deadline guards)\n- Hardened against slow/origin issues with quarantining and optional CDN origin fallbacks\n- Works with Buffers or remote URLs\n- Rich, typed results for common image and office/PDF formats\n\n## Features\n\n- Image formats: PNG (incl. iTXt, sRGB/ICC), JPEG (EXIF orientation/date, ICC), WebP (VP8/VP8L/VP8X, animation), GIF (frame count), BMP, AVIF (ispe, XMP), ICO (largest entry), TIFF (classic), HEIC/HEIF (ISOBMFF)\n- Documents: PDF (version, pages, linearization, encryption, text preview, dates via Info and XMP), DOCX/PPTX/XLSX (core/app props, slides/sheets, quick preview), RTF, plain text and common code/data files\n- Remote fetch strategy that never blocks the batch: probes first, ranges when possible, streams minimal data otherwise\n- Typed return shapes and small helpers for reuse via mixins\n\n## Install\n\nUse your workspace package manager:\n\n```bash\npnpm add @d0paminedriven/metadata\n# or\nnpm i @d0paminedriven/metadata\n# or\nyarn add @d0paminedriven/metadata\n```\n\n## Quick Start\n\nClassify any URL or Buffer and get a unified, typed result:\n\n```ts\nimport { Extract } from \"@d0paminedriven/metadata\";\n\nconst extract = new Extract({ debug: false });\n\n// From a remote URL\nconst result1 = await extract.extractRemote(\n  \"https://cdn.example.com/path/to/file.pdf\",\n  96 * 1024 // optional head size to fetch/analyze\n);\n\n// From a Buffer\nconst fileBuffer = await fs.promises.readFile(\"./sample.jpeg\");\nconst result2 = await extract.extractRemote(fileBuffer);\n\nif (result1.type === \"IMAGE\") {\n  console.log(result1.width, result1.height, result1.format);\n} else {\n  console.log(result1.format, result1.pageCount, result1.textPreview);\n}\n```\n\n## Update: Buffer byteSize Parity\n\n- Fix: `extractRemote(Buffer)` now sets `byteSize` to the detected total size (the Buffer length), matching how remote URLs report total size via `Content-Length`/`Content-Range`.\n- Result: URL and Buffer inputs now return consistent `byteSize` values across images and documents.\n\nExample parity check:\n\n```ts\nconst extract = new Extract();\nconst url = \"https://assets.example.com/1758473273940-dogespace.jpg\";\nconst r1 = await extract.extractRemote(url, 96 * 1024);\nconst buf = await fs.promises.readFile(\"src/test/local/1758473273940-dogespace.jpg\");\nconst r2 = await extract.extractRemote(buf);\nconsole.log(r1.byteSize, r2.byteSize); // identical\n```\n\n## When To Use Which API\n\n- Unified flow for URLs or Buffers: `new Extract(opts).extractRemote(source, size?, timeout?)`\n- Images only (Buffer input): `new ImgMetadataExtractor().getImageSpecsWorkup(buffer, size?)`\n- Documents only (Buffer input): `new DocMetadataExtractor().getDocumentSpecsWorkup(buffer, mime, filename?)`\n\nExports are available from the package root and by subpath:\n\n```ts\nimport { Extract, DocMetadataExtractor, ImgMetadataExtractor } from \"@d0paminedriven/metadata\";\n// or\nimport { Extract } from \"@d0paminedriven/metadata/extract\";\nimport { DocMetadataExtractor } from \"@d0paminedriven/metadata/docs\";\nimport { ImgMetadataExtractor } from \"@d0paminedriven/metadata/images\";\n```\n\n## Return Types (summary)\n\nImage results (`ExpandedImgSpecs`):\n- Core: `type: \"IMAGE\"`, `width`, `height`, `format`, `frames`, `animated`, `hasAlpha`, `orientation`, `aspectRatio`\n- Color: `colorModel`, `colorSpace`, `iccProfile`\n- EXIF: `exifDateTimeOriginal`\n- Source: `source?`, `byteSize?` (remote: Content-Length/Range; buffer: `Buffer.length`), `fetchedBytes?`, `contentType?`\n\n\n```ts\ninterface ExpandedImageSpecs {\n    type: \"IMAGE\";\n  width: number;\n  height: number;\n  format:\n    | \"apng\"\n    | \"png\"\n    | \"jpeg\"\n    | \"gif\"\n    | \"bmp\"\n    | \"webp\"\n    | \"avif\"\n    | \"svg\"\n    | \"ico\"\n    | \"heic\"\n    | \"tiff\"\n    | \"unknown\";\n  frames: number;\n  animated: boolean;\n  hasAlpha: boolean | null;\n  orientation: number | null;\n  aspectRatio: number;\n  colorModel:\n    | \"rgb\"\n    | \"rgba\"\n    | \"grayscale\"\n    | \"grayscale-alpha\"\n    | \"indexed\"\n    | \"cmyk\"\n    | \"ycbcr\"\n    | \"ycck\"\n    | \"vector\"\n    | \"lab\"\n    | \"unknown\";\n  colorSpace:\n    | \"unknown\"\n    | \"srgb\"\n    | \"display_p3\"\n    | \"adobe_rgb\"\n    | \"prophoto_rgb\"\n    | \"rec2020\"\n    | \"rec709\"\n    | \"cmyk\"\n    | \"lab\"\n    | \"xyz\"\n    | \"gray\";\n  iccProfile: string | null;\n  exifDateTimeOriginal: string | null;\n  metadata?: Record<string, string>;\n  source?: string;\n  fetchedBytes?: number;\n  byteSize?: number;\n  contentType?: string;\n}\n\n```\n\nDoc results (`ExpandedDocSpecs`):\n- Core: `type: \"DOCUMENT\"`, `format`, `mimeType`, `pageCount`, `wordCount`, `lineCount`, `textPreview`\n- PDF: `pdfVersion`, `isEncrypted`, `isSearchable`, `isLinearized`\n- Common: `author`, `subject`, `keywords`, `createdDate`, `modifiedDate`\n- Source: `source?`, `byteSize?` (remote: Content-Length/Range; buffer: `Buffer.length`), `fetchedBytes?`, `contentType?`\n\n\n```ts\ninterface ExpandedDocSpecs {\n  type: \"DOCUMENT\";\n  format: string | null;\n  mimeType: string | null;\n  pageCount: number | null;\n  wordCount: number | null;\n  lineCount: number | null;\n  language: string | null;\n  encoding: string | null;\n  author: string | null;\n  subject: string | null;\n  keywords: string[] | null;\n  pdfVersion: string | null;\n  isEncrypted: boolean | null;\n  isSearchable: boolean | null;\n  isLinearized: boolean | null;\n  textPreview: string | null;\n  createdDate: string | null;\n  modifiedDate: string | null;\n  source?: string;\n  fetchedBytes?: number;\n  byteSize?: number;\n  contentType?: string;\n}\n```\n\nSee `src/types/index.ts` for full type definitions.\n\n## The Hardened Fetcher (remote URLs)\n\nThe `Extract` class includes a minimal, safe fetcher that tries to do the least work necessary while avoiding pathological cases:\n\n- Probes the first chunk via `Range` with a short deadline to sniff type and server capabilities\n- Prefers `Range` for exact head bytes; uses `HEAD` to detect suspicious compression; streams with an idle guard when needed\n- PDFs fetch head + tail when ranged to surface cross‑reference and XMP metadata without full download\n- Quarantines problematic URLs (default 6h) to avoid re‑attempting failing endpoints during batch work\n- Optional CDN hardening hooks:\n  - `originFallback(cfUrl)`: resolve a CDN URL to origin (e.g., R2/S3) and re‑probe\n  - `invalidateCloudFrontKey(key)`: invalidate bad cache entries when origin succeeds\n\nExample with a CloudFront → S3 origin fallback:\n\n```ts\nconst extract = new Extract({\n  debug: true,\n  userAgent: \"my-app/metadata-extractor\",\n  quarantineTtlMs: 6 * 60 * 60 * 1000,\n  originFallback: (url) => url.replace(\"https://cdn.example.com/\", \"https://s3.example.com/\"),\n  invalidateCloudFrontKey: async (urlOrKey) => {\n    // map full URL to distribution key if needed and call your invalidation API\n  },\n});\n\nconst meta = await extract.extractRemote(\"https://cdn.example.com/asset.png\", 96 * 1024);\n```\n\n## Image Extraction Details\n\n- PNG: IHDR dims, color type → color model/space, sRGB/cHRM/iCCP, iTXt/zTXt (XMP, Creation Time), EXIF (eXIf)\n- JPEG: SOF dims, EXIF orientation (0x0112) and DateTimeOriginal (0x9003), ICC in APP2\n- WebP: VP8/VP8L/VP8X dims, alpha flag, animation frames, ICC/XMP where present\n- GIF: dims and frame counting via blocks\n- BMP: dims and basic color model\n- AVIF/HEIF: ISOBMFF box walk for dims (ispe), XMP extraction\n- ICO: picks largest entry; detects embedded PNG\n- TIFF: classic TIFF IFDs for dims/samples; BigTIFF intentionally not parsed in lightweight path\n\nImage parser is header‑first and avoids full decode; it surfaces useful metadata quickly and safely.\n\n## Document Extraction Details\n\n- PDF: version, linearization, encryption, page counting via Pages/Count (with fallbacks), quick text preview (BT/Tj/TJ), Info dictionary strings (Author/Subject/Title/Keywords), dates parsed from Info and XMP\n- DOCX/PPTX/XLSX: reads `docProps/core.xml` and `app.xml`; for DOCX extracts preview text from `word/document.xml`; for XLSX inspects sheets, sharedStrings, and common features (formulas, charts, pivots, macros)\n- RTF: naive but effective text stripping for preview/word count\n- Plain text and code/data: BOM detection, UTF‑8 validation with Windows‑1252 fallback, word/line counts, language hint from extension\n\nZIP handling is a minimal central‑directory reader with deflate via `fflate` only when necessary.\n\n## API Reference (selected)\n\n- `class Extract(opts?: ExtractorHardenedOptions)` → unified image/doc extractor with network hardening.\n  - `extractRemote(source: Buffer | string, size = 16384, timeout = 5000)` → `ExpandedDocSpecs | ExpandedImgSpecs`\n  - Options: `originFallback`, `invalidateCloudFrontKey`, `quarantineTtlMs`, `userAgent`, `debug`, plus injection of `img`/`docs` extractors\n- `class ImgMetadataExtractor` → image‑only, Buffer in\n  - `getImageSpecsWorkup(buffer: Buffer, size = 4096 * 6)` → `ExpandedImgSpecs`\n- `class DocMetadataExtractor` → document‑only, Buffer in\n  - `getDocumentSpecsWorkup(buffer: Buffer, mime: string, filename?: string)` → `ExpandedDocSpecs`\n\nAdvanced: You can share extractor instances across many `Extract` instances via the provided mixins if needed.\n\n## Examples\n\nClassify many URLs efficiently:\n\n```ts\nimport { Extract } from \"@d0paminedriven/metadata\";\n\nconst extract = new Extract();\nconst urls = [\n  \"https://example.com/report.pdf\",\n  \"https://example.com/photo.jpg\",\n  \"https://example.com/deck.pptx\",\n];\n\nconst results = await Promise.all(urls.map(u => extract.extractRemote(u, 96 * 1024)));\nfor (const r of results) {\n  console.log(r.type === \"IMAGE\" ? r.format : r.format, r.source);\n}\n```\n\nImages from disk (Buffer):\n\n```ts\nimport { ImgMetadataExtractor } from \"@d0paminedriven/metadata/images\";\n\nconst img = new ImgMetadataExtractor();\nconst buf = await fs.promises.readFile(\"./photo.webp\");\nconst specs = img.getImageSpecsWorkup(buf);\nconsole.log(specs.width, specs.height, specs.colorSpace);\n```\n\nDocuments from an upload (Buffer + MIME):\n\n```ts\nimport { DocMetadataExtractor } from \"@d0paminedriven/metadata/docs\";\n\nconst docs = new DocMetadataExtractor();\nconst { buffer, mime, filename } = await readUpload();\nconst specs = docs.getDocumentSpecsWorkup(buffer, mime, filename);\nconsole.log(specs.format, specs.pageCount, specs.textPreview);\n```\n\n## Verification\n\n- Comprehensive test: 629 remote URLs mapped 1:1 to local files across a dozen+ MIME types (JPEG, PNG, WebP, GIF, HEIC/AVIF/ICO/TIFF, PDF, DOCX/PPTX/XLSX, RTF/TXT).\n- Each pair is compared for exact `byteSize` equality using the unified `extractRemote` API.\n- Result: 629/629 passed remote vs local `byteSize` comparisons.\n\nHow to run:\n\n```bash\npnpm test\n```\n\nThe first time you run `pnpm test` a `pretest` script will probe the generation of the required `src/test/local/*` directory containing all 629 remote assets pulled locally for direct comparison. Once this dir and its contents exists all subsequent tests bypass this step via an `exists` checker in the `src/test/output-local.ts` file that is executed via the `pretest` script.\n\nArtifacts and helpers:\n\n- Remote URL list: `src/test/data.ts`\n- Local assets (fetched once via the fs helper): `src/test/local/*`\n- Generated tuples mapping remote → local: `src/test/tuples.ts` (built by `pnpm tsx src/test/workup.ts`)\n- Full sample output: `src/test/test-results.md`\n\n## Runtime Notes\n\n- Node 18+ recommended (built‑in `fetch` and WHATWG streams); the library uses `Buffer` and `fetch`\n- No native dependencies; only `fflate` for ZIP/deflate\n- Network timeouts and idle thresholds are conservative by default to keep batch processing snappy\n\n## Limits & Caveats\n\n- Header‑first by design: not a full codec/renderer\n- BigTIFF is detected but not parsed in the lightweight path\n- Some edge/CDN behaviors may ignore Range on the first probe; the fetcher retries with `HEAD` and guardrails\n- If a URL is quarantined due to repeated failures, you’ll get `QUARANTINED: <url>` until TTL expires (override via `quarantineTtlMs`)\n\n## Local Development\n\n- Build: `pnpm --filter @d0paminedriven/metadata build`\n- Typecheck/Lint: `pnpm --filter @d0paminedriven/metadata typecheck` / `pnpm --filter @d0paminedriven/metadata lint`\n- Ad‑hoc test runner: `pnpm --filter @d0paminedriven/metadata test` (see `src/test/` for examples)\n\n---\n\n## CDN Integration Example (assets.aicoalesce.com)\n\nIf you’re serving uploads from `assets.aicoalesce.com` / `assets-dev.aicoalesce.com` behind a CDN, wire up `originFallback` and `invalidateCloudFrontKey` so the extractor can heal around cache issues without blocking batches.\n\n```ts\nimport { Extract } from \"@d0paminedriven/metadata\";\n\n// Map CDN URLs to your origin bucket(s)\nconst ORIGIN = {\n  prod: \"https://your-prod-bucket.s3.amazonaws.com\", // e.g., s3://your-prod-bucket\n  dev: \"https://your-dev-bucket.s3.amazonaws.com\",   // e.g., s3://your-dev-bucket\n};\n\nfunction cfToOrigin(cfUrl: string): string {\n  try {\n    const u = new URL(cfUrl);\n    const path = u.pathname; // keep exact key\n    if (u.hostname === \"assets.aicoalesce.com\") return `${ORIGIN.prod}${path}`;\n    if (u.hostname === \"assets-dev.aicoalesce.com\") return `${ORIGIN.dev}${path}`;\n    return cfUrl; // non‑CDN domains untouched\n  } catch {\n    return cfUrl;\n  }\n}\n\n// Invalidate a single CDN key; implement either an internal endpoint\n// or call AWS CloudFront directly (example below commented out).\nasync function invalidateKey(urlOrKey: string) {\n  const key = urlOrKey.startsWith(\"http\") ? new URL(urlOrKey).pathname : urlOrKey;\n\n  // Option A: Internal service (recommended for apps)\n  if (process.env.CF_INVALIDATE_ENDPOINT) {\n    await fetch(process.env.CF_INVALIDATE_ENDPOINT, {\n      method: \"POST\",\n      headers: { \"content-type\": \"application/json\" },\n      body: JSON.stringify({ key }),\n    });\n    return;\n  }\n\n  // Option B: AWS SDK v3 (uncomment and add dependency if you prefer)\n  // import { CloudFrontClient, CreateInvalidationCommand } from \"@aws-sdk/client-cloudfront\";\n  // const cf = new CloudFrontClient({});\n  // await cf.send(new CreateInvalidationCommand({\n  //   DistributionId: process.env.CF_DISTRIBUTION_ID!,\n  //   InvalidationBatch: {\n  //     CallerReference: String(Date.now()),\n  //     Paths: { Quantity: 1, Items: [key] },\n  //   },\n  // }));\n}\n\nconst extract = new Extract({\n  userAgent: \"d0paminedriven/metadata (+apps/ws-server)\",\n  originFallback: cfToOrigin,\n  invalidateCloudFrontKey: invalidateKey,\n  quarantineTtlMs: 6 * 60 * 60 * 1000,\n});\n\n// Example: classify with a generous head size for richer headers/XMP\nconst meta = await extract.extractRemote(\n  \"https://assets.aicoalesce.com/upload/abc123/some-file.png\",\n  96 * 1024\n);\nconsole.log(meta.type, meta.source);\n```\n\nQuestions or ideas to improve extraction heuristics for new formats? Contributions welcome.\n","readmeFilename":"README.md"}