@vankyle/storage-shared 0.1.0
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 +75 -0
- package/dist/errors/base-error.d.ts +12 -0
- package/dist/errors/base-error.d.ts.map +1 -0
- package/dist/errors/base-error.js +15 -0
- package/dist/errors/base-error.js.map +1 -0
- package/dist/errors/errors.test.d.ts +2 -0
- package/dist/errors/errors.test.d.ts.map +1 -0
- package/dist/errors/errors.test.js +80 -0
- package/dist/errors/errors.test.js.map +1 -0
- package/dist/errors/index.d.ts +5 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +5 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/metadata-error.d.ts +21 -0
- package/dist/errors/metadata-error.d.ts.map +1 -0
- package/dist/errors/metadata-error.js +25 -0
- package/dist/errors/metadata-error.js.map +1 -0
- package/dist/errors/storage-error.d.ts +20 -0
- package/dist/errors/storage-error.d.ts.map +1 -0
- package/dist/errors/storage-error.js +23 -0
- package/dist/errors/storage-error.js.map +1 -0
- package/dist/errors/validation-error.d.ts +8 -0
- package/dist/errors/validation-error.d.ts.map +1 -0
- package/dist/errors/validation-error.js +9 -0
- package/dist/errors/validation-error.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/json.d.ts +19 -0
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/json.js +2 -0
- package/dist/types/json.js.map +1 -0
- package/dist/types/result.d.ts +13 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +7 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/result.test.d.ts +2 -0
- package/dist/types/result.test.d.ts.map +1 -0
- package/dist/types/result.test.js +31 -0
- package/dist/types/result.test.js.map +1 -0
- package/dist/utils/assert.d.ts +3 -0
- package/dist/utils/assert.d.ts.map +1 -0
- package/dist/utils/assert.js +9 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/env.d.ts +3 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +11 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/utils.test.d.ts +2 -0
- package/dist/utils/utils.test.d.ts.map +1 -0
- package/dist/utils/utils.test.js +58 -0
- package/dist/utils/utils.test.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# @vankyle-hub/storage-shared
|
|
2
|
+
|
|
3
|
+
Cross-package utilities, error types, and foundational TypeScript types for `vankyle-storage`.
|
|
4
|
+
|
|
5
|
+
This package has no internal dependencies and must not import from any other package in this monorepo.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
### Error types
|
|
10
|
+
|
|
11
|
+
All errors extend `BaseError`, which extends the native `Error` class and adds a `code: string` field and an optional `cause`.
|
|
12
|
+
|
|
13
|
+
| Class | Code | Extra fields |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `BaseError` | (abstract) | `code`, `cause?` |
|
|
16
|
+
| `StorageError` | `STORAGE_ERROR` | — |
|
|
17
|
+
| `StorageObjectNotFoundError` | `STORAGE_OBJECT_NOT_FOUND` | `bucket`, `objectKey` |
|
|
18
|
+
| `CapabilityNotSupportedError` | `CAPABILITY_NOT_SUPPORTED` | `capability` |
|
|
19
|
+
| `MetadataError` | `METADATA_ERROR` | — |
|
|
20
|
+
| `MetadataNotFoundError` | `METADATA_NOT_FOUND` | `entityType`, `entityId` |
|
|
21
|
+
| `MetadataConflictError` | `METADATA_CONFLICT` | `entityType`, `entityId` |
|
|
22
|
+
| `ValidationError` | `VALIDATION_ERROR` | `field?` |
|
|
23
|
+
|
|
24
|
+
### `Result<T, E>`
|
|
25
|
+
|
|
26
|
+
A lightweight railway-oriented result type. No dependency on external libraries.
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { ok, err, type Result } from "@vankyle-hub/storage-shared";
|
|
30
|
+
|
|
31
|
+
function divide(a: number, b: number): Result<number, Error> {
|
|
32
|
+
if (b === 0) return err(new Error("division by zero"));
|
|
33
|
+
return ok(a / b);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const result = divide(10, 2);
|
|
37
|
+
if (result.ok) {
|
|
38
|
+
console.log(result.value); // 5
|
|
39
|
+
} else {
|
|
40
|
+
console.error(result.error);
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### TypeScript utility types
|
|
45
|
+
|
|
46
|
+
| Type | Description |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `JsonValue` | `string \| number \| boolean \| null \| JsonObject \| JsonArray` |
|
|
49
|
+
| `JsonObject` | `{ [key: string]: JsonValue }` |
|
|
50
|
+
| `JsonArray` | `JsonValue[]` |
|
|
51
|
+
| `Maybe<T>` | `T \| undefined` |
|
|
52
|
+
| `PartialBy<T, K>` | Make keys `K` optional in `T` |
|
|
53
|
+
| `RequiredBy<T, K>` | Make keys `K` required in `T` |
|
|
54
|
+
| `Defined<T>` | Remove `undefined` from `T` |
|
|
55
|
+
|
|
56
|
+
### Utilities
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { assert, assertNever } from "@vankyle-hub/storage-shared";
|
|
60
|
+
import { getRequiredEnv, getOptionalEnv } from "@vankyle-hub/storage-shared";
|
|
61
|
+
|
|
62
|
+
// Assertion (throws with message if falsy)
|
|
63
|
+
assert(user !== null, "user must exist");
|
|
64
|
+
|
|
65
|
+
// Exhaustive switch guard
|
|
66
|
+
switch (status) {
|
|
67
|
+
case "active": ...
|
|
68
|
+
case "deleted": ...
|
|
69
|
+
default: assertNever(status); // compile error if a case is missing
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Environment variable helpers
|
|
73
|
+
const region = getRequiredEnv("AWS_REGION"); // throws if missing
|
|
74
|
+
const prefix = getOptionalEnv("KEY_PREFIX", "uploads"); // returns fallback if missing
|
|
75
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for the storage system.
|
|
3
|
+
* All domain-specific errors should extend this.
|
|
4
|
+
*/
|
|
5
|
+
export declare class BaseError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly cause?: unknown;
|
|
8
|
+
constructor(code: string, message: string, options?: {
|
|
9
|
+
cause?: unknown;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=base-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-error.d.ts","sourceRoot":"","sources":["../../src/errors/base-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAMzE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for the storage system.
|
|
3
|
+
* All domain-specific errors should extend this.
|
|
4
|
+
*/
|
|
5
|
+
export class BaseError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
cause;
|
|
8
|
+
constructor(code, message, options) {
|
|
9
|
+
super(message, options);
|
|
10
|
+
this.name = this.constructor.name;
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.cause = options?.cause;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=base-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-error.js","sourceRoot":"","sources":["../../src/errors/base-error.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAS;IACb,KAAK,CAAW;IAEzB,YAAY,IAAY,EAAE,OAAe,EAAE,OAA6B;QACtE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/errors/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { BaseError, StorageError, StorageObjectNotFoundError, CapabilityNotSupportedError, MetadataError, MetadataNotFoundError, MetadataConflictError, ValidationError, } from "@vankyle-hub/storage-shared";
|
|
3
|
+
describe("BaseError", () => {
|
|
4
|
+
it("should set code and message", () => {
|
|
5
|
+
const err = new BaseError("TEST_CODE", "test message");
|
|
6
|
+
expect(err.code).toBe("TEST_CODE");
|
|
7
|
+
expect(err.message).toBe("test message");
|
|
8
|
+
expect(err.name).toBe("BaseError");
|
|
9
|
+
expect(err).toBeInstanceOf(Error);
|
|
10
|
+
});
|
|
11
|
+
it("should capture cause", () => {
|
|
12
|
+
const cause = new Error("root");
|
|
13
|
+
const err = new BaseError("TEST", "wrapped", { cause });
|
|
14
|
+
expect(err.cause).toBe(cause);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe("StorageError", () => {
|
|
18
|
+
it("should use STORAGE_ERROR code", () => {
|
|
19
|
+
const err = new StorageError("something broke");
|
|
20
|
+
expect(err.code).toBe("STORAGE_ERROR");
|
|
21
|
+
expect(err.message).toBe("something broke");
|
|
22
|
+
expect(err).toBeInstanceOf(BaseError);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("StorageObjectNotFoundError", () => {
|
|
26
|
+
it("should include bucket and objectKey", () => {
|
|
27
|
+
const err = new StorageObjectNotFoundError("my-bucket", "path/to/file.txt");
|
|
28
|
+
expect(err.code).toBe("STORAGE_OBJECT_NOT_FOUND");
|
|
29
|
+
expect(err.bucket).toBe("my-bucket");
|
|
30
|
+
expect(err.objectKey).toBe("path/to/file.txt");
|
|
31
|
+
expect(err.message).toContain("my-bucket");
|
|
32
|
+
expect(err.message).toContain("path/to/file.txt");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("CapabilityNotSupportedError", () => {
|
|
36
|
+
it("should include capability name", () => {
|
|
37
|
+
const err = new CapabilityNotSupportedError("signedPartUrl");
|
|
38
|
+
expect(err.code).toBe("CAPABILITY_NOT_SUPPORTED");
|
|
39
|
+
expect(err.capability).toBe("signedPartUrl");
|
|
40
|
+
expect(err.message).toContain("signedPartUrl");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("MetadataError", () => {
|
|
44
|
+
it("should use METADATA_ERROR code", () => {
|
|
45
|
+
const err = new MetadataError("db failure");
|
|
46
|
+
expect(err.code).toBe("METADATA_ERROR");
|
|
47
|
+
expect(err.message).toBe("db failure");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("MetadataNotFoundError", () => {
|
|
51
|
+
it("should include entityType and entityId", () => {
|
|
52
|
+
const err = new MetadataNotFoundError("Blob", "abc-123");
|
|
53
|
+
expect(err.code).toBe("METADATA_NOT_FOUND");
|
|
54
|
+
expect(err.entityType).toBe("Blob");
|
|
55
|
+
expect(err.entityId).toBe("abc-123");
|
|
56
|
+
expect(err.message).toContain("Blob");
|
|
57
|
+
expect(err.message).toContain("abc-123");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("MetadataConflictError", () => {
|
|
61
|
+
it("should include entityType and entityId", () => {
|
|
62
|
+
const err = new MetadataConflictError("File", "xyz");
|
|
63
|
+
expect(err.code).toBe("METADATA_CONFLICT");
|
|
64
|
+
expect(err.entityType).toBe("File");
|
|
65
|
+
expect(err.entityId).toBe("xyz");
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("ValidationError", () => {
|
|
69
|
+
it("should include field when provided", () => {
|
|
70
|
+
const err = new ValidationError("invalid value", "email");
|
|
71
|
+
expect(err.code).toBe("VALIDATION_ERROR");
|
|
72
|
+
expect(err.field).toBe("email");
|
|
73
|
+
expect(err.message).toBe("invalid value");
|
|
74
|
+
});
|
|
75
|
+
it("should work without field", () => {
|
|
76
|
+
const err = new ValidationError("bad input");
|
|
77
|
+
expect(err.field).toBeUndefined();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/errors/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { BaseError } from "./base-error.js";
|
|
2
|
+
export { StorageError, StorageObjectNotFoundError, CapabilityNotSupportedError, } from "./storage-error.js";
|
|
3
|
+
export { MetadataError, MetadataNotFoundError, MetadataConflictError, } from "./metadata-error.js";
|
|
4
|
+
export { ValidationError } from "./validation-error.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { BaseError } from "./base-error.js";
|
|
2
|
+
export { StorageError, StorageObjectNotFoundError, CapabilityNotSupportedError, } from "./storage-error.js";
|
|
3
|
+
export { MetadataError, MetadataNotFoundError, MetadataConflictError, } from "./metadata-error.js";
|
|
4
|
+
export { ValidationError } from "./validation-error.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseError } from "./base-error.js";
|
|
2
|
+
export declare class MetadataError extends BaseError {
|
|
3
|
+
constructor(message: string, options?: {
|
|
4
|
+
cause?: unknown;
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export declare class MetadataNotFoundError extends BaseError {
|
|
8
|
+
readonly entityType: string;
|
|
9
|
+
readonly entityId: string;
|
|
10
|
+
constructor(entityType: string, entityId: string, options?: {
|
|
11
|
+
cause?: unknown;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export declare class MetadataConflictError extends BaseError {
|
|
15
|
+
readonly entityType: string;
|
|
16
|
+
readonly entityId: string;
|
|
17
|
+
constructor(entityType: string, entityId: string, options?: {
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=metadata-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-error.d.ts","sourceRoot":"","sources":["../../src/errors/metadata-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG3D;AAED,qBAAa,qBAAsB,SAAQ,SAAS;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhF;AAED,qBAAa,qBAAsB,SAAQ,SAAS;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAKhF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseError } from "./base-error.js";
|
|
2
|
+
export class MetadataError extends BaseError {
|
|
3
|
+
constructor(message, options) {
|
|
4
|
+
super("METADATA_ERROR", message, options);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class MetadataNotFoundError extends BaseError {
|
|
8
|
+
entityType;
|
|
9
|
+
entityId;
|
|
10
|
+
constructor(entityType, entityId, options) {
|
|
11
|
+
super("METADATA_NOT_FOUND", `${entityType} not found: ${entityId}`, options);
|
|
12
|
+
this.entityType = entityType;
|
|
13
|
+
this.entityId = entityId;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class MetadataConflictError extends BaseError {
|
|
17
|
+
entityType;
|
|
18
|
+
entityId;
|
|
19
|
+
constructor(entityType, entityId, options) {
|
|
20
|
+
super("METADATA_CONFLICT", `${entityType} conflict: ${entityId}`, options);
|
|
21
|
+
this.entityType = entityType;
|
|
22
|
+
this.entityId = entityId;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=metadata-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-error.js","sourceRoot":"","sources":["../../src/errors/metadata-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,OAAO,aAAc,SAAQ,SAAS;IAC1C,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IACzC,UAAU,CAAS;IACnB,QAAQ,CAAS;IAE1B,YAAY,UAAkB,EAAE,QAAgB,EAAE,OAA6B;QAC7E,KAAK,CAAC,oBAAoB,EAAE,GAAG,UAAU,eAAe,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IACzC,UAAU,CAAS;IACnB,QAAQ,CAAS;IAE1B,YAAY,UAAkB,EAAE,QAAgB,EAAE,OAA6B;QAC7E,KAAK,CAAC,mBAAmB,EAAE,GAAG,UAAU,cAAc,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseError } from "./base-error.js";
|
|
2
|
+
export declare class StorageError extends BaseError {
|
|
3
|
+
constructor(message: string, options?: {
|
|
4
|
+
cause?: unknown;
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export declare class StorageObjectNotFoundError extends BaseError {
|
|
8
|
+
readonly bucket: string;
|
|
9
|
+
readonly objectKey: string;
|
|
10
|
+
constructor(bucket: string, objectKey: string, options?: {
|
|
11
|
+
cause?: unknown;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export declare class CapabilityNotSupportedError extends BaseError {
|
|
15
|
+
readonly capability: string;
|
|
16
|
+
constructor(capability: string, options?: {
|
|
17
|
+
cause?: unknown;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=storage-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-error.d.ts","sourceRoot":"","sources":["../../src/errors/storage-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBAAa,YAAa,SAAQ,SAAS;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAG3D;AAED,qBAAa,0BAA2B,SAAQ,SAAS;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAK7E;AAED,qBAAa,2BAA4B,SAAQ,SAAS;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI9D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BaseError } from "./base-error.js";
|
|
2
|
+
export class StorageError extends BaseError {
|
|
3
|
+
constructor(message, options) {
|
|
4
|
+
super("STORAGE_ERROR", message, options);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class StorageObjectNotFoundError extends BaseError {
|
|
8
|
+
bucket;
|
|
9
|
+
objectKey;
|
|
10
|
+
constructor(bucket, objectKey, options) {
|
|
11
|
+
super("STORAGE_OBJECT_NOT_FOUND", `Object not found: ${bucket}/${objectKey}`, options);
|
|
12
|
+
this.bucket = bucket;
|
|
13
|
+
this.objectKey = objectKey;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class CapabilityNotSupportedError extends BaseError {
|
|
17
|
+
capability;
|
|
18
|
+
constructor(capability, options) {
|
|
19
|
+
super("CAPABILITY_NOT_SUPPORTED", `Capability not supported: ${capability}`, options);
|
|
20
|
+
this.capability = capability;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=storage-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-error.js","sourceRoot":"","sources":["../../src/errors/storage-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,OAAO,YAAa,SAAQ,SAAS;IACzC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,SAAS;IAC9C,MAAM,CAAS;IACf,SAAS,CAAS;IAE3B,YAAY,MAAc,EAAE,SAAiB,EAAE,OAA6B;QAC1E,KAAK,CAAC,0BAA0B,EAAE,qBAAqB,MAAM,IAAI,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,SAAS;IAC/C,UAAU,CAAS;IAE5B,YAAY,UAAkB,EAAE,OAA6B;QAC3D,KAAK,CAAC,0BAA0B,EAAE,6BAA6B,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QACtF,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseError } from "./base-error.js";
|
|
2
|
+
export declare class ValidationError extends BaseError {
|
|
3
|
+
readonly field?: string | undefined;
|
|
4
|
+
constructor(message: string, field?: string | undefined, options?: {
|
|
5
|
+
cause?: unknown;
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=validation-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../src/errors/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAIvF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseError } from "./base-error.js";
|
|
2
|
+
export class ValidationError extends BaseError {
|
|
3
|
+
field;
|
|
4
|
+
constructor(message, field, options) {
|
|
5
|
+
super("VALIDATION_ERROR", message, options);
|
|
6
|
+
this.field = field;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=validation-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../src/errors/validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,OAAO,eAAgB,SAAQ,SAAS;IACnC,KAAK,CAAsB;IAEpC,YAAY,OAAe,EAAE,KAA0B,EAAE,OAA6B;QACpF,KAAK,CAAC,kBAAkB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxH,OAAO,EAAE,KAAK,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** JSON-compatible primitive types */
|
|
2
|
+
export type JsonPrimitive = string | number | boolean | null;
|
|
3
|
+
/** JSON-compatible array */
|
|
4
|
+
export type JsonArray = JsonValue[];
|
|
5
|
+
/** JSON-compatible object */
|
|
6
|
+
export type JsonObject = {
|
|
7
|
+
[key: string]: JsonValue;
|
|
8
|
+
};
|
|
9
|
+
/** Any JSON-compatible value */
|
|
10
|
+
export type JsonValue = JsonPrimitive | JsonArray | JsonObject;
|
|
11
|
+
/** Make selected properties optional */
|
|
12
|
+
export type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
13
|
+
/** Make selected properties required */
|
|
14
|
+
export type RequiredBy<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
|
|
15
|
+
/** Extract non-undefined type */
|
|
16
|
+
export type Defined<T> = T extends undefined ? never : T;
|
|
17
|
+
/** A value that may or may not be present */
|
|
18
|
+
export type Maybe<T> = T | undefined;
|
|
19
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/types/json.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAE7D,4BAA4B;AAC5B,MAAM,MAAM,SAAS,GAAG,SAAS,EAAE,CAAC;AAEpC,6BAA6B;AAC7B,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,gCAAgC;AAChC,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D,wCAAwC;AACxC,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAE/E,wCAAwC;AACxC,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEjF,iCAAiC;AACjC,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AAEzD,6CAA6C;AAC7C,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/types/json.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents an operation result that can either succeed or fail.
|
|
3
|
+
*/
|
|
4
|
+
export type Result<T, E = Error> = {
|
|
5
|
+
readonly ok: true;
|
|
6
|
+
readonly value: T;
|
|
7
|
+
} | {
|
|
8
|
+
readonly ok: false;
|
|
9
|
+
readonly error: E;
|
|
10
|
+
};
|
|
11
|
+
export declare function ok<T>(value: T): Result<T, never>;
|
|
12
|
+
export declare function err<E>(error: E): Result<never, E>;
|
|
13
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/types/result.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,IAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9C,wBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAEhD;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAEjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/types/result.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,KAAQ;IAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.test.d.ts","sourceRoot":"","sources":["../../src/types/result.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { ok, err } from "@vankyle-hub/storage-shared";
|
|
3
|
+
describe("Result type", () => {
|
|
4
|
+
it("ok() should create a success result", () => {
|
|
5
|
+
const result = ok(42);
|
|
6
|
+
expect(result.ok).toBe(true);
|
|
7
|
+
if (result.ok) {
|
|
8
|
+
expect(result.value).toBe(42);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
it("err() should create a failure result", () => {
|
|
12
|
+
const result = err("something went wrong");
|
|
13
|
+
expect(result.ok).toBe(false);
|
|
14
|
+
if (!result.ok) {
|
|
15
|
+
expect(result.error).toBe("something went wrong");
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
it("should work with complex types", () => {
|
|
19
|
+
const success = ok({ id: "abc" });
|
|
20
|
+
expect(success.ok).toBe(true);
|
|
21
|
+
if (success.ok) {
|
|
22
|
+
expect(success.value.id).toBe("abc");
|
|
23
|
+
}
|
|
24
|
+
const failure = err(new Error("fail"));
|
|
25
|
+
expect(failure.ok).toBe(false);
|
|
26
|
+
if (!failure.ok) {
|
|
27
|
+
expect(failure.error.message).toBe("fail");
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=result.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.test.js","sourceRoot":"","sources":["../../src/types/result.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAGtD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,OAAO,GAAkC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAkC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/utils/assert.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAI9E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEjE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function assert(condition, message) {
|
|
2
|
+
if (!condition) {
|
|
3
|
+
throw new Error(message ?? "Assertion failed");
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export function assertNever(value, message) {
|
|
7
|
+
throw new Error(message ?? `Unexpected value: ${String(value)}`);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=assert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../../src/utils/assert.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,SAAkB,EAAE,OAAgB;IACzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,OAAgB;IACxD,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,qBAAqB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function getRequiredEnv(key) {
|
|
2
|
+
const value = process.env[key];
|
|
3
|
+
if (value === undefined || value === "") {
|
|
4
|
+
throw new Error(`Required environment variable "${key}" is not set`);
|
|
5
|
+
}
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
export function getOptionalEnv(key, fallback) {
|
|
9
|
+
return process.env[key] ?? fallback;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,cAAc,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAiB;IAC3D,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/utils/utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
|
+
import { assert, assertNever, getRequiredEnv, getOptionalEnv } from "@vankyle-hub/storage-shared";
|
|
3
|
+
describe("assert", () => {
|
|
4
|
+
it("should not throw when condition is truthy", () => {
|
|
5
|
+
expect(() => assert(true)).not.toThrow();
|
|
6
|
+
expect(() => assert(1)).not.toThrow();
|
|
7
|
+
expect(() => assert("non-empty")).not.toThrow();
|
|
8
|
+
});
|
|
9
|
+
it("should throw when condition is falsy", () => {
|
|
10
|
+
expect(() => assert(false)).toThrow("Assertion failed");
|
|
11
|
+
expect(() => assert(null)).toThrow();
|
|
12
|
+
expect(() => assert(0)).toThrow();
|
|
13
|
+
expect(() => assert("")).toThrow();
|
|
14
|
+
});
|
|
15
|
+
it("should use custom message", () => {
|
|
16
|
+
expect(() => assert(false, "custom message")).toThrow("custom message");
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe("assertNever", () => {
|
|
20
|
+
it("should throw with value description", () => {
|
|
21
|
+
expect(() => assertNever("oops")).toThrow("Unexpected value: oops");
|
|
22
|
+
});
|
|
23
|
+
it("should use custom message", () => {
|
|
24
|
+
expect(() => assertNever("x", "custom")).toThrow("custom");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("getRequiredEnv", () => {
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
delete process.env["TEST_REQUIRED_VAR"];
|
|
30
|
+
});
|
|
31
|
+
it("should return env value when set", () => {
|
|
32
|
+
process.env["TEST_REQUIRED_VAR"] = "hello";
|
|
33
|
+
expect(getRequiredEnv("TEST_REQUIRED_VAR")).toBe("hello");
|
|
34
|
+
});
|
|
35
|
+
it("should throw when env is not set", () => {
|
|
36
|
+
expect(() => getRequiredEnv("TEST_REQUIRED_VAR")).toThrow();
|
|
37
|
+
});
|
|
38
|
+
it("should throw when env is empty string", () => {
|
|
39
|
+
process.env["TEST_REQUIRED_VAR"] = "";
|
|
40
|
+
expect(() => getRequiredEnv("TEST_REQUIRED_VAR")).toThrow();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("getOptionalEnv", () => {
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
delete process.env["TEST_OPT_VAR"];
|
|
46
|
+
});
|
|
47
|
+
it("should return env value when set", () => {
|
|
48
|
+
process.env["TEST_OPT_VAR"] = "world";
|
|
49
|
+
expect(getOptionalEnv("TEST_OPT_VAR")).toBe("world");
|
|
50
|
+
});
|
|
51
|
+
it("should return undefined when not set and no fallback", () => {
|
|
52
|
+
expect(getOptionalEnv("TEST_OPT_VAR")).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
it("should return fallback when not set", () => {
|
|
55
|
+
expect(getOptionalEnv("TEST_OPT_VAR", "default")).toBe("default");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/utils/utils.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vankyle/storage-shared",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared errors, utility types, and helpers for vankyle-storage.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -b tsconfig.json --force",
|
|
19
|
+
"clean": "rimraf dist tsconfig.tsbuildinfo",
|
|
20
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
21
|
+
},
|
|
22
|
+
"license": "MPL-2.0",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/Vankyle-Hub/storage-ts.git",
|
|
26
|
+
"directory": "packages/shared"
|
|
27
|
+
},
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/Vankyle-Hub/storage-ts/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/Vankyle-Hub/storage-ts",
|
|
32
|
+
"packageManager": "pnpm@10.28.2",
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
}
|
|
36
|
+
}
|