{"_id":"@assemora/media","_rev":"9-335e472dc9dbde5e5e61120dfcc8d0e6","name":"@assemora/media","dist-tags":{"latest":"0.2.7"},"versions":{"0.1.0":{"name":"@assemora/media","version":"0.1.0","license":"Apache-2.0","_id":"@assemora/media@0.1.0","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"b1db7558c467cd92c51810399f63c30b78c47881","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.1.0.tgz","fileCount":35,"integrity":"sha512-C0Ny95MiHs8UbHMv24Zw+eEGSi2cPeywhRciJDViixiP1HsfrUBftQ53cpVcKwuxEUD3WZY6pd1TFUisYaZolw==","signatures":[{"sig":"MEUCID2uSl9ypjDqQTG+Uu7TgkWQjzCXj1HC+swnq6K3YNNRAiEA7YPSa1OK3MEgVqEXEJcS7LFrOGu1c7dCeFxwQrxQ+T0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.1.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/65ac68c38c5bbe1a64caf14a904466ca/assemora-media-0.1.0.tgz","_integrity":"sha512-C0Ny95MiHs8UbHMv24Zw+eEGSi2cPeywhRciJDViixiP1HsfrUBftQ53cpVcKwuxEUD3WZY6pd1TFUisYaZolw==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.1.0","@assemora/data":"0.1.0","@assemora/schema":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/media_0.1.0_1788602378750_0.5633255190706039","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@assemora/media","version":"0.2.0","license":"Apache-2.0","_id":"@assemora/media@0.2.0","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"7c6d366e0e74a9727d2f3b2ca16806d7d3049b4d","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.0.tgz","fileCount":35,"integrity":"sha512-HXvY8DNeBBS1vh7fjXs3yHqPF7OINKOxijtyV0xC6a0dFWAVbb2AZDJwTnVUO6V5fbNEYq4wnOnxeIR3fNJmTA==","signatures":[{"sig":"MEUCIQDbnqLj1dCREAgbxyraDGCkDnVcbE6ZOmUr0R/+D79dMQIgX1qlOIv9FaSlSTiYYvulyamwhvlHZrEK18JEzEVxLQ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/7a3adb45e26083a1f18a03081deffb1c/assemora-media-0.2.0.tgz","_integrity":"sha512-HXvY8DNeBBS1vh7fjXs3yHqPF7OINKOxijtyV0xC6a0dFWAVbb2AZDJwTnVUO6V5fbNEYq4wnOnxeIR3fNJmTA==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.2.0","@assemora/data":"0.2.0","@assemora/schema":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.0_1788606344203_0.9549808499797974","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@assemora/media","version":"0.2.1","license":"Apache-2.0","_id":"@assemora/media@0.2.1","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"9da0d4739a12d51526b52f7afafd9969e8a5a73f","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.1.tgz","fileCount":35,"integrity":"sha512-YzO14Sg1+n/jDQEOiu+JRhKphAwU0CDS58jZAccMYVrSOf273x12ucObT71Mk7iVvY16+Glarm6Bp3evXK1N5A==","signatures":[{"sig":"MEUCIQCCY03AkCxG7mp+V1QE0XlA9xRGC/2UP6nMhvSvgiNgeAIgQOTpe8wgq69orBLDX1FSPKlEoD2sDdB5WzCzU0Yv3LE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/e9bd376be021984d35d1ccac58860291/assemora-media-0.2.1.tgz","_integrity":"sha512-YzO14Sg1+n/jDQEOiu+JRhKphAwU0CDS58jZAccMYVrSOf273x12ucObT71Mk7iVvY16+Glarm6Bp3evXK1N5A==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.2.1","@assemora/data":"0.2.1","@assemora/schema":"0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.1_1788610836796_0.052756106741232545","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@assemora/media","version":"0.2.2","license":"Apache-2.0","_id":"@assemora/media@0.2.2","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"ae382569f14a94832e1863ad7df98f8b21f27ec3","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.2.tgz","fileCount":35,"integrity":"sha512-Cu9vVE5R4LtE7BQqBxQZEWsQBUBQiCgIy4hYUIdq7660cFoxGU/6tQX350fMJNQhv99QMhZn7T0B8R547nzM4w==","signatures":[{"sig":"MEUCID+a1BS/L+dg1HhGBKZumZm3b1jS5oT3JebW0OFUOcz+AiEAmbUvLcluDBsJhWD4kvhGjWNQwT3aECWQLFxsLBco6XA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.2.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/789ee1d9dfdbccd2bb7220c19dd0ff57/assemora-media-0.2.2.tgz","_integrity":"sha512-Cu9vVE5R4LtE7BQqBxQZEWsQBUBQiCgIy4hYUIdq7660cFoxGU/6tQX350fMJNQhv99QMhZn7T0B8R547nzM4w==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.2.2","@assemora/data":"0.2.2","@assemora/schema":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.2"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.2_1788618288920_0.5921699246484011","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@assemora/media","version":"0.2.3","license":"Apache-2.0","_id":"@assemora/media@0.2.3","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"adbd623951a4e1cd37cbbd9325e1badb7c189115","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.3.tgz","fileCount":35,"integrity":"sha512-0iz7J3mB4U/u+rzp/NnZ8TRXp1FQ4IjWjgY2AwWCArILwB6QD17DmmeR/yLau4SdmQDTja7SQuB6jVO8R5BsXA==","signatures":[{"sig":"MEYCIQDOWUqB1iMFT3QHQ3YfM2l04IE9EZC+6sn3P0XyP3fhcAIhAOSyOo0l6bp9R+MmkoY60CKlRHW1PeCCjvgRswW5kf1l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.3.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/tmp/1c60552ec255287b749ad98ff1dace52/assemora-media-0.2.3.tgz","_integrity":"sha512-0iz7J3mB4U/u+rzp/NnZ8TRXp1FQ4IjWjgY2AwWCArILwB6QD17DmmeR/yLau4SdmQDTja7SQuB6jVO8R5BsXA==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.17.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@assemora/core":"0.2.3","@assemora/data":"0.2.3","@assemora/schema":"0.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.3"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.3_1788960559129_0.4564087520309035","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@assemora/media","version":"0.2.4","license":"Apache-2.0","_id":"@assemora/media@0.2.4","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"5e8a0edc240c40f68c0a5a92420c012f2a4edb9a","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.4.tgz","fileCount":35,"integrity":"sha512-Vm8Yp/VD8XCOTfLC3beFXwWUSwj3kIyf1Kl9j9eTzN83PPuxjg2YaIBk8QQe54O2NaJqJkxzYSm1s1G8IaS0iw==","signatures":[{"sig":"MEUCIQCPx/XD+6nHIHJun0KNbi5O4HuY3Tf7t6qznEFk2DkKwwIgCJzqmR3rDwtsIqDoVyc3tmIECFKgdBoixdcr4AO4+5o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.4.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/777579787f6f5ed7e45ab7579ef676c4/assemora-media-0.2.4.tgz","_integrity":"sha512-Vm8Yp/VD8XCOTfLC3beFXwWUSwj3kIyf1Kl9j9eTzN83PPuxjg2YaIBk8QQe54O2NaJqJkxzYSm1s1G8IaS0iw==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.2.4","@assemora/data":"0.2.4","@assemora/schema":"0.2.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.4"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.4_1788980050368_0.034202964224507415","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@assemora/media","version":"0.2.5","license":"Apache-2.0","_id":"@assemora/media@0.2.5","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"7d042a74eb6ee95cf4b45d956de70cfb9ee9d839","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.5.tgz","fileCount":35,"integrity":"sha512-C8IBRkIpYkjOrB0zP6lgIkiUzyL0Jo61//crsIS4uZujybpDaMxj+8FEfjtVvL0v+sXDmgNZpjOioW3Ge+e1KQ==","signatures":[{"sig":"MEQCIFcgaFrWdlZrt4Y/7u9sNUAQOFLnFr2C4G8ec4kya4VxAiB3A42lgLGQnNo7q18KIMTLYMDy0FOaahNU4QIHS2QTmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.5.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/93f74e97f64f3f6b5ef1f1a596f6153d/assemora-media-0.2.5.tgz","_integrity":"sha512-C8IBRkIpYkjOrB0zP6lgIkiUzyL0Jo61//crsIS4uZujybpDaMxj+8FEfjtVvL0v+sXDmgNZpjOioW3Ge+e1KQ==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.2.5","@assemora/data":"0.2.5","@assemora/schema":"0.2.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.5"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.5_1789060980902_0.27697547874983086","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@assemora/media","version":"0.2.6","license":"Apache-2.0","_id":"@assemora/media@0.2.6","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"homepage":"https://github.com/assemora/assemora#readme","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"500dac734eb4861470815d7d84c28d46b6e231ed","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.6.tgz","fileCount":35,"integrity":"sha512-N0eeIO8AEZn6vDZZrPpDy3+U+ZF9aDO/p5YRMZKVBYVyVkhqPAao8up4oOhscHSAWDDJBRqL+/TgB0L6qOwLpg==","signatures":[{"sig":"MEQCIE8P2MBftNuE0GmAR+7GFyYmC29qUzIls58XCem2HeZHAiAgZZdvguqrHMIS55weehB0RfsV4Fx8Zv6XYiH4IsqQmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104364},"main":"./dist/index.js","type":"module","_from":"file:assemora-media-0.2.6.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"_resolved":"/private/var/folders/3_/pn3k9dwn7lv8q_fy5h6lgnzr0000gn/T/3be17ab6d10b83c451a1c5fb961722ba/assemora-media-0.2.6.tgz","_integrity":"sha512-N0eeIO8AEZn6vDZZrPpDy3+U+ZF9aDO/p5YRMZKVBYVyVkhqPAao8up4oOhscHSAWDDJBRqL+/TgB0L6qOwLpg==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.3.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"_nodeVersion":"24.1.0","dependencies":{"@assemora/core":"0.2.6","@assemora/data":"0.2.6","@assemora/schema":"0.2.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.6"},"_npmOperationalInternal":{"tmp":"tmp/media_0.2.6_1789064524618_0.595307575280503","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"_id":"@assemora/media@0.2.7","bugs":{"url":"https://github.com/assemora/assemora/issues"},"dist":{"shasum":"9cfec311d7eea441ae8d290e0229b4f344786667","tarball":"https://registry.npmjs.org/@assemora/media/-/media-0.2.7.tgz","fileCount":35,"integrity":"sha512-eOL3UftdOcmNFJON9IeCzBKNAAabnWUhACV/uaXGAK0zNmP8TeDa38K9tf54H04/3T0MPElrGknDNcxh1eB7pQ==","signatures":[{"sig":"MEUCIB/3G1HGJ25KA+zNJOpDSIYDDIILYdxDkHaOku1vbGyIAiEAo8tVrGaRguV4hlRh3HdeLzn9GmnyL4s7MuHRNDBsG5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHcF/u0UU6JiM6z7zSklqI3aciKut7vws9pJfIrPcgRyAiBJsgQBBjKZGD/Ao9vImRVb4lNWhGbILM5efVPr4CUQGQ=="}],"unpackedSize":104364},"main":"./dist/index.js","name":"@assemora/media","type":"module","_from":"file:assemora-media-0.2.7.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"license":"Apache-2.0","scripts":{"build":"tsc -b tsconfig.build.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"0.2.7","_npmUser":{"name":"artemmelnik","email":"artemmelnik989@gmail.com"},"homepage":"https://github.com/assemora/assemora#readme","_resolved":"/tmp/02b383da6c925a0e3d329cf7b41253ed/assemora-media-0.2.7.tgz","_integrity":"sha512-eOL3UftdOcmNFJON9IeCzBKNAAabnWUhACV/uaXGAK0zNmP8TeDa38K9tf54H04/3T0MPElrGknDNcxh1eB7pQ==","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"_npmVersion":"11.17.0","description":"Media library and storage adapters (local, S3-compatible)","directories":{},"maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"_nodeVersion":"24.19.0","dependencies":{"@assemora/core":"0.2.7","@assemora/data":"0.2.7","@assemora/schema":"0.2.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"24.13.3","@assemora/database":"0.2.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/media_0.2.7_1790692124248_0.7289569946532746"}}},"time":{"created":"2026-09-05T09:59:38.663Z","modified":"2026-09-29T14:28:44.567Z","0.1.0":"2026-09-05T09:59:38.889Z","0.2.0":"2026-09-05T11:05:44.348Z","0.2.1":"2026-09-05T12:20:36.946Z","0.2.2":"2026-09-05T14:24:49.103Z","0.2.3":"2026-09-09T13:29:19.270Z","0.2.4":"2026-09-09T18:54:10.499Z","0.2.5":"2026-09-10T17:23:01.060Z","0.2.6":"2026-09-10T18:22:04.746Z","0.2.7":"2026-09-29T14:28:44.355Z"},"bugs":{"url":"https://github.com/assemora/assemora/issues"},"license":"Apache-2.0","homepage":"https://github.com/assemora/assemora#readme","repository":{"url":"git+https://github.com/assemora/assemora.git","type":"git","directory":"packages/media"},"description":"Media library and storage adapters (local, S3-compatible)","maintainers":[{"name":"artemmelnik","email":"artemmelnik989@gmail.com"}],"readme":"# `@assemora/media`\n\nMedia library and storage adapters.\n\n**Implementation phase:** 7 — implemented.\n\n```ts\nuseStorage(localStorage({ root: './storage/media' }))\n\nawait app.commands.execute('media.upload', { filename, mimeType, data })\n```\n\nThe storage interface names no vendor, and both drivers SPEC.md §63 makes mandatory\nimplement it. Each refuses a path that would climb out of where it may write — a\nfilename arrives from an upload, and `../../etc/passwd` is a filename.\n\n## The S3-compatible driver\n\n```ts\nuseStorage(\n  s3Storage({\n    bucket: 'assets',\n    region: 'auto',\n    endpoint: 'https://<account>.r2.cloudflarestorage.com',\n    accessKeyId: S3_KEY,\n    secretAccessKey: S3_SECRET,\n  }),\n)\n```\n\nIt talks to anything that speaks S3 — AWS, Cloudflare R2, MinIO, Backblaze B2,\nDigitalOcean Spaces — over `fetch`, signing every request with AWS Signature Version 4\ncomputed here from `node:crypto`. There is no vendor SDK behind it: this package\ndepends on `@assemora/schema`, `@assemora/core` and `@assemora/data`, and four HTTP\nrequests are not a reason to widen that.\n\n| Option | Meaning |\n| --- | --- |\n| `bucket`, `region` | Both are signed, so both must match the bucket's own. R2 wants `region: 'auto'`. |\n| `accessKeyId`, `secretAccessKey` | Required. An empty one fails at boot rather than with an unexplained 403 later. |\n| `sessionToken` | For temporary credentials. |\n| `endpoint` | The service. AWS S3 in `region` when it is left out. A path in the endpoint is kept, for a MinIO behind a reverse proxy. |\n| `addressing` | `'path'` (default) or `'virtual-hosted'`. |\n| `publicUrl` | A CDN or public bucket in front of the objects. |\n| `signedUrlExpiresIn` | Seconds a signed URL lives. One hour by default, seven days at most. Must be a finite number: `Number(process.env.S3_URL_TTL)` on an unset variable is `NaN`, and that is refused at boot rather than reaching the wire as `X-Amz-Expires=NaN`. |\n| `logger` | Where a refused request is explained. Pass the application's logger; the default writes to the console. |\n| `fetch` | Injected in tests, and wherever `fetch` is not global. |\n\n### Addressing\n\n`addressing` is stated, never inferred from the endpoint's hostname. It defaults to\n`'path'` — `https://host/bucket/key` — because that is the one style every\nS3-compatible service understands, and the one that works for a bucket whose name is\nnot a legal DNS label or contains a dot that a wildcard certificate will not cover.\nSet `addressing: 'virtual-hosted'` for AWS S3, which prefers `https://bucket.host/key`.\n\n### What `url(path)` returns\n\nA bucket is private until somebody puts something public in front of it, so the answer\ndepends on whether you did:\n\n- With `publicUrl`, the object's URL under that base, and nothing else. Use it for a\n  CDN or a bucket you have deliberately made public.\n- Without it, a **presigned GET URL**, valid for `signedUrlExpiresIn`. The contract is\n  `url(path): string` rather than a promise, and a presigned URL fits inside it:\n  signing is a hash chain over values already in hand and waits for no I/O.\n\nTwo things follow from that, and neither is hidden:\n\n- **A presigned URL expires.** `StorageDriver.url()` has no way to say when, so a\n  caller that stores one — in a cached response, a static build, an exported document\n  — will find it stale. Studio and the REST layer ask for the URL as they render, so\n  they are fine; anything that persists one should either use `publicUrl` or take the\n  path and ask again. Saying so in the type means giving `url()` a return type richer\n  than `string`, which changes `StorageDriver` for the local driver too. That is an\n  ADR, not a patch, and it has not been written.\n- **A presigned URL names the access key id** in `X-Amz-Credential`. That is how SigV4\n  works and it is not a secret: it says which key the receiver should check the\n  signature against. The secret access key never leaves the process — not in a URL,\n  not in a header, not in an error, not in a log.\n\n### Errors\n\nA refused request becomes an `AssemoraError` with code `STORAGE_REQUEST_FAILED`, status\n**502** and `details: { operation }` — and nothing else. The status is deliberately not\nthe bucket's own: a 403 from S3 means this deployment's credentials or bucket policy\nare wrong, and repeating it would tell a perfectly authorized caller they are\nforbidden. That reasoning covers the whole payload rather than just the status, because\n`AssemoraError.toPayload` puts `message` and `details` on the wire verbatim and\n`media.upload` is reachable over REST: an upstream status or `<Code>` in either one is\nthe same disclosure by another route, with a private bucket name and object key\nalongside it.\n\nThe diagnosis is not lost, it is moved. The bucket, the key, the HTTP status and the\n`<Code>` S3 returned go to `logger.error('S3 request failed', …)`, where whoever owns\nthe deployment reads them. Nothing else from the response body is kept even there — a\n`SignatureDoesNotMatch` body quotes the canonical request and the access key id back at\nyou, which belongs in a terminal and not in a log shipper.\n\nA key that is empty or contains a `.` or `..` segment is refused with `INVALID_PATH`\nbefore any request is signed. There is no filesystem here, but `..` is not inert\neither: path-style addressing puts the bucket in the path, and a URL resolves\n`/bucket/../secret` to `/secret`.\n\n### Content types\n\n`safeContentType` decides what a browser may be told a file is, and both drivers reach\nthe same answer — but at different moments. The local driver stores bytes and the\napplication narrows the type as it serves them. An object store answers for itself, so\nthis driver narrows the type on the way **in**: what a `PUT` writes is what the bucket\nreturns forever after, and by then the application is no longer in the request path.\n\nSo an upload claiming `image/svg+xml` or `text/html` is stored as\n`application/octet-stream` with `Content-Disposition: attachment`, exactly as the local\ndriver serves it. That is not paranoia about the bucket's own host: `publicUrl` is\nnormally a CDN, a CDN is normally a subdomain of the application, and an SVG scripts\nwhatever origin renders it (SPEC.md §85). The record in the library keeps the type the\nuploader claimed; only what the bucket is told changes.\n\n## Workspace dependencies\n\n- `@assemora/schema`\n- `@assemora/core`\n- `@assemora/data`\n","readmeFilename":"README.md"}