@adonis-agora/media 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/LICENSE +21 -0
- package/dist/configure.d.ts +13 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +20 -0
- package/dist/configure.js.map +1 -0
- package/dist/providers/media_provider.d.ts +20 -0
- package/dist/providers/media_provider.d.ts.map +1 -0
- package/dist/providers/media_provider.js +71 -0
- package/dist/providers/media_provider.js.map +1 -0
- package/dist/src/attachment.d.ts +83 -0
- package/dist/src/attachment.d.ts.map +1 -0
- package/dist/src/attachment.js +144 -0
- package/dist/src/attachment.js.map +1 -0
- package/dist/src/contents.d.ts +9 -0
- package/dist/src/contents.d.ts.map +1 -0
- package/dist/src/contents.js +17 -0
- package/dist/src/contents.js.map +1 -0
- package/dist/src/define_config.d.ts +58 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +8 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/diagnostics.d.ts +49 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +24 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/errors.d.ts +17 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +29 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/image_processor.d.ts +21 -0
- package/dist/src/image_processor.d.ts.map +1 -0
- package/dist/src/image_processor.js +2 -0
- package/dist/src/image_processor.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/media_collection.d.ts +19 -0
- package/dist/src/media_collection.d.ts.map +1 -0
- package/dist/src/media_collection.js +12 -0
- package/dist/src/media_collection.js.map +1 -0
- package/dist/src/media_library.d.ts +71 -0
- package/dist/src/media_library.d.ts.map +1 -0
- package/dist/src/media_library.js +176 -0
- package/dist/src/media_library.js.map +1 -0
- package/dist/src/media_manager.d.ts +38 -0
- package/dist/src/media_manager.d.ts.map +1 -0
- package/dist/src/media_manager.js +46 -0
- package/dist/src/media_manager.js.map +1 -0
- package/dist/src/media_record.d.ts +25 -0
- package/dist/src/media_record.d.ts.map +1 -0
- package/dist/src/media_record.js +2 -0
- package/dist/src/media_record.js.map +1 -0
- package/dist/src/media_store.d.ts +16 -0
- package/dist/src/media_store.d.ts.map +1 -0
- package/dist/src/media_store.js +2 -0
- package/dist/src/media_store.js.map +1 -0
- package/dist/src/processors/factory.d.ts +22 -0
- package/dist/src/processors/factory.d.ts.map +1 -0
- package/dist/src/processors/factory.js +21 -0
- package/dist/src/processors/factory.js.map +1 -0
- package/dist/src/processors/sharp.d.ts +10 -0
- package/dist/src/processors/sharp.d.ts.map +1 -0
- package/dist/src/processors/sharp.js +29 -0
- package/dist/src/processors/sharp.js.map +1 -0
- package/dist/src/storage_manager.d.ts +19 -0
- package/dist/src/storage_manager.d.ts.map +1 -0
- package/dist/src/storage_manager.js +17 -0
- package/dist/src/storage_manager.js.map +1 -0
- package/dist/src/stores/factory.d.ts +51 -0
- package/dist/src/stores/factory.d.ts.map +1 -0
- package/dist/src/stores/factory.js +39 -0
- package/dist/src/stores/factory.js.map +1 -0
- package/dist/src/stores/lucid.d.ts +29 -0
- package/dist/src/stores/lucid.d.ts.map +1 -0
- package/dist/src/stores/lucid.js +106 -0
- package/dist/src/stores/lucid.js.map +1 -0
- package/dist/src/testing/fake_image_processor.d.ts +14 -0
- package/dist/src/testing/fake_image_processor.d.ts.map +1 -0
- package/dist/src/testing/fake_image_processor.js +21 -0
- package/dist/src/testing/fake_image_processor.js.map +1 -0
- package/dist/src/testing/in_memory_disk.d.ts +44 -0
- package/dist/src/testing/in_memory_disk.d.ts.map +1 -0
- package/dist/src/testing/in_memory_disk.js +80 -0
- package/dist/src/testing/in_memory_disk.js.map +1 -0
- package/dist/src/testing/in_memory_media_store.d.ts +12 -0
- package/dist/src/testing/in_memory_media_store.d.ts.map +1 -0
- package/dist/src/testing/in_memory_media_store.js +29 -0
- package/dist/src/testing/in_memory_media_store.js.map +1 -0
- package/dist/src/testing/index.d.ts +4 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +4 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/types.d.ts +44 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/stubs/config/media.stub +36 -0
- package/dist/stubs/database/migrations/create_media_table.stub +39 -0
- package/dist/stubs/main.d.ts +3 -0
- package/dist/stubs/main.d.ts.map +1 -0
- package/dist/stubs/main.js +4 -0
- package/dist/stubs/main.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class MimeNotAllowedError extends Error {
|
|
2
|
+
code = 'E_MEDIA_MIME_NOT_ALLOWED';
|
|
3
|
+
constructor(collection, mimeType) {
|
|
4
|
+
super(`MIME type "${mimeType}" is not allowed in collection "${collection}"`);
|
|
5
|
+
this.name = 'MimeNotAllowedError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class MediaNotFoundError extends Error {
|
|
9
|
+
code = 'E_MEDIA_RECORD_NOT_FOUND';
|
|
10
|
+
constructor(id) {
|
|
11
|
+
super(`Media record not found: ${id}`);
|
|
12
|
+
this.name = 'MediaNotFoundError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class ConversionNotDefinedError extends Error {
|
|
16
|
+
code = 'E_MEDIA_CONVERSION_NOT_DEFINED';
|
|
17
|
+
constructor(collection, conversion) {
|
|
18
|
+
super(`Conversion "${conversion}" is not defined for collection "${collection}"`);
|
|
19
|
+
this.name = 'ConversionNotDefinedError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class ImageProcessorMissingError extends Error {
|
|
23
|
+
code = 'E_MEDIA_IMAGE_PROCESSOR_MISSING';
|
|
24
|
+
constructor() {
|
|
25
|
+
super('No ImageProcessor was configured; conversions are unavailable');
|
|
26
|
+
this.name = 'ImageProcessorMissingError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,GAAG,0BAA0B,CAAC;IAC3C,YAAY,UAAkB,EAAE,QAAgB;QAC9C,KAAK,CAAC,cAAc,QAAQ,mCAAmC,UAAU,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,0BAA0B,CAAC;IAC3C,YAAY,EAAU;QACpB,KAAK,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,gCAAgC,CAAC;IACjD,YAAY,UAAkB,EAAE,UAAkB;QAChD,KAAK,CAAC,eAAe,UAAU,oCAAoC,UAAU,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,GAAG,iCAAiC,CAAC;IAClD;QACE,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ConversionPreset {
|
|
2
|
+
name: string;
|
|
3
|
+
width?: number;
|
|
4
|
+
height?: number;
|
|
5
|
+
fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside';
|
|
6
|
+
format?: 'jpeg' | 'png' | 'webp' | 'avif';
|
|
7
|
+
quality?: number;
|
|
8
|
+
/** Generate eagerly on attach instead of lazily on first access. */
|
|
9
|
+
eager?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface ConversionResult {
|
|
12
|
+
data: Buffer;
|
|
13
|
+
/** Actual output format/extension (e.g. `webp`). */
|
|
14
|
+
format: string;
|
|
15
|
+
contentType: string;
|
|
16
|
+
}
|
|
17
|
+
/** Pluggable image transform engine (default impl: `@adonis-agora/media/processors/sharp`). */
|
|
18
|
+
export interface ImageProcessor {
|
|
19
|
+
convert(input: Buffer, preset: ConversionPreset): Promise<ConversionResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=image_processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image_processor.d.ts","sourceRoot":"","sources":["../../src/image_processor.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,+FAA+F;AAC/F,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image_processor.js","sourceRoot":"","sources":["../../src/image_processor.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { defineConfig, stores, processors } from './define_config.js';
|
|
2
|
+
export type { MediaConfig, StoreContext, StoreFactory, LucidStoreConfig, MemoryStoreConfig, ImageProcessorFactory, } from './define_config.js';
|
|
3
|
+
export { MediaManager } from './media_manager.js';
|
|
4
|
+
export type { MediaManagerOptions } from './media_manager.js';
|
|
5
|
+
export { MediaLibrary } from './media_library.js';
|
|
6
|
+
export type { MediaLibraryOptions, AttachInput, OwnerMediaBinding } from './media_library.js';
|
|
7
|
+
export { Attachment, AttachmentManager, } from './attachment.js';
|
|
8
|
+
export type { AttachmentData, AttachmentVariant, AttachmentManagerOptions, CreateAttachmentInput, CreateAttachmentOptions, } from './attachment.js';
|
|
9
|
+
export { StorageManager } from './storage_manager.js';
|
|
10
|
+
export type { StorageManagerOptions } from './storage_manager.js';
|
|
11
|
+
export type { MediaRecord, MediaConversion } from './media_record.js';
|
|
12
|
+
export type { MediaStore } from './media_store.js';
|
|
13
|
+
export { MediaCollectionRegistry } from './media_collection.js';
|
|
14
|
+
export type { MediaCollectionConfig } from './media_collection.js';
|
|
15
|
+
export type { ConversionPreset, ConversionResult, ImageProcessor } from './image_processor.js';
|
|
16
|
+
export type { Disk, DiskResolver, DiskWriteOptions, DiskMetaData, SignedUrlOptions, } from './types.js';
|
|
17
|
+
export { publishMedia } from './diagnostics.js';
|
|
18
|
+
export type { MediaDiagnosticEvent, MediaDiagnosticPayloads, AttachPayload, DeletePayload, ConversionPayload, AttachmentCreatePayload, AttachmentDeletePayload, } from './diagnostics.js';
|
|
19
|
+
export { MimeNotAllowedError, MediaNotFoundError, ConversionNotDefinedError, ImageProcessorMissingError, } from './errors.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtE,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACL,UAAU,EACV,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/F,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Config idiom
|
|
2
|
+
export { defineConfig, stores, processors } from './define_config.js';
|
|
3
|
+
// Manager + layers
|
|
4
|
+
export { MediaManager } from './media_manager.js';
|
|
5
|
+
export { MediaLibrary } from './media_library.js';
|
|
6
|
+
export { Attachment, AttachmentManager, } from './attachment.js';
|
|
7
|
+
export { StorageManager } from './storage_manager.js';
|
|
8
|
+
export { MediaCollectionRegistry } from './media_collection.js';
|
|
9
|
+
// Diagnostics
|
|
10
|
+
export { publishMedia } from './diagnostics.js';
|
|
11
|
+
// Errors
|
|
12
|
+
export { MimeNotAllowedError, MediaNotFoundError, ConversionNotDefinedError, ImageProcessorMissingError, } from './errors.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUtE,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,UAAU,EACV,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAWhE,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAWhD,SAAS;AACT,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ConversionPreset } from './image_processor.js';
|
|
2
|
+
export interface MediaCollectionConfig {
|
|
3
|
+
name: string;
|
|
4
|
+
/** Single-file collection: attaching replaces any existing media. */
|
|
5
|
+
single?: boolean;
|
|
6
|
+
/** Target disk for this collection (defaults to the storage default disk). */
|
|
7
|
+
disk?: string;
|
|
8
|
+
/** Allowed MIME types; when set, other types are rejected on attach. */
|
|
9
|
+
acceptsMimeTypes?: string[];
|
|
10
|
+
/** Image conversion presets available for this collection. */
|
|
11
|
+
conversions?: ConversionPreset[];
|
|
12
|
+
}
|
|
13
|
+
export declare class MediaCollectionRegistry {
|
|
14
|
+
private readonly map;
|
|
15
|
+
constructor(collections?: MediaCollectionConfig[]);
|
|
16
|
+
/** Registered config for a collection, or a permissive default. */
|
|
17
|
+
get(name: string): MediaCollectionConfig;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=media_collection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_collection.d.ts","sourceRoot":"","sources":["../../src/media_collection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4C;gBAEpD,WAAW,GAAE,qBAAqB,EAAO;IAIrD,mEAAmE;IACnE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB;CAGzC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class MediaCollectionRegistry {
|
|
2
|
+
map = new Map();
|
|
3
|
+
constructor(collections = []) {
|
|
4
|
+
for (const c of collections)
|
|
5
|
+
this.map.set(c.name, c);
|
|
6
|
+
}
|
|
7
|
+
/** Registered config for a collection, or a permissive default. */
|
|
8
|
+
get(name) {
|
|
9
|
+
return this.map.get(name) ?? { name };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=media_collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_collection.js","sourceRoot":"","sources":["../../src/media_collection.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,uBAAuB;IACjB,GAAG,GAAG,IAAI,GAAG,EAAiC,CAAC;IAEhE,YAAY,cAAuC,EAAE;QACnD,KAAK,MAAM,CAAC,IAAI,WAAW;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,mEAAmE;IACnE,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
import type { ImageProcessor } from './image_processor.js';
|
|
3
|
+
import { type MediaCollectionConfig } from './media_collection.js';
|
|
4
|
+
import type { MediaRecord } from './media_record.js';
|
|
5
|
+
import type { MediaStore } from './media_store.js';
|
|
6
|
+
import type { StorageManager } from './storage_manager.js';
|
|
7
|
+
export interface MediaLibraryOptions {
|
|
8
|
+
storage: StorageManager;
|
|
9
|
+
store: MediaStore;
|
|
10
|
+
collections?: MediaCollectionConfig[];
|
|
11
|
+
/** Engine for image conversions. Required only if collections define conversions. */
|
|
12
|
+
imageProcessor?: ImageProcessor;
|
|
13
|
+
/** Emit `agora:media:*` diagnostics events (default true). */
|
|
14
|
+
emitDiagnostics?: boolean;
|
|
15
|
+
/** Injectable for deterministic tests. Defaults to `randomUUID`. */
|
|
16
|
+
idGenerator?: () => string;
|
|
17
|
+
/** Injectable for deterministic tests. Defaults to `() => new Date()`. */
|
|
18
|
+
clock?: () => Date;
|
|
19
|
+
}
|
|
20
|
+
export interface AttachInput {
|
|
21
|
+
ownerType: string;
|
|
22
|
+
ownerId: string;
|
|
23
|
+
collection: string;
|
|
24
|
+
fileName: string;
|
|
25
|
+
mimeType: string;
|
|
26
|
+
contents: Buffer | Readable;
|
|
27
|
+
/** Known byte size; when omitted it is read back from the disk after writing. */
|
|
28
|
+
size?: number;
|
|
29
|
+
name?: string;
|
|
30
|
+
customProperties?: Record<string, unknown>;
|
|
31
|
+
/** Disk override (else collection disk, else storage default). */
|
|
32
|
+
disk?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* An owning entity bound to the library, so collection operations don't repeat
|
|
36
|
+
* `ownerType`/`ownerId`. Obtained from {@link MediaLibrary.for}.
|
|
37
|
+
*/
|
|
38
|
+
export interface OwnerMediaBinding {
|
|
39
|
+
attach(input: Omit<AttachInput, 'ownerType' | 'ownerId'>): Promise<MediaRecord>;
|
|
40
|
+
list(collection?: string): Promise<MediaRecord[]>;
|
|
41
|
+
}
|
|
42
|
+
export declare class MediaLibrary {
|
|
43
|
+
private readonly storage;
|
|
44
|
+
private readonly store;
|
|
45
|
+
private readonly collections;
|
|
46
|
+
private readonly imageProcessor;
|
|
47
|
+
private readonly emitDiagnostics;
|
|
48
|
+
private readonly newId;
|
|
49
|
+
private readonly now;
|
|
50
|
+
constructor(options: MediaLibraryOptions);
|
|
51
|
+
private emit;
|
|
52
|
+
attach(input: AttachInput): Promise<MediaRecord>;
|
|
53
|
+
/** Generate (if absent) and persist a named conversion; returns the updated record. Lazy entry point. */
|
|
54
|
+
ensureConversion(id: string, conversionName: string): Promise<MediaRecord>;
|
|
55
|
+
list(ownerType: string, ownerId: string, collection?: string): Promise<MediaRecord[]>;
|
|
56
|
+
find(id: string): Promise<MediaRecord | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Bind an owning entity so collection operations don't repeat its type/id:
|
|
59
|
+
* `const m = media.library.for('Post', post.id); await m.attach({ collection, ... })`.
|
|
60
|
+
*/
|
|
61
|
+
for(ownerType: string, ownerId: string | number): OwnerMediaBinding;
|
|
62
|
+
delete(id: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Public URL for a media record or one of its conversions. When a conversion is
|
|
65
|
+
* requested and not yet generated, it is produced lazily (and cached) first.
|
|
66
|
+
*/
|
|
67
|
+
url(id: string, conversion?: string): Promise<string>;
|
|
68
|
+
/** Signed, expiring URL for a media record or one of its conversions. */
|
|
69
|
+
signedUrl(id: string, expiresIn: string | number, conversion?: string): Promise<string>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=media_library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_library.d.ts","sourceRoot":"","sources":["../../src/media_library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { asBuffer, toBytes } from './contents.js';
|
|
3
|
+
import { publishMedia } from './diagnostics.js';
|
|
4
|
+
import { ConversionNotDefinedError, ImageProcessorMissingError, MediaNotFoundError, MimeNotAllowedError, } from './errors.js';
|
|
5
|
+
import { MediaCollectionRegistry } from './media_collection.js';
|
|
6
|
+
export class MediaLibrary {
|
|
7
|
+
storage;
|
|
8
|
+
store;
|
|
9
|
+
collections;
|
|
10
|
+
imageProcessor;
|
|
11
|
+
emitDiagnostics;
|
|
12
|
+
newId;
|
|
13
|
+
now;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.storage = options.storage;
|
|
16
|
+
this.store = options.store;
|
|
17
|
+
this.collections = new MediaCollectionRegistry(options.collections ?? []);
|
|
18
|
+
this.imageProcessor = options.imageProcessor;
|
|
19
|
+
this.emitDiagnostics = options.emitDiagnostics ?? true;
|
|
20
|
+
this.newId = options.idGenerator ?? (() => randomUUID());
|
|
21
|
+
this.now = options.clock ?? (() => new Date());
|
|
22
|
+
}
|
|
23
|
+
emit(event, payload) {
|
|
24
|
+
if (this.emitDiagnostics)
|
|
25
|
+
publishMedia(event, payload);
|
|
26
|
+
}
|
|
27
|
+
async attach(input) {
|
|
28
|
+
const config = this.collections.get(input.collection);
|
|
29
|
+
if (config.acceptsMimeTypes && !config.acceptsMimeTypes.includes(input.mimeType)) {
|
|
30
|
+
throw new MimeNotAllowedError(input.collection, input.mimeType);
|
|
31
|
+
}
|
|
32
|
+
// A single-file collection replaces whatever is already there.
|
|
33
|
+
if (config.single) {
|
|
34
|
+
const existing = await this.store.listByOwner(input.ownerType, input.ownerId, input.collection);
|
|
35
|
+
for (const record of existing)
|
|
36
|
+
await this.delete(record.id);
|
|
37
|
+
}
|
|
38
|
+
const disk = input.disk ?? config.disk ?? this.storage.defaultDisk;
|
|
39
|
+
const id = this.newId();
|
|
40
|
+
const path = `${input.ownerType}/${input.ownerId}/${input.collection}/${id}/${input.fileName}`;
|
|
41
|
+
const bytes = await toBytes(input.contents);
|
|
42
|
+
await this.storage.disk(disk).put(path, bytes, { contentType: input.mimeType });
|
|
43
|
+
const size = input.size ?? (await this.storage.disk(disk).getMetaData(path)).contentLength;
|
|
44
|
+
const order = await this.store.nextOrder(input.ownerType, input.ownerId, input.collection);
|
|
45
|
+
const timestamp = this.now();
|
|
46
|
+
const saved = await this.store.save({
|
|
47
|
+
id,
|
|
48
|
+
ownerType: input.ownerType,
|
|
49
|
+
ownerId: input.ownerId,
|
|
50
|
+
collection: input.collection,
|
|
51
|
+
name: input.name ?? stripExtension(input.fileName),
|
|
52
|
+
fileName: input.fileName,
|
|
53
|
+
mimeType: input.mimeType,
|
|
54
|
+
size,
|
|
55
|
+
disk,
|
|
56
|
+
path,
|
|
57
|
+
order,
|
|
58
|
+
customProperties: input.customProperties ?? {},
|
|
59
|
+
conversions: {},
|
|
60
|
+
createdAt: timestamp,
|
|
61
|
+
updatedAt: timestamp,
|
|
62
|
+
});
|
|
63
|
+
this.emit('attach', {
|
|
64
|
+
id: saved.id,
|
|
65
|
+
ownerType: saved.ownerType,
|
|
66
|
+
ownerId: saved.ownerId,
|
|
67
|
+
collection: saved.collection,
|
|
68
|
+
disk: saved.disk,
|
|
69
|
+
path: saved.path,
|
|
70
|
+
size: saved.size,
|
|
71
|
+
mimeType: saved.mimeType,
|
|
72
|
+
});
|
|
73
|
+
// Eager presets are generated synchronously on attach; lazy ones on first `url()`.
|
|
74
|
+
const eager = (config.conversions ?? []).filter((p) => p.eager);
|
|
75
|
+
if (eager.length === 0)
|
|
76
|
+
return saved;
|
|
77
|
+
let current = saved;
|
|
78
|
+
for (const preset of eager)
|
|
79
|
+
current = await this.ensureConversion(saved.id, preset.name);
|
|
80
|
+
return current;
|
|
81
|
+
}
|
|
82
|
+
/** Generate (if absent) and persist a named conversion; returns the updated record. Lazy entry point. */
|
|
83
|
+
async ensureConversion(id, conversionName) {
|
|
84
|
+
const record = await this.store.find(id);
|
|
85
|
+
if (!record)
|
|
86
|
+
throw new MediaNotFoundError(id);
|
|
87
|
+
if (record.conversions[conversionName])
|
|
88
|
+
return record;
|
|
89
|
+
const preset = (this.collections.get(record.collection).conversions ?? []).find((p) => p.name === conversionName);
|
|
90
|
+
if (!preset)
|
|
91
|
+
throw new ConversionNotDefinedError(record.collection, conversionName);
|
|
92
|
+
if (!this.imageProcessor)
|
|
93
|
+
throw new ImageProcessorMissingError();
|
|
94
|
+
const original = asBuffer(await this.storage.disk(record.disk).getBytes(record.path));
|
|
95
|
+
const result = await this.imageProcessor.convert(original, preset);
|
|
96
|
+
const dir = record.path.slice(0, record.path.lastIndexOf('/'));
|
|
97
|
+
const conversionPath = `${dir}/conversions/${conversionName}.${result.format}`;
|
|
98
|
+
await this.storage.disk(record.disk).put(conversionPath, result.data, {
|
|
99
|
+
contentType: result.contentType,
|
|
100
|
+
});
|
|
101
|
+
const updated = await this.store.save({
|
|
102
|
+
...record,
|
|
103
|
+
conversions: {
|
|
104
|
+
...record.conversions,
|
|
105
|
+
[conversionName]: { path: conversionPath, disk: record.disk },
|
|
106
|
+
},
|
|
107
|
+
updatedAt: this.now(),
|
|
108
|
+
});
|
|
109
|
+
this.emit('conversion', { id, conversion: conversionName, path: conversionPath });
|
|
110
|
+
return updated;
|
|
111
|
+
}
|
|
112
|
+
list(ownerType, ownerId, collection) {
|
|
113
|
+
return this.store.listByOwner(ownerType, ownerId, collection);
|
|
114
|
+
}
|
|
115
|
+
find(id) {
|
|
116
|
+
return this.store.find(id);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Bind an owning entity so collection operations don't repeat its type/id:
|
|
120
|
+
* `const m = media.library.for('Post', post.id); await m.attach({ collection, ... })`.
|
|
121
|
+
*/
|
|
122
|
+
for(ownerType, ownerId) {
|
|
123
|
+
const ownerId_ = String(ownerId);
|
|
124
|
+
return {
|
|
125
|
+
attach: (input) => this.attach({ ...input, ownerType, ownerId: ownerId_ }),
|
|
126
|
+
list: (collection) => this.list(ownerType, ownerId_, collection),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
async delete(id) {
|
|
130
|
+
const record = await this.store.find(id);
|
|
131
|
+
if (!record)
|
|
132
|
+
return;
|
|
133
|
+
await this.storage.disk(record.disk).delete(record.path);
|
|
134
|
+
for (const conversion of Object.values(record.conversions)) {
|
|
135
|
+
await this.storage.disk(conversion.disk).delete(conversion.path);
|
|
136
|
+
}
|
|
137
|
+
await this.store.delete(id);
|
|
138
|
+
this.emit('delete', { id, ownerType: record.ownerType, ownerId: record.ownerId });
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Public URL for a media record or one of its conversions. When a conversion is
|
|
142
|
+
* requested and not yet generated, it is produced lazily (and cached) first.
|
|
143
|
+
*/
|
|
144
|
+
async url(id, conversion) {
|
|
145
|
+
if (conversion) {
|
|
146
|
+
const record = await this.ensureConversion(id, conversion);
|
|
147
|
+
const variant = record.conversions[conversion];
|
|
148
|
+
if (!variant)
|
|
149
|
+
throw new MediaNotFoundError(`${id}#${conversion}`);
|
|
150
|
+
return this.storage.disk(variant.disk).getUrl(variant.path);
|
|
151
|
+
}
|
|
152
|
+
const record = await this.store.find(id);
|
|
153
|
+
if (!record)
|
|
154
|
+
throw new MediaNotFoundError(id);
|
|
155
|
+
return this.storage.disk(record.disk).getUrl(record.path);
|
|
156
|
+
}
|
|
157
|
+
/** Signed, expiring URL for a media record or one of its conversions. */
|
|
158
|
+
async signedUrl(id, expiresIn, conversion) {
|
|
159
|
+
if (conversion) {
|
|
160
|
+
const record = await this.ensureConversion(id, conversion);
|
|
161
|
+
const variant = record.conversions[conversion];
|
|
162
|
+
if (!variant)
|
|
163
|
+
throw new MediaNotFoundError(`${id}#${conversion}`);
|
|
164
|
+
return this.storage.disk(variant.disk).getSignedUrl(variant.path, { expiresIn });
|
|
165
|
+
}
|
|
166
|
+
const record = await this.store.find(id);
|
|
167
|
+
if (!record)
|
|
168
|
+
throw new MediaNotFoundError(id);
|
|
169
|
+
return this.storage.disk(record.disk).getSignedUrl(record.path, { expiresIn });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function stripExtension(fileName) {
|
|
173
|
+
const dot = fileName.lastIndexOf('.');
|
|
174
|
+
return dot > 0 ? fileName.slice(0, dot) : fileName;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=media_library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_library.js","sourceRoot":"","sources":["../../src/media_library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AttachmentManager } from './attachment.js';
|
|
2
|
+
import type { ImageProcessor } from './image_processor.js';
|
|
3
|
+
import type { MediaCollectionConfig } from './media_collection.js';
|
|
4
|
+
import { MediaLibrary } from './media_library.js';
|
|
5
|
+
import type { MediaStore } from './media_store.js';
|
|
6
|
+
import { StorageManager } from './storage_manager.js';
|
|
7
|
+
import type { DiskResolver } from './types.js';
|
|
8
|
+
export interface MediaManagerOptions {
|
|
9
|
+
/** Default disk name (resolved by `resolve`). */
|
|
10
|
+
defaultDisk: string;
|
|
11
|
+
/** Resolves a disk by name — `(name) => drive.use(name)` in production. */
|
|
12
|
+
resolve: DiskResolver;
|
|
13
|
+
store: MediaStore;
|
|
14
|
+
imageProcessor?: ImageProcessor;
|
|
15
|
+
collections?: MediaCollectionConfig[];
|
|
16
|
+
attachmentKeyPrefix?: string;
|
|
17
|
+
emitDiagnostics?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The singleton bound into the AdonisJS container as `MediaManager`. Composes the two layers over a
|
|
21
|
+
* shared {@link StorageManager}: {@link MediaLibrary} (owner collections + conversions) and
|
|
22
|
+
* {@link AttachmentManager} (column attachments).
|
|
23
|
+
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* const media = await app.container.make(MediaManager)
|
|
26
|
+
* await media.library.attach({ ownerType: 'Post', ownerId: '1', collection: 'gallery', ... })
|
|
27
|
+
* const att = await media.attachments.createFromFile({ fileName, mimeType, contents })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class MediaManager {
|
|
31
|
+
readonly storage: StorageManager;
|
|
32
|
+
readonly library: MediaLibrary;
|
|
33
|
+
readonly attachments: AttachmentManager;
|
|
34
|
+
constructor(options: MediaManagerOptions);
|
|
35
|
+
/** Resolve a raw disk by name (escape hatch to the underlying Drive disk). */
|
|
36
|
+
disk(name?: string): import("./types.js").Disk;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=media_manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_manager.d.ts","sourceRoot":"","sources":["../../src/media_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,YAAY;IACvB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;gBAE5B,OAAO,EAAE,mBAAmB;IAuBxC,8EAA8E;IAC9E,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;CAGnB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AttachmentManager } from './attachment.js';
|
|
2
|
+
import { MediaLibrary } from './media_library.js';
|
|
3
|
+
import { StorageManager } from './storage_manager.js';
|
|
4
|
+
/**
|
|
5
|
+
* The singleton bound into the AdonisJS container as `MediaManager`. Composes the two layers over a
|
|
6
|
+
* shared {@link StorageManager}: {@link MediaLibrary} (owner collections + conversions) and
|
|
7
|
+
* {@link AttachmentManager} (column attachments).
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const media = await app.container.make(MediaManager)
|
|
11
|
+
* await media.library.attach({ ownerType: 'Post', ownerId: '1', collection: 'gallery', ... })
|
|
12
|
+
* const att = await media.attachments.createFromFile({ fileName, mimeType, contents })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export class MediaManager {
|
|
16
|
+
storage;
|
|
17
|
+
library;
|
|
18
|
+
attachments;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.storage = new StorageManager({ default: options.defaultDisk, resolve: options.resolve });
|
|
21
|
+
this.library = new MediaLibrary({
|
|
22
|
+
storage: this.storage,
|
|
23
|
+
store: options.store,
|
|
24
|
+
...(options.collections !== undefined ? { collections: options.collections } : {}),
|
|
25
|
+
...(options.imageProcessor !== undefined ? { imageProcessor: options.imageProcessor } : {}),
|
|
26
|
+
...(options.emitDiagnostics !== undefined
|
|
27
|
+
? { emitDiagnostics: options.emitDiagnostics }
|
|
28
|
+
: {}),
|
|
29
|
+
});
|
|
30
|
+
this.attachments = new AttachmentManager({
|
|
31
|
+
storage: this.storage,
|
|
32
|
+
...(options.imageProcessor !== undefined ? { imageProcessor: options.imageProcessor } : {}),
|
|
33
|
+
...(options.attachmentKeyPrefix !== undefined
|
|
34
|
+
? { keyPrefix: options.attachmentKeyPrefix }
|
|
35
|
+
: {}),
|
|
36
|
+
...(options.emitDiagnostics !== undefined
|
|
37
|
+
? { emitDiagnostics: options.emitDiagnostics }
|
|
38
|
+
: {}),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Resolve a raw disk by name (escape hatch to the underlying Drive disk). */
|
|
42
|
+
disk(name) {
|
|
43
|
+
return this.storage.disk(name);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=media_manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_manager.js","sourceRoot":"","sources":["../../src/media_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAetD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,YAAY;IACd,OAAO,CAAiB;IACxB,OAAO,CAAe;IACtB,WAAW,CAAoB;IAExC,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC;YAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;gBACvC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,CAAC,mBAAmB,KAAK,SAAS;gBAC3C,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,mBAAmB,EAAE;gBAC5C,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;gBACvC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE;gBAC9C,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,IAAI,CAAC,IAAa;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface MediaConversion {
|
|
2
|
+
path: string;
|
|
3
|
+
disk: string;
|
|
4
|
+
}
|
|
5
|
+
/** A stored file associated with an owning entity (spatie media-library style). */
|
|
6
|
+
export interface MediaRecord {
|
|
7
|
+
id: string;
|
|
8
|
+
ownerType: string;
|
|
9
|
+
ownerId: string;
|
|
10
|
+
collection: string;
|
|
11
|
+
/** Logical display name (defaults to the file name without extension). */
|
|
12
|
+
name: string;
|
|
13
|
+
fileName: string;
|
|
14
|
+
mimeType: string;
|
|
15
|
+
size: number;
|
|
16
|
+
disk: string;
|
|
17
|
+
path: string;
|
|
18
|
+
order: number;
|
|
19
|
+
customProperties: Record<string, unknown>;
|
|
20
|
+
/** Generated variants keyed by conversion name (e.g. `thumb`). */
|
|
21
|
+
conversions: Record<string, MediaConversion>;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
updatedAt: Date;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=media_record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_record.d.ts","sourceRoot":"","sources":["../../src/media_record.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_record.js","sourceRoot":"","sources":["../../src/media_record.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MediaRecord } from './media_record.js';
|
|
2
|
+
/**
|
|
3
|
+
* Persistence SPI for media records. Implemented per backend as a POJO that receives
|
|
4
|
+
* its connection in the constructor. Ships with an in-memory driver (`@adonis-agora/media/testing`)
|
|
5
|
+
* and a Lucid driver (`@adonis-agora/media/stores/lucid`).
|
|
6
|
+
*/
|
|
7
|
+
export interface MediaStore {
|
|
8
|
+
save(record: MediaRecord): Promise<MediaRecord>;
|
|
9
|
+
find(id: string): Promise<MediaRecord | null>;
|
|
10
|
+
/** Records for an owner, optionally a single collection, ordered by `order` asc. */
|
|
11
|
+
listByOwner(ownerType: string, ownerId: string, collection?: string): Promise<MediaRecord[]>;
|
|
12
|
+
delete(id: string): Promise<void>;
|
|
13
|
+
/** Next `order` value for appending to a collection (0-based). */
|
|
14
|
+
nextOrder(ownerType: string, ownerId: string, collection: string): Promise<number>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=media_store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_store.d.ts","sourceRoot":"","sources":["../../src/media_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC9C,oFAAoF;IACpF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,kEAAkE;IAClE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media_store.js","sourceRoot":"","sources":["../../src/media_store.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ImageProcessor } from '../image_processor.js';
|
|
2
|
+
/**
|
|
3
|
+
* A configured image processor: a lazy thunk the media provider calls at boot. The sharp factory
|
|
4
|
+
* imports `sharp` only inside the thunk, so the heavy peer is loaded only when selected.
|
|
5
|
+
*/
|
|
6
|
+
export type ImageProcessorFactory = () => Promise<ImageProcessor>;
|
|
7
|
+
/**
|
|
8
|
+
* The image-processor factory namespace used in `config/media.ts`:
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { defineConfig, processors } from '@adonis-agora/media'
|
|
12
|
+
*
|
|
13
|
+
* export default defineConfig({
|
|
14
|
+
* imageProcessor: processors.sharp(),
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare const processors: {
|
|
19
|
+
/** sharp-backed resize/crop/format/quality (needs the optional `sharp` peer). */
|
|
20
|
+
sharp(): ImageProcessorFactory;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/processors/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;AAElE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU;IACrB,iFAAiF;aACxE,qBAAqB;CAM/B,CAAC"}
|