{"_id":"@b9g/filesystem-r2","_rev":"8-a12836b23e1acfa16a890652c220ded0","name":"@b9g/filesystem-r2","dist-tags":{"beta":"0.1.5","latest":"0.1.6"},"versions":{"0.1.0":{"name":"@b9g/filesystem-r2","version":"0.1.0","keywords":["filesystem","r2","cloudflare","storage","web-standards"],"_id":"@b9g/filesystem-r2@0.1.0","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"59893216238d8e9e3dd9d69525fd0708ef29cc00","tarball":"https://registry.npmjs.org/@b9g/filesystem-r2/-/filesystem-r2-0.1.0.tgz","fileCount":3,"integrity":"sha512-M/zjJWuerAcD1uXXLjf1Mrvf6Xf9wrX+oOZcTXAZ1pACmtMSKPe4EWyyRHh/2v7/Fk0CCIMnOxCXIwmJqzWKHQ==","signatures":[{"sig":"MEQCIHF7mD6yZaDZU6G+cDJOtfEVUPP0uZcaQmd6tb0CocNqAiBypt+L4wp6pnD0xNikhdMAgHkeLiFDpJk3kkajwXMiSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10216},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"b9a9824db1a7ec3944c71d7babdb42bbdba17c3e","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.4.2","description":"Cloudflare R2 implementation of File System Access API","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@b9g/filesystem":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.10"},"peerDependencies":{"@cloudflare/workers-types":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-r2_0.1.0_1762136225966_0.9609481547450018","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Merged into @b9g/platform-cloudflare"},"0.1.1":{"name":"@b9g/filesystem-r2","version":"0.1.1","keywords":["filesystem","r2","cloudflare","storage","web-standards"],"_id":"@b9g/filesystem-r2@0.1.1","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"2af111820d55270a62b4cc57739905048c42267e","tarball":"https://registry.npmjs.org/@b9g/filesystem-r2/-/filesystem-r2-0.1.1.tgz","fileCount":3,"integrity":"sha512-1VrvDkieGmeOq/kJx7zuEYgYG7utLRQBHesIKt6coaFkf7WXXFnpbR9Ys+uV2zgQXnViOeySfeRshEkzVBM86A==","signatures":[{"sig":"MEUCIQDPIbNojohiSvFFqlBqnQvLKToSRutb+M42F2UQokt2GQIgOmnKLH79KZqssz7bf8Zm5D0JfyVF6J/SXKDMT1CFzw0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10211},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"b9a9824db1a7ec3944c71d7babdb42bbdba17c3e","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.4.2","description":"Cloudflare R2 implementation of File System Access API","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@b9g/filesystem":"^0.1.1"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.10"},"peerDependencies":{"@cloudflare/workers-types":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-r2_0.1.1_1762137227838_0.2750993353519309","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Merged into @b9g/platform-cloudflare"},"0.1.3":{"name":"@b9g/filesystem-r2","version":"0.1.3","keywords":["filesystem","r2","cloudflare","storage","web-standards"],"_id":"@b9g/filesystem-r2@0.1.3","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"3ac4899d0fb699988c62ac7570d4179ff4e71c85","tarball":"https://registry.npmjs.org/@b9g/filesystem-r2/-/filesystem-r2-0.1.3.tgz","fileCount":3,"integrity":"sha512-u2kyEAOwhi/DbGtfm1KcVa20X0/8AXPUk7phwscr+ynfDi0+TyhW1v6/oTKTYpP8uFzEewfcmjpiX1DTSpRKWA==","signatures":[{"sig":"MEYCIQDo3gSV8ScnOf4g+jyr59eic+PcpqNPKZ5jECTzjQiDuQIhANSx6DmCc5JFDelX3n/naKdKlElMMMSUKB3ZJKgWIOB4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10211},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"bca46fb3116607c17e95fbd1a1944a4fd86c30f0","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.4.2","description":"Cloudflare R2 implementation of File System Access API","directories":{},"_nodeVersion":"24.4.1","dependencies":{"@b9g/filesystem":"^0.1.4"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.11"},"peerDependencies":{"@cloudflare/workers-types":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-r2_0.1.3_1762726210922_0.25542200404644033","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Merged into @b9g/platform-cloudflare"},"0.1.4":{"name":"@b9g/filesystem-r2","version":"0.1.4","keywords":["filesystem","r2","cloudflare","storage","web-standards"],"_id":"@b9g/filesystem-r2@0.1.4","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"bd7afe7d9523fa781bb49d78d486ed45d3e3ccf5","tarball":"https://registry.npmjs.org/@b9g/filesystem-r2/-/filesystem-r2-0.1.4.tgz","fileCount":4,"integrity":"sha512-+w4iGVD31CKXvV6OeAwbaKz/53pcIj2fyHRd6BhJ5oSJSaXNyYTlkAerM+0OxDXxSIpjZkAhGz5LjpTOATAZCQ==","signatures":[{"sig":"MEYCIQDPnm+CurXBI5YnY6+hcTQNPIdUEN7xO20JQGM0xpyxdwIhAMU01s9YgUP0kRvYGF6xKeVfOunqgbuSLupClEKBRFwS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12731},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"d569dd6e62bdf4e603e4ab65382538503b68ed22","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.6.2","description":"Cloudflare R2 implementation of File System Access API","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@b9g/filesystem":"^0.1.5"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.11"},"peerDependencies":{"@cloudflare/workers-types":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-r2_0.1.4_1764127034286_0.2547419346059754","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Merged into @b9g/platform-cloudflare"},"0.1.5":{"name":"@b9g/filesystem-r2","version":"0.1.5","keywords":["filesystem","r2","cloudflare","storage","web-standards"],"_id":"@b9g/filesystem-r2@0.1.5","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"f0125042ed21898106a49204f89336a4994b5e1b","tarball":"https://registry.npmjs.org/@b9g/filesystem-r2/-/filesystem-r2-0.1.5.tgz","fileCount":4,"integrity":"sha512-cfmVDH/O8AAJZstfp/qG9h0MUp5W7SNQ8a+wdkicrLwLZADDR8Cey/eNJeSqFWbiTkpchNZd77Ey7IroV/kK6Q==","signatures":[{"sig":"MEUCIQDft9pcEu76AvSC8tZs0BBNlXtI4jg+BfIKgigwAtgWkgIgRCnJYtaBTDNsgP6dSBJw/CYUNTFI2ou7gaHoWMRRn8w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12313},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"0c2b98fdeac945781a8c333eedc3fd5fb69c6e52","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.6.2","description":"Cloudflare R2 implementation of File System Access API","directories":{},"_nodeVersion":"25.1.0","dependencies":{"@b9g/filesystem":"^0.1.6"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.11"},"peerDependencies":{"@cloudflare/workers-types":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-r2_0.1.5_1764528781421_0.43984441569589494","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Merged into @b9g/platform-cloudflare"},"0.1.6":{"name":"@b9g/filesystem-r2","version":"0.1.6","keywords":["filesystem","r2","cloudflare","storage","web-standards"],"_id":"@b9g/filesystem-r2@0.1.6","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"dist":{"shasum":"54502475f0fde8ed993a84129f1c94667af60a7a","tarball":"https://registry.npmjs.org/@b9g/filesystem-r2/-/filesystem-r2-0.1.6.tgz","fileCount":4,"integrity":"sha512-3PsvaiCJnfLvCwJSwHZpBJEbU+emDAmQ2OmzCAk3eVIgBeP/B7bqstUutKWOVEdPBdpNcpWtHRJc7UvHFmUExQ==","signatures":[{"sig":"MEYCIQDcrHpT6WulSvGgLCD5/A28G9rPoC83vx4UuzudWRVbMQIhAKL4MBtw8dH7CSdoex6pEN+2n+Eia+h3qJELwZZrzUgh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12335},"type":"module","types":"src/index.d.ts","module":"src/index.js","exports":{".":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index":{"types":"./src/index.d.ts","import":"./src/index.js"},"./index.js":{"types":"./src/index.d.ts","import":"./src/index.js"},"./package.json":"./package.json"},"gitHead":"675ed6b5d90286c351d37ce927ce309f426b2951","_npmUser":{"name":"brainkim","email":"briankimpossible@gmail.com"},"_npmVersion":"11.6.2","description":"Cloudflare R2 implementation of File System Access API","directories":{},"_nodeVersion":"25.1.0","dependencies":{"mime":"^4.0.4","@b9g/filesystem":"^0.1.7"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"latest","@b9g/libuild":"^0.1.18"},"peerDependencies":{"@cloudflare/workers-types":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/filesystem-r2_0.1.6_1764712723190_0.009475971785156467","host":"s3://npm-registry-packages-npm-production"},"deprecated":"Merged into @b9g/platform-cloudflare"}},"time":{"created":"2025-11-03T02:17:05.869Z","modified":"2025-12-06T23:50:28.410Z","0.1.0":"2025-11-03T02:17:06.149Z","0.1.1":"2025-11-03T02:33:48.009Z","0.1.3":"2025-11-09T22:10:11.092Z","0.1.4":"2025-11-26T03:17:14.464Z","0.1.5":"2025-11-30T18:53:01.604Z","0.1.6":"2025-12-02T21:58:43.363Z"},"keywords":["filesystem","r2","cloudflare","storage","web-standards"],"description":"Cloudflare R2 implementation of File System Access API","maintainers":[{"name":"brainkim","email":"briankimpossible@gmail.com"}],"readme":"# @b9g/filesystem-r2\n\nCloudflare R2 implementation of the File System Access API. Provides standards-compliant file system operations backed by Cloudflare R2 object storage.\n\n## Features\n\n- File System Access API implementation for R2\n- FileSystemDirectoryHandle and FileSystemFileHandle interfaces\n- Streaming read/write via WritableStream\n- Compatible with @b9g/filesystem abstractions\n- Works in Cloudflare Workers environment\n\n## Installation\n\n```bash\nnpm install @b9g/filesystem-r2 @b9g/filesystem\n```\n\n## Usage\n\n```javascript\nimport {\n  R2FileSystemDirectoryHandle,\n  R2FileSystemFileHandle,\n  R2FileSystemAdapter\n} from '@b9g/filesystem-r2';\n\n// In Cloudflare Workers\nexport default {\n  async fetch(request, env, ctx) {\n    // Create directory handle from R2 binding\n    const rootDir = new R2FileSystemDirectoryHandle(env.MY_BUCKET, '');\n\n    // Get file handle\n    const fileHandle = await rootDir.getFileHandle('data/config.json');\n    const file = await fileHandle.getFile();\n    const config = JSON.parse(await file.text());\n\n    // Write file\n    const writable = await fileHandle.createWritable();\n    await writable.write(JSON.stringify({ updated: true }));\n    await writable.close();\n\n    return new Response('OK');\n  }\n};\n```\n\n## Exports\n\n### Classes\n\n- `R2FileSystemDirectoryHandle` - FileSystemDirectoryHandle for R2\n- `R2FileSystemFileHandle` - FileSystemFileHandle for R2\n- `R2FileSystemWritableFileStream` - WritableStream for R2\n- `R2FileSystemAdapter` - Backend adapter for @b9g/filesystem\n\n## API\n\n### `R2FileSystemDirectoryHandle`\n\nImplements `FileSystemDirectoryHandle` for R2.\n\n**Constructor:** `new R2FileSystemDirectoryHandle(r2Bucket: R2Bucket, prefix: string)`\n\n**Methods:**\n- `getFileHandle(name, options)`: Get a file handle\n- `getDirectoryHandle(name, options)`: Get a subdirectory handle\n- `removeEntry(name, options)`: Remove a file or directory\n- `entries()`: Async iterator over directory entries\n- `keys()`: Async iterator over entry names\n- `values()`: Async iterator over entry handles\n\n### `R2FileSystemFileHandle`\n\nImplements `FileSystemFileHandle` for R2.\n\n**Methods:**\n- `getFile()`: Get the file as a File object\n- `createWritable()`: Create a writable stream for the file\n\n### `R2FileSystemAdapter`\n\nBackend adapter for `@b9g/filesystem` registry.\n\n**Constructor:** `new R2FileSystemAdapter(r2Bucket: R2Bucket, config?: FileSystemConfig)`\n\n### Wrangler Configuration\n\n```toml\n[[r2_buckets]]\nbinding = \"MY_BUCKET\"\nbucket_name = \"my-bucket-name\"\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}