@nexusts/drive 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,7 +15,7 @@ This module is part of the NexusTS monorepo. Each module is published as its own
15
15
  Most apps start with just the core:
16
16
 
17
17
  ```bash
18
- bun add @nexusts/core reflect-metadata zod hono
18
+ bun add @nexusts/core
19
19
  ```
20
20
 
21
21
  Then add this module only if you need it:
@@ -26,7 +26,7 @@ bun add @nexusts/drive
26
26
 
27
27
  ## Peer dependencies
28
28
 
29
- None. This module is fully self-contained.
29
+ **None.** No external dependencies for the memory / local backends. The S3 / R2 backends require an AWS SDK; install only if you use them.
30
30
 
31
31
  ## Usage
32
32
 
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `DriveModule` — drop-in file storage.
3
+ *
4
+ * @Module({
5
+ * imports: [
6
+ * DriveModule.forRoot({
7
+ * driver: new LocalDriver({ root: '/var/data' }),
8
+ * }),
9
+ * ],
10
+ * })
11
+ * export class AppModule {}
12
+ */
13
+ import "reflect-metadata";
14
+ import type { DriveConfig } from "./types.js";
15
+ export declare class DriveModule {
16
+ static forRoot(config?: DriveConfig): {
17
+ new (): {};
18
+ };
19
+ }
@@ -0,0 +1,20 @@
1
+ import type { DriveConfig, FileContent, FileMetadata, ListOptions, ListResult, PutOptions, SignedUrlOptions } from "./types.js";
2
+ export declare class DriveService {
3
+ /** DI token. */
4
+ static readonly TOKEN: unique symbol;
5
+ private _driver;
6
+ defaultVisibility: NonNullable<DriveConfig["defaultVisibility"]>;
7
+ private signedUrlBuilder;
8
+ constructor(config?: DriveConfig);
9
+ /** Direct access to the underlying driver (for advanced use). */
10
+ get driver(): import("./types.js").StorageDriver;
11
+ put(key: string, body: FileContent, opts?: PutOptions): Promise<void>;
12
+ get(key: string): Promise<Buffer>;
13
+ delete(key: string): Promise<boolean>;
14
+ exists(key: string): Promise<boolean>;
15
+ head(key: string): Promise<FileMetadata>;
16
+ list(opts?: ListOptions): Promise<ListResult>;
17
+ getSignedUrl(key: string, opts?: SignedUrlOptions): Promise<string>;
18
+ copy(src: string, dest: string): Promise<void>;
19
+ move(src: string, dest: string): Promise<void>;
20
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Drivers barrel.
3
+ */
4
+ export { MemoryDriver } from "./memory.js";
5
+ export { LocalDriver } from "./local.js";
6
+ export type { LocalDriverOptions } from "./local.js";
7
+ export { S3Driver } from "./s3.js";
8
+ export type { S3DriverOptions } from "./s3.js";
@@ -0,0 +1,23 @@
1
+ import type { FileContent, FileMetadata, ListOptions, ListResult, PutOptions, SignedUrlOptions, StorageDriver } from "../types.js";
2
+ export interface LocalDriverOptions {
3
+ /** Root directory for this driver. */
4
+ root: string;
5
+ /** Public URL prefix used for `getSignedUrl`. Default: '/files'. */
6
+ publicUrlPrefix?: string;
7
+ }
8
+ export declare class LocalDriver implements StorageDriver {
9
+ readonly kind = "local";
10
+ private readonly root;
11
+ private readonly publicUrlPrefix;
12
+ constructor(opts: LocalDriverOptions);
13
+ private resolveKey;
14
+ put(key: string, body: FileContent, _opts?: PutOptions): Promise<void>;
15
+ get(key: string): Promise<Buffer>;
16
+ delete(key: string): Promise<boolean>;
17
+ exists(key: string): Promise<boolean>;
18
+ head(key: string): Promise<FileMetadata>;
19
+ list(opts?: ListOptions): Promise<ListResult>;
20
+ getSignedUrl(key: string, _opts?: SignedUrlOptions): Promise<string>;
21
+ copy(src: string, dest: string): Promise<void>;
22
+ move(src: string, dest: string): Promise<void>;
23
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * In-memory storage driver. Useful for tests, ephemeral state, and
3
+ * single-process deploys that need a quick KV-like store.
4
+ */
5
+ import type { FileContent, FileMetadata, ListOptions, ListResult, PutOptions, SignedUrlOptions, StorageDriver } from "../types.js";
6
+ export declare class MemoryDriver implements StorageDriver {
7
+ readonly kind = "memory";
8
+ private data;
9
+ put(key: string, body: FileContent, opts?: PutOptions): Promise<void>;
10
+ get(key: string): Promise<Buffer>;
11
+ delete(key: string): Promise<boolean>;
12
+ exists(key: string): Promise<boolean>;
13
+ head(key: string): Promise<FileMetadata>;
14
+ list(opts?: ListOptions): Promise<ListResult>;
15
+ getSignedUrl(key: string, _opts?: SignedUrlOptions): Promise<string>;
16
+ copy(src: string, dest: string): Promise<void>;
17
+ move(src: string, dest: string): Promise<void>;
18
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * S3-compatible driver. Works with AWS S3, Cloudflare R2, MinIO, etc.
3
+ *
4
+ * Implementation strategy: we keep the driver thin and use the
5
+ * `@aws-sdk/client-s3` + `@aws-sdk/s3-request-presigner` packages
6
+ * dynamically. They are listed as `peerDependenciesMeta.optional`
7
+ * so they don't bloat the bundle for users not using S3.
8
+ *
9
+ * const driver = new S3Driver({
10
+ * bucket: 'my-bucket',
11
+ * region: 'us-east-1',
12
+ * credentials: { accessKeyId, secretAccessKey },
13
+ * });
14
+ * const drive = new DriveService({ driver });
15
+ */
16
+ import type { FileContent, FileMetadata, ListOptions, ListResult, PutOptions, SignedUrlOptions, StorageDriver } from "../types.js";
17
+ export interface S3DriverOptions {
18
+ bucket: string;
19
+ region: string;
20
+ endpoint?: string;
21
+ accessKeyId?: string;
22
+ secretAccessKey?: string;
23
+ /** Optional public URL prefix override. */
24
+ publicUrlPrefix?: string;
25
+ }
26
+ export declare class S3Driver implements StorageDriver {
27
+ readonly kind = "s3";
28
+ private opts;
29
+ private _client;
30
+ private _presigner;
31
+ constructor(opts: S3DriverOptions);
32
+ private client;
33
+ private presigner;
34
+ put(key: string, body: FileContent, opts?: PutOptions): Promise<void>;
35
+ get(key: string): Promise<Buffer>;
36
+ delete(key: string): Promise<boolean>;
37
+ exists(key: string): Promise<boolean>;
38
+ head(key: string): Promise<FileMetadata>;
39
+ list(opts?: ListOptions): Promise<ListResult>;
40
+ getSignedUrl(key: string, opts?: SignedUrlOptions): Promise<string>;
41
+ copy(src: string, dest: string): Promise<void>;
42
+ move(src: string, dest: string): Promise<void>;
43
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Public entry point for `nexusjs/drive`.
3
+ */
4
+ export * from "./types.js";
5
+ export { MemoryDriver, LocalDriver, S3Driver } from "./drivers/index.js";
6
+ export type { LocalDriverOptions, S3DriverOptions } from "./drivers/index.js";
7
+ export { DriveService } from "./drive.service.js";
8
+ export { DriveModule } from "./drive.module.js";
package/dist/index.js CHANGED
@@ -1,20 +1,4 @@
1
1
  // @bun
2
- var __create = Object.create;
3
- var __getProtoOf = Object.getPrototypeOf;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __toESM = (mod, isNodeMode, target) => {
8
- target = mod != null ? __create(__getProtoOf(mod)) : {};
9
- const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
10
- for (let key of __getOwnPropNames(mod))
11
- if (!__hasOwnProp.call(to, key))
12
- __defProp(to, key, {
13
- get: () => mod[key],
14
- enumerable: true
15
- });
16
- return to;
17
- };
18
2
  var __legacyDecorateClassTS = function(decorators, target, key, desc) {
19
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -395,7 +379,7 @@ class S3Driver {
395
379
  }
396
380
  }
397
381
  // packages/drive/src/drive.service.ts
398
- import { Inject, Injectable } from "@nexusts/core/decorators/index.js";
382
+ import { Inject, Injectable } from "@nexusts/core";
399
383
  class DriveService {
400
384
  static TOKEN = Symbol.for("nexus:DriveService");
401
385
  _driver;
@@ -446,7 +430,7 @@ DriveService = __legacyDecorateClassTS([
446
430
  ], DriveService);
447
431
  // packages/drive/src/drive.module.ts
448
432
  import"reflect-metadata";
449
- import { Module } from "@nexusts/core/decorators/module.js";
433
+ import { Module } from "@nexusts/core";
450
434
  class DriveModule {
451
435
  static forRoot(config = {}) {
452
436
  const cfg = {
@@ -489,5 +473,5 @@ export {
489
473
  DriveModule
490
474
  };
491
475
 
492
- //# debugId=F50C64731664602964756E2164756E21
476
+ //# debugId=85633DB735EF264D64756E2164756E21
493
477
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -6,10 +6,10 @@
6
6
  "/**\n * In-memory storage driver. Useful for tests, ephemeral state, and\n * single-process deploys that need a quick KV-like store.\n */\nimport type {\n\tFileContent,\n\tFileMetadata,\n\tListOptions,\n\tListResult,\n\tPutOptions,\n\tSignedUrlOptions,\n\tStorageDriver,\n} from \"../types.js\";\n\ninterface MemEntry {\n\tbody: Buffer;\n\tmeta: FileMetadata;\n}\n\nexport class MemoryDriver implements StorageDriver {\n\treadonly kind = \"memory\";\n\tprivate data = new Map<string, MemEntry>();\n\n\tasync put(\n\t\tkey: string,\n\t\tbody: FileContent,\n\t\topts: PutOptions = {},\n\t): Promise<void> {\n\t\tconst buf = toBuffer(body);\n\t\tconst contentType = opts.contentType ?? \"application/octet-stream\";\n\t\tthis.data.set(key, {\n\t\t\tbody: buf,\n\t\t\tmeta: {\n\t\t\t\tkey,\n\t\t\t\tsize: buf.length,\n\t\t\t\tcontentType,\n\t\t\t\tlastModified: Date.now(),\n\t\t\t\tetag: simpleEtag(buf),\n\t\t\t\tmetadata: opts.metadata,\n\t\t\t},\n\t\t});\n\t}\n\n\tasync get(key: string): Promise<Buffer> {\n\t\tconst e = this.data.get(key);\n\t\tif (!e) throw new Error(`File not found: ${key}`);\n\t\treturn e.body;\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\treturn this.data.delete(key);\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\treturn this.data.has(key);\n\t}\n\n\tasync head(key: string): Promise<FileMetadata> {\n\t\tconst e = this.data.get(key);\n\t\tif (!e) throw new Error(`File not found: ${key}`);\n\t\treturn { ...e.meta };\n\t}\n\n\tasync list(opts: ListOptions = {}): Promise<ListResult> {\n\t\tconst all = [...this.data.keys()].sort();\n\t\tconst prefix = opts.prefix ?? \"\";\n\t\tconst filtered = prefix ? all.filter((k) => k.startsWith(prefix)) : all;\n\t\tconst limit = opts.limit ?? 1000;\n\t\tconst startIdx = opts.cursor ? Number(opts.cursor) : 0;\n\t\tconst endIdx = Math.min(startIdx + limit, filtered.length);\n\t\tconst slice = filtered.slice(startIdx, endIdx);\n\t\treturn {\n\t\t\tkeys: slice,\n\t\t\thasMore: endIdx < filtered.length,\n\t\t\tcursor: endIdx < filtered.length ? String(endIdx) : undefined,\n\t\t};\n\t}\n\n\tasync getSignedUrl(\n\t\tkey: string,\n\t\t_opts: SignedUrlOptions = {},\n\t): Promise<string> {\n\t\tif (!this.data.has(key)) throw new Error(`File not found: ${key}`);\n\t\t// No signing in-memory; return a sentinel URL.\n\t\treturn `memory://${encodeURIComponent(key)}`;\n\t}\n\n\tasync copy(src: string, dest: string): Promise<void> {\n\t\tconst e = this.data.get(src);\n\t\tif (!e) throw new Error(`File not found: ${src}`);\n\t\tthis.data.set(dest, {\n\t\t\tbody: e.body,\n\t\t\tmeta: { ...e.meta, key: dest, lastModified: Date.now() },\n\t\t});\n\t}\n\n\tasync move(src: string, dest: string): Promise<void> {\n\t\tawait this.copy(src, dest);\n\t\tthis.data.delete(src);\n\t}\n}\n\nfunction toBuffer(body: FileContent): Buffer {\n\tif (typeof body === \"string\") return Buffer.from(body, \"utf-8\");\n\treturn Buffer.isBuffer(body) ? body : Buffer.from(body);\n}\n\nfunction simpleEtag(buf: Buffer): string {\n\t// Not cryptographic; just a stable hash for cache invalidation.\n\tlet h = 5381;\n\tfor (let i = 0; i < buf.length; i++) h = ((h << 5) + h + buf[i]) | 0;\n\treturn `\"${(h >>> 0).toString(16)}\"`;\n}\n",
7
7
  "/**\n * Local-filesystem driver. Stores files under a `root` directory.\n *\n * - Path traversal is rejected (`..`, absolute paths).\n * - Creates intermediate directories on write.\n * - Uses node:fs/promises for portability with Node and Bun.\n */\nimport {\n\tmkdir,\n\treadFile,\n\tstat,\n\tunlink,\n\twriteFile,\n\treaddir,\n\trename,\n} from \"node:fs/promises\";\nimport { dirname, join, normalize, resolve, sep } from \"node:path\";\nimport type {\n\tFileContent,\n\tFileMetadata,\n\tListOptions,\n\tListResult,\n\tPutOptions,\n\tSignedUrlOptions,\n\tStorageDriver,\n} from \"../types.js\";\n\nexport interface LocalDriverOptions {\n\t/** Root directory for this driver. */\n\troot: string;\n\t/** Public URL prefix used for `getSignedUrl`. Default: '/files'. */\n\tpublicUrlPrefix?: string;\n}\n\nexport class LocalDriver implements StorageDriver {\n\treadonly kind = \"local\";\n\tprivate readonly root: string;\n\tprivate readonly publicUrlPrefix: string;\n\n\tconstructor(opts: LocalDriverOptions) {\n\t\tthis.root = resolve(opts.root);\n\t\tthis.publicUrlPrefix = opts.publicUrlPrefix ?? \"/files\";\n\t}\n\n\tprivate resolveKey(key: string): string {\n\t\tconst safe = normalize(key).replace(/^[/\\\\]+/, \"\");\n\t\tconst full = resolve(this.root, safe);\n\t\t// Ensure the resolved path is inside `root`.\n\t\tif (!full.startsWith(this.root + sep) && full !== this.root) {\n\t\t\tthrow new Error(`Path traversal blocked: ${key}`);\n\t\t}\n\t\treturn full;\n\t}\n\n\tasync put(\n\t\tkey: string,\n\t\tbody: FileContent,\n\t\t_opts: PutOptions = {},\n\t): Promise<void> {\n\t\tconst path = this.resolveKey(key);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tconst buf =\n\t\t\ttypeof body === \"string\" ? Buffer.from(body, \"utf-8\") : Buffer.from(body);\n\t\tawait writeFile(path, buf);\n\t}\n\n\tasync get(key: string): Promise<Buffer> {\n\t\tconst path = this.resolveKey(key);\n\t\ttry {\n\t\t\treturn await readFile(path);\n\t\t} catch (err) {\n\t\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\t\tthrow new Error(`File not found: ${key}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\tconst path = this.resolveKey(key);\n\t\ttry {\n\t\t\tawait unlink(path);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait stat(this.resolveKey(key));\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync head(key: string): Promise<FileMetadata> {\n\t\tconst path = this.resolveKey(key);\n\t\ttry {\n\t\t\tconst s = await stat(path);\n\t\t\treturn {\n\t\t\t\tkey,\n\t\t\t\tsize: s.size,\n\t\t\t\tlastModified: s.mtimeMs,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\t\tthrow new Error(`File not found: ${key}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync list(opts: ListOptions = {}): Promise<ListResult> {\n\t\tconst root = this.root;\n\t\tconst prefix = opts.prefix ?? \"\";\n\t\tconst all = await walk(root, \"\", prefix);\n\t\tall.sort();\n\t\tconst limit = opts.limit ?? 1000;\n\t\tconst startIdx = opts.cursor ? Number(opts.cursor) : 0;\n\t\tconst endIdx = Math.min(startIdx + limit, all.length);\n\t\tconst slice = all.slice(startIdx, endIdx);\n\t\treturn {\n\t\t\tkeys: slice,\n\t\t\thasMore: endIdx < all.length,\n\t\t\tcursor: endIdx < all.length ? String(endIdx) : undefined,\n\t\t};\n\t}\n\n\tasync getSignedUrl(\n\t\tkey: string,\n\t\t_opts: SignedUrlOptions = {},\n\t): Promise<string> {\n\t\t// Local driver: serve via a public prefix. Real signing would require\n\t\t// an upstream reverse proxy with signature verification.\n\t\treturn `${this.publicUrlPrefix}/${key}`;\n\t}\n\n\tasync copy(src: string, dest: string): Promise<void> {\n\t\tconst buf = await this.get(src);\n\t\tawait this.put(dest, buf);\n\t}\n\n\tasync move(src: string, dest: string): Promise<void> {\n\t\tconst from = this.resolveKey(src);\n\t\tconst to = this.resolveKey(dest);\n\t\tawait mkdir(dirname(to), { recursive: true });\n\t\tawait rename(from, to);\n\t}\n}\n\nasync function walk(\n\troot: string,\n\tdir: string,\n\tprefix: string,\n): Promise<string[]> {\n\tconst out: string[] = [];\n\tconst full = join(root, dir);\n\tlet entries;\n\ttry {\n\t\tentries = await readdir(full, { withFileTypes: true });\n\t} catch {\n\t\treturn out;\n\t}\n\tfor (const e of entries) {\n\t\tconst rel = dir ? `${dir}/${e.name}` : e.name;\n\t\tif (e.isDirectory()) {\n\t\t\t// Recurse if this directory is on the prefix path\n\t\t\t// (e.g. searching for 'a/1' should walk into 'a').\n\t\t\tif (\n\t\t\t\t!prefix ||\n\t\t\t\trel === prefix.slice(0, -1) ||\n\t\t\t\trel.startsWith(prefix) ||\n\t\t\t\tprefix.startsWith(`${rel}/`)\n\t\t\t) {\n\t\t\t\tconst sub = await walk(root, rel, prefix);\n\t\t\t\tout.push(...sub);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!prefix || rel.startsWith(prefix)) {\n\t\t\t\tout.push(rel);\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n",
8
8
  "/**\n * S3-compatible driver. Works with AWS S3, Cloudflare R2, MinIO, etc.\n *\n * Implementation strategy: we keep the driver thin and use the\n * `@aws-sdk/client-s3` + `@aws-sdk/s3-request-presigner` packages\n * dynamically. They are listed as `peerDependenciesMeta.optional`\n * so they don't bloat the bundle for users not using S3.\n *\n * const driver = new S3Driver({\n * bucket: 'my-bucket',\n * region: 'us-east-1',\n * credentials: { accessKeyId, secretAccessKey },\n * });\n * const drive = new DriveService({ driver });\n */\nimport type {\n\tFileContent,\n\tFileMetadata,\n\tListOptions,\n\tListResult,\n\tPutOptions,\n\tSignedUrlOptions,\n\tStorageDriver,\n} from \"../types.js\";\n\nexport interface S3DriverOptions {\n\tbucket: string;\n\tregion: string;\n\tendpoint?: string;\n\taccessKeyId?: string;\n\tsecretAccessKey?: string;\n\t/** Optional public URL prefix override. */\n\tpublicUrlPrefix?: string;\n}\n\nexport class S3Driver implements StorageDriver {\n\treadonly kind = \"s3\";\n\tprivate opts: S3DriverOptions;\n\t// Lazily resolved at runtime to avoid bundling aws-sdk unless used.\n\tprivate _client: any = null;\n\tprivate _presigner: any = null;\n\n\tconstructor(opts: S3DriverOptions) {\n\t\tthis.opts = opts;\n\t}\n\n\tprivate async client() {\n\t\tif (this._client) return this._client;\n\t\ttry {\n\t\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\t\tconst ctor = mod.S3Client;\n\t\t\tthis._client = new ctor({\n\t\t\t\tregion: this.opts.region,\n\t\t\t\tendpoint: this.opts.endpoint,\n\t\t\t\tcredentials: this.opts.accessKeyId\n\t\t\t\t\t? {\n\t\t\t\t\t\t\taccessKeyId: this.opts.accessKeyId,\n\t\t\t\t\t\t\tsecretAccessKey: this.opts.secretAccessKey ?? \"\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t\"S3Driver requires @aws-sdk/client-s3. Install it with: bun add @aws-sdk/client-s3\",\n\t\t\t);\n\t\t}\n\t\treturn this._client;\n\t}\n\n\tprivate async presigner() {\n\t\tif (this._presigner) return this._presigner;\n\t\ttry {\n\t\t\tconst mod = await import(\"@aws-sdk/s3-request-presigner\");\n\t\t\tthis._presigner = mod.getSignedUrl;\n\t\t} catch {\n\t\t\tthrow new Error(\n\t\t\t\t\"S3Driver signed URLs require @aws-sdk/s3-request-presigner. Install it with: bun add @aws-sdk/s3-request-presigner\",\n\t\t\t);\n\t\t}\n\t\treturn this._presigner;\n\t}\n\n\tasync put(\n\t\tkey: string,\n\t\tbody: FileContent,\n\t\topts: PutOptions = {},\n\t): Promise<void> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst buf =\n\t\t\ttypeof body === \"string\" ? Buffer.from(body, \"utf-8\") : Buffer.from(body);\n\t\tconst command = new mod.PutObjectCommand({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tKey: key,\n\t\t\tBody: buf,\n\t\t\tContentType: opts.contentType,\n\t\t\tCacheControl: opts.cacheControl,\n\t\t\tACL: opts.acl,\n\t\t\tMetadata: opts.metadata,\n\t\t});\n\t\tawait client.send(command);\n\t}\n\n\tasync get(key: string): Promise<Buffer> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst command = new mod.GetObjectCommand({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tKey: key,\n\t\t});\n\t\tconst res = await client.send(command);\n\t\tconst chunks: Uint8Array[] = [];\n\t\tfor await (const chunk of res.Body as AsyncIterable<Uint8Array>)\n\t\t\tchunks.push(chunk);\n\t\treturn Buffer.concat(chunks);\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst command = new mod.DeleteObjectCommand({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tKey: key,\n\t\t});\n\t\tawait client.send(command);\n\t\treturn true;\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.head(key);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync head(key: string): Promise<FileMetadata> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst command = new mod.HeadObjectCommand({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tKey: key,\n\t\t});\n\t\tconst res = await client.send(command);\n\t\treturn {\n\t\t\tkey,\n\t\t\tsize: res.ContentLength ?? 0,\n\t\t\tcontentType: res.ContentType,\n\t\t\tlastModified: res.LastModified?.getTime() ?? Date.now(),\n\t\t\tetag: res.ETag,\n\t\t};\n\t}\n\n\tasync list(opts: ListOptions = {}): Promise<ListResult> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst command = new mod.ListObjectsV2Command({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tPrefix: opts.prefix,\n\t\t\tMaxKeys: opts.limit,\n\t\t\tContinuationToken: opts.cursor,\n\t\t});\n\t\tconst res = await client.send(command);\n\t\tconst keys = (res.Contents ?? []).map((o: any) => o.Key as string);\n\t\treturn {\n\t\t\tkeys,\n\t\t\thasMore: Boolean(res.IsTruncated),\n\t\t\tcursor: res.NextContinuationToken,\n\t\t};\n\t}\n\n\tasync getSignedUrl(\n\t\tkey: string,\n\t\topts: SignedUrlOptions = {},\n\t): Promise<string> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst presigner = await this.presigner();\n\t\tconst expiresIn = opts.expiresIn ?? 3600;\n\t\tconst command = new mod.GetObjectCommand({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tKey: key,\n\t\t\tResponseContentDisposition: opts.asAttachment\n\t\t\t\t? `attachment; filename=\"${opts.asAttachment}\"`\n\t\t\t\t: undefined,\n\t\t\tResponseContentType: opts.contentType,\n\t\t});\n\t\treturn presigner(client, command, { expiresIn });\n\t}\n\n\tasync copy(src: string, dest: string): Promise<void> {\n\t\tconst client = await this.client();\n\t\tconst mod = await import(\"@aws-sdk/client-s3\");\n\t\tconst command = new mod.CopyObjectCommand({\n\t\t\tBucket: this.opts.bucket,\n\t\t\tKey: dest,\n\t\t\tCopySource: `${this.opts.bucket}/${src}`,\n\t\t});\n\t\tawait client.send(command);\n\t}\n\n\tasync move(src: string, dest: string): Promise<void> {\n\t\tawait this.copy(src, dest);\n\t\tawait this.delete(src);\n\t}\n}\n",
9
- "/**\n * `DriveService` — public façade.\n *\n * const drive = new DriveService({ driver: new LocalDriver({ root: '/data' }) });\n * await drive.put('a.txt', 'hello');\n * const body = await drive.get('a.txt');\n */\nimport { Inject, Injectable } from \"@nexusts/core/decorators/index.js\";\nimport { MemoryDriver } from \"./drivers/memory.js\";\nimport type {\n\tDriveConfig,\n\tFileContent,\n\tFileMetadata,\n\tListOptions,\n\tListResult,\n\tPutOptions,\n\tSignedUrlOptions,\n} from \"./types.js\";\n\n@Injectable()\nexport class DriveService {\n\t/** DI token. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:DriveService\");\n\n\tprivate _driver: import(\"./types.js\").StorageDriver;\n\tdefaultVisibility: NonNullable<DriveConfig[\"defaultVisibility\"]>;\n\tprivate signedUrlBuilder: NonNullable<DriveConfig[\"signedUrlBuilder\"]>;\n\n\tconstructor(@Inject(\"DRIVE_CONFIG\") config: DriveConfig = {}) {\n\t\tthis._driver = config.driver ?? new MemoryDriver();\n\t\tthis.defaultVisibility = config.defaultVisibility ?? \"private\";\n\t\tthis.signedUrlBuilder =\n\t\t\tconfig.signedUrlBuilder ??\n\t\t\t(async (key, opts) => this._driver.getSignedUrl(key, opts));\n\t}\n\n\t/** Direct access to the underlying driver (for advanced use). */\n\tget driver(): import(\"./types.js\").StorageDriver {\n\t\treturn this._driver;\n\t}\n\n\tasync put(key: string, body: FileContent, opts?: PutOptions): Promise<void> {\n\t\treturn this._driver.put(key, body, opts);\n\t}\n\n\tasync get(key: string): Promise<Buffer> {\n\t\treturn this._driver.get(key);\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\treturn this._driver.delete(key);\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\treturn this._driver.exists(key);\n\t}\n\n\tasync head(key: string): Promise<FileMetadata> {\n\t\treturn this._driver.head(key);\n\t}\n\n\tasync list(opts?: ListOptions): Promise<ListResult> {\n\t\treturn this._driver.list(opts);\n\t}\n\n\tasync getSignedUrl(key: string, opts?: SignedUrlOptions): Promise<string> {\n\t\treturn this.signedUrlBuilder(key, opts);\n\t}\n\n\tasync copy(src: string, dest: string): Promise<void> {\n\t\treturn this._driver.copy(src, dest);\n\t}\n\n\tasync move(src: string, dest: string): Promise<void> {\n\t\treturn this._driver.move(src, dest);\n\t}\n}\n",
10
- "/**\n * `DriveModule` — drop-in file storage.\n *\n * @Module({\n * imports: [\n * DriveModule.forRoot({\n * driver: new LocalDriver({ root: '/var/data' }),\n * }),\n * ],\n * })\n * export class AppModule {}\n */\nimport \"reflect-metadata\";\nimport { Module } from \"@nexusts/core/decorators/module.js\";\nimport { DriveService } from \"./drive.service.js\";\nimport { MemoryDriver } from \"./drivers/memory.js\";\nimport type { DriveConfig } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tDriveService,\n\t\t{ provide: DriveService.TOKEN, useExisting: DriveService },\n\t],\n\texports: [DriveService, DriveService.TOKEN],\n})\nexport class DriveModule {\n\tstatic forRoot(config: DriveConfig = {}) {\n\t\tconst cfg: DriveConfig = {\n\t\t\tdriver: new MemoryDriver(),\n\t\t\t...config,\n\t\t};\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tDriveService,\n\t\t\t\t{ provide: DriveService.TOKEN, useExisting: DriveService },\n\t\t\t\t{ provide: \"DRIVE_CONFIG\", useValue: cfg },\n\t\t\t],\n\t\t\texports: [DriveService, DriveService.TOKEN],\n\t\t})\n\t\tclass ConfiguredDriveModule {}\n\t\tObject.defineProperty(ConfiguredDriveModule, \"name\", {\n\t\t\tvalue: \"ConfiguredDriveModule\",\n\t\t});\n\t\treturn ConfiguredDriveModule;\n\t}\n}\n"
9
+ "/**\n * `DriveService` — public façade.\n *\n * const drive = new DriveService({ driver: new LocalDriver({ root: '/data' }) });\n * await drive.put('a.txt', 'hello');\n * const body = await drive.get('a.txt');\n */\nimport { Inject, Injectable } from \"@nexusts/core\";\nimport { MemoryDriver } from \"./drivers/memory.js\";\nimport type {\n\tDriveConfig,\n\tFileContent,\n\tFileMetadata,\n\tListOptions,\n\tListResult,\n\tPutOptions,\n\tSignedUrlOptions,\n} from \"./types.js\";\n\n@Injectable()\nexport class DriveService {\n\t/** DI token. */\n\tstatic readonly TOKEN = Symbol.for(\"nexus:DriveService\");\n\n\tprivate _driver: import(\"./types.js\").StorageDriver;\n\tdefaultVisibility: NonNullable<DriveConfig[\"defaultVisibility\"]>;\n\tprivate signedUrlBuilder: NonNullable<DriveConfig[\"signedUrlBuilder\"]>;\n\n\tconstructor(@Inject(\"DRIVE_CONFIG\") config: DriveConfig = {}) {\n\t\tthis._driver = config.driver ?? new MemoryDriver();\n\t\tthis.defaultVisibility = config.defaultVisibility ?? \"private\";\n\t\tthis.signedUrlBuilder =\n\t\t\tconfig.signedUrlBuilder ??\n\t\t\t(async (key, opts) => this._driver.getSignedUrl(key, opts));\n\t}\n\n\t/** Direct access to the underlying driver (for advanced use). */\n\tget driver(): import(\"./types.js\").StorageDriver {\n\t\treturn this._driver;\n\t}\n\n\tasync put(key: string, body: FileContent, opts?: PutOptions): Promise<void> {\n\t\treturn this._driver.put(key, body, opts);\n\t}\n\n\tasync get(key: string): Promise<Buffer> {\n\t\treturn this._driver.get(key);\n\t}\n\n\tasync delete(key: string): Promise<boolean> {\n\t\treturn this._driver.delete(key);\n\t}\n\n\tasync exists(key: string): Promise<boolean> {\n\t\treturn this._driver.exists(key);\n\t}\n\n\tasync head(key: string): Promise<FileMetadata> {\n\t\treturn this._driver.head(key);\n\t}\n\n\tasync list(opts?: ListOptions): Promise<ListResult> {\n\t\treturn this._driver.list(opts);\n\t}\n\n\tasync getSignedUrl(key: string, opts?: SignedUrlOptions): Promise<string> {\n\t\treturn this.signedUrlBuilder(key, opts);\n\t}\n\n\tasync copy(src: string, dest: string): Promise<void> {\n\t\treturn this._driver.copy(src, dest);\n\t}\n\n\tasync move(src: string, dest: string): Promise<void> {\n\t\treturn this._driver.move(src, dest);\n\t}\n}\n",
10
+ "/**\n * `DriveModule` — drop-in file storage.\n *\n * @Module({\n * imports: [\n * DriveModule.forRoot({\n * driver: new LocalDriver({ root: '/var/data' }),\n * }),\n * ],\n * })\n * export class AppModule {}\n */\nimport \"reflect-metadata\";\nimport { Module } from \"@nexusts/core\";\nimport { DriveService } from \"./drive.service.js\";\nimport { MemoryDriver } from \"./drivers/memory.js\";\nimport type { DriveConfig } from \"./types.js\";\n\n@Module({\n\tproviders: [\n\t\tDriveService,\n\t\t{ provide: DriveService.TOKEN, useExisting: DriveService },\n\t],\n\texports: [DriveService, DriveService.TOKEN],\n})\nexport class DriveModule {\n\tstatic forRoot(config: DriveConfig = {}) {\n\t\tconst cfg: DriveConfig = {\n\t\t\tdriver: new MemoryDriver(),\n\t\t\t...config,\n\t\t};\n\t\t@Module({\n\t\t\tproviders: [\n\t\t\t\tDriveService,\n\t\t\t\t{ provide: DriveService.TOKEN, useExisting: DriveService },\n\t\t\t\t{ provide: \"DRIVE_CONFIG\", useValue: cfg },\n\t\t\t],\n\t\t\texports: [DriveService, DriveService.TOKEN],\n\t\t})\n\t\tclass ConfiguredDriveModule {}\n\t\tObject.defineProperty(ConfiguredDriveModule, \"name\", {\n\t\t\tvalue: \"ConfiguredDriveModule\",\n\t\t});\n\t\treturn ConfiguredDriveModule;\n\t}\n}\n"
11
11
  ],
12
- "mappings": "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",
13
- "debugId": "F50C64731664602964756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "85633DB735EF264D64756E2164756E21",
14
14
  "names": []
15
15
  }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * `nexusjs/drive` — file storage abstraction.
3
+ *
4
+ * const drive = new DriveService({ driver: new LocalDriver({ root: '/var/data' }) });
5
+ * await drive.put('avatars/42.png', bytes, { contentType: 'image/png' });
6
+ * const buf = await drive.get('avatars/42.png');
7
+ *
8
+ * Drivers:
9
+ * - `LocalDriver` — local filesystem
10
+ * - `MemoryDriver` — in-memory map (tests, ephemeral)
11
+ * - `S3Driver` — AWS S3 / Cloudflare R2 (peer dep: @aws-sdk/client-s3)
12
+ *
13
+ * drive.getSignedUrl('avatars/42.png', { expiresIn: 3600 });
14
+ * drive.exists('avatars/42.png');
15
+ * drive.delete('avatars/42.png');
16
+ * drive.list('avatars/');
17
+ */
18
+ import "reflect-metadata";
19
+ /** File content: Buffer, Uint8Array, or string. */
20
+ export type FileContent = Buffer | Uint8Array | string;
21
+ /** Metadata returned by `head()`. */
22
+ export interface FileMetadata {
23
+ /** Full key. */
24
+ key: string;
25
+ /** Size in bytes. */
26
+ size: number;
27
+ /** Detected MIME type, if known. */
28
+ contentType?: string;
29
+ /** Last-modified time (unix-ms). */
30
+ lastModified: number;
31
+ /** ETag, if available. */
32
+ etag?: string;
33
+ /** Custom user metadata. */
34
+ metadata?: Record<string, string>;
35
+ }
36
+ /** Options for `put()`. */
37
+ export interface PutOptions {
38
+ /** MIME type. Auto-detected if omitted. */
39
+ contentType?: string;
40
+ /** Cache-Control header. */
41
+ cacheControl?: string;
42
+ /** Custom user metadata. */
43
+ metadata?: Record<string, string>;
44
+ /** S3-style ACL (`public-read`, `private`, etc.). */
45
+ acl?: string;
46
+ }
47
+ /** Options for signed URL. */
48
+ export interface SignedUrlOptions {
49
+ /** Time until the URL expires, in seconds. */
50
+ expiresIn?: number;
51
+ /** Force download with the given filename. */
52
+ asAttachment?: string;
53
+ /** Override the Content-Type of the response. */
54
+ contentType?: string;
55
+ /** Method. Default: GET. */
56
+ method?: "GET" | "PUT" | "DELETE";
57
+ }
58
+ /** Options for listing. */
59
+ export interface ListOptions {
60
+ /** Return only keys with this prefix. */
61
+ prefix?: string;
62
+ /** Maximum results. */
63
+ limit?: number;
64
+ /** Pagination cursor. */
65
+ cursor?: string;
66
+ }
67
+ /** A single listing result. */
68
+ export interface ListResult {
69
+ keys: string[];
70
+ /** True if more results are available. */
71
+ hasMore: boolean;
72
+ /** Cursor for the next page. */
73
+ cursor?: string;
74
+ }
75
+ /** A driver is a single backing store. */
76
+ export interface StorageDriver {
77
+ readonly kind: string;
78
+ put(key: string, body: FileContent, opts?: PutOptions): Promise<void>;
79
+ get(key: string): Promise<Buffer>;
80
+ delete(key: string): Promise<boolean>;
81
+ exists(key: string): Promise<boolean>;
82
+ head(key: string): Promise<FileMetadata>;
83
+ list(opts?: ListOptions): Promise<ListResult>;
84
+ getSignedUrl(key: string, opts?: SignedUrlOptions): Promise<string>;
85
+ copy(src: string, dest: string): Promise<void>;
86
+ move(src: string, dest: string): Promise<void>;
87
+ }
88
+ /** Top-level Drive configuration. */
89
+ export interface DriveConfig {
90
+ /** Storage driver. Default: in-memory. */
91
+ driver?: StorageDriver;
92
+ /** Default visibility hint passed to drivers that support it. */
93
+ defaultVisibility?: "public" | "private";
94
+ /** Custom URL builder for `getSignedUrl` (default returns a `nexus://` URL). */
95
+ signedUrlBuilder?: (key: string, opts?: SignedUrlOptions) => Promise<string>;
96
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexusts/drive",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "File storage abstraction (Local / S3 / R2 / memory)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,20 +12,15 @@
12
12
  "import": "./dist/index.js"
13
13
  }
14
14
  },
15
- "files": [
16
- "dist",
17
- "README.md"
18
- ],
15
+ "files": ["dist", "README.md"],
19
16
  "scripts": {
20
17
  "build": "bun run ../../build.ts"
21
18
  },
22
- "keywords": [
23
- "nexusts",
24
- "framework",
25
- "bun"
26
- ],
19
+ "keywords": ["nexusts", "framework", "bun"],
27
20
  "license": "MIT",
21
+
22
+
28
23
  "dependencies": {
29
- "@nexusts/core": "^0.7.0"
24
+ "@nexusts/core": "file:../core"
30
25
  }
31
26
  }