@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,44 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
/**
|
|
3
|
+
* The minimal disk surface `@adonis-agora/media` needs — a structural subset of an
|
|
4
|
+
* `@adonisjs/drive` (flydrive) Disk, so a real Drive disk satisfies it directly. The library
|
|
5
|
+
* NEVER imports Drive; it resolves a disk from the {@link DiskResolver} (the Drive manager's
|
|
6
|
+
* `use(name)` in production, a fake in tests) and only ever calls these methods. This keeps Drive
|
|
7
|
+
* a peer dependency and lets the in-memory test disk implement the same contract.
|
|
8
|
+
*
|
|
9
|
+
* Binary reads use `getBytes` (a `Uint8Array`) rather than `get` (which flydrive returns as a UTF-8
|
|
10
|
+
* string); writes accept a `Uint8Array`, so callers buffer any `Readable` first.
|
|
11
|
+
*/
|
|
12
|
+
export interface Disk {
|
|
13
|
+
put(key: string, contents: Uint8Array, options?: DiskWriteOptions): Promise<void>;
|
|
14
|
+
getBytes(key: string): Promise<Uint8Array>;
|
|
15
|
+
getStream(key: string): Promise<Readable>;
|
|
16
|
+
exists(key: string): Promise<boolean>;
|
|
17
|
+
delete(key: string): Promise<void>;
|
|
18
|
+
getUrl(key: string): Promise<string>;
|
|
19
|
+
getSignedUrl(key: string, options?: SignedUrlOptions): Promise<string>;
|
|
20
|
+
getMetaData(key: string): Promise<DiskMetaData>;
|
|
21
|
+
}
|
|
22
|
+
export interface DiskWriteOptions {
|
|
23
|
+
contentType?: string;
|
|
24
|
+
visibility?: 'public' | 'private';
|
|
25
|
+
}
|
|
26
|
+
export interface SignedUrlOptions {
|
|
27
|
+
/** Human-readable duration accepted by Drive, e.g. `'30m'`, `'1h'`, or seconds as a number. */
|
|
28
|
+
expiresIn?: string | number;
|
|
29
|
+
contentType?: string;
|
|
30
|
+
contentDisposition?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface DiskMetaData {
|
|
33
|
+
contentLength: number;
|
|
34
|
+
contentType?: string | undefined;
|
|
35
|
+
etag?: string | undefined;
|
|
36
|
+
lastModified?: Date | undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolves a disk by name. In an AdonisJS app this is `(name) => drive.use(name)`; the
|
|
40
|
+
* provider builds it from the booted Drive manager. Tests pass a resolver over fake disks.
|
|
41
|
+
* Omitting the name yields the configured default disk.
|
|
42
|
+
*/
|
|
43
|
+
export type DiskResolver = (name?: string) => Disk;
|
|
44
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;GASG;AACH,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.configPath('media.ts') })
|
|
3
|
+
}}}
|
|
4
|
+
import { defineConfig, stores, processors } from '@adonis-agora/media'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for @adonis-agora/media. Storage is delegated to @adonisjs/drive — `disk` names a disk
|
|
8
|
+
* from your config/drive.ts (omit to use Drive's default). Pick a `store` by name from the map below;
|
|
9
|
+
* each driver's peer dependency is imported lazily, only when selected. The default store is the
|
|
10
|
+
* in-process `memory` store (single-process, non-durable). For production select `lucid` and run
|
|
11
|
+
* `node ace migration:run`.
|
|
12
|
+
*
|
|
13
|
+
* Conversions need an image processor — `processors.sharp()` loads the optional `sharp` peer lazily.
|
|
14
|
+
*/
|
|
15
|
+
export default defineConfig({
|
|
16
|
+
// disk: 's3', // omit to use Drive's default disk
|
|
17
|
+
|
|
18
|
+
store: 'memory',
|
|
19
|
+
stores: {
|
|
20
|
+
memory: stores.memory(),
|
|
21
|
+
lucid: stores.lucid(),
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
imageProcessor: processors.sharp(),
|
|
25
|
+
|
|
26
|
+
collections: [
|
|
27
|
+
{ name: 'avatar', single: true, acceptsMimeTypes: ['image/png', 'image/jpeg'] },
|
|
28
|
+
{
|
|
29
|
+
name: 'gallery',
|
|
30
|
+
conversions: [
|
|
31
|
+
{ name: 'thumb', width: 200, height: 200 },
|
|
32
|
+
{ name: 'og', width: 1200, eager: true },
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
})
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.migrationsPath(`${new Date().getTime()}_create_media_table.ts`) })
|
|
3
|
+
}}}
|
|
4
|
+
import { BaseSchema } from '@adonisjs/lucid/schema'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The `media` table for the @adonis-agora/media `lucid` store. JSON payloads (`custom_properties`,
|
|
8
|
+
* `conversions`) are stored as TEXT — the store (de)serializes them — and timestamps as epoch-ms
|
|
9
|
+
* integers, so the schema is portable across SQLite / Postgres / MySQL.
|
|
10
|
+
*/
|
|
11
|
+
export default class extends BaseSchema {
|
|
12
|
+
protected tableName = 'media'
|
|
13
|
+
|
|
14
|
+
async up() {
|
|
15
|
+
this.schema.createTable(this.tableName, (table) => {
|
|
16
|
+
table.string('id').primary()
|
|
17
|
+
table.string('owner_type').notNullable()
|
|
18
|
+
table.string('owner_id').notNullable()
|
|
19
|
+
table.string('collection').notNullable()
|
|
20
|
+
table.string('name').notNullable()
|
|
21
|
+
table.string('file_name').notNullable()
|
|
22
|
+
table.string('mime_type').notNullable()
|
|
23
|
+
table.bigInteger('size').notNullable()
|
|
24
|
+
table.string('disk').notNullable()
|
|
25
|
+
table.text('path').notNullable()
|
|
26
|
+
table.integer('order').notNullable().defaultTo(0)
|
|
27
|
+
table.text('custom_properties')
|
|
28
|
+
table.text('conversions')
|
|
29
|
+
table.bigInteger('created_at').notNullable()
|
|
30
|
+
table.bigInteger('updated_at').notNullable()
|
|
31
|
+
table.index(['owner_type', 'owner_id'], 'media_owner_idx')
|
|
32
|
+
table.index(['owner_type', 'owner_id', 'collection'], 'media_owner_collection_idx')
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async down() {
|
|
37
|
+
this.schema.dropTable(this.tableName)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../stubs/main.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,eAAO,MAAM,SAAS,QAAgD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../stubs/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@adonis-agora/media",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Media-library for AdonisJS — owner collections (MIME whitelist, single-file replace, ordering), image conversions (eager/lazy), and column attachments, all on top of @adonisjs/drive. Pluggable MediaStore (in-memory + Lucid) and ImageProcessor (sharp). Part of the Agora ecosystem.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/DavideCarvalho/adonis-media.git",
|
|
9
|
+
"directory": "packages/adonis"
|
|
10
|
+
},
|
|
11
|
+
"author": "Davi Carvalho <davi@goflip.ai>",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./dist/src/index.js",
|
|
14
|
+
"types": "./dist/src/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/src/index.d.ts",
|
|
18
|
+
"import": "./dist/src/index.js",
|
|
19
|
+
"default": "./dist/src/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./media_provider": {
|
|
22
|
+
"types": "./dist/providers/media_provider.d.ts",
|
|
23
|
+
"import": "./dist/providers/media_provider.js",
|
|
24
|
+
"default": "./dist/providers/media_provider.js"
|
|
25
|
+
},
|
|
26
|
+
"./configure": {
|
|
27
|
+
"types": "./dist/configure.d.ts",
|
|
28
|
+
"import": "./dist/configure.js",
|
|
29
|
+
"default": "./dist/configure.js"
|
|
30
|
+
},
|
|
31
|
+
"./stores/lucid": {
|
|
32
|
+
"types": "./dist/src/stores/lucid.d.ts",
|
|
33
|
+
"import": "./dist/src/stores/lucid.js",
|
|
34
|
+
"default": "./dist/src/stores/lucid.js"
|
|
35
|
+
},
|
|
36
|
+
"./processors/sharp": {
|
|
37
|
+
"types": "./dist/src/processors/sharp.d.ts",
|
|
38
|
+
"import": "./dist/src/processors/sharp.js",
|
|
39
|
+
"default": "./dist/src/processors/sharp.js"
|
|
40
|
+
},
|
|
41
|
+
"./testing": {
|
|
42
|
+
"types": "./dist/src/testing/index.d.ts",
|
|
43
|
+
"import": "./dist/src/testing/index.js",
|
|
44
|
+
"default": "./dist/src/testing/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./types": {
|
|
47
|
+
"types": "./dist/src/types.d.ts",
|
|
48
|
+
"import": "./dist/src/types.js",
|
|
49
|
+
"default": "./dist/src/types.js"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"files": [
|
|
53
|
+
"dist/",
|
|
54
|
+
"README.md",
|
|
55
|
+
"CHANGELOG.md"
|
|
56
|
+
],
|
|
57
|
+
"sideEffects": false,
|
|
58
|
+
"peerDependencies": {
|
|
59
|
+
"@adonisjs/core": "^7.3.0",
|
|
60
|
+
"@adonisjs/drive": "^3.0.0",
|
|
61
|
+
"@adonisjs/lucid": "^22.4.0",
|
|
62
|
+
"sharp": "^0.33.0"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"@adonisjs/lucid": {
|
|
66
|
+
"optional": true
|
|
67
|
+
},
|
|
68
|
+
"sharp": {
|
|
69
|
+
"optional": true
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
"devDependencies": {
|
|
73
|
+
"@adonisjs/assembler": "^8.4.0",
|
|
74
|
+
"@adonisjs/core": "^7.3.0",
|
|
75
|
+
"@adonisjs/drive": "^3.0.0",
|
|
76
|
+
"@adonisjs/lucid": "^22.4.0",
|
|
77
|
+
"@types/node": "^20.0.0",
|
|
78
|
+
"sharp": "^0.33.0",
|
|
79
|
+
"typescript": "^5.4.0",
|
|
80
|
+
"vitest": "^3.0.0"
|
|
81
|
+
},
|
|
82
|
+
"engines": {
|
|
83
|
+
"node": ">=20.6.0"
|
|
84
|
+
},
|
|
85
|
+
"keywords": [
|
|
86
|
+
"adonisjs",
|
|
87
|
+
"adonis",
|
|
88
|
+
"media",
|
|
89
|
+
"media-library",
|
|
90
|
+
"drive",
|
|
91
|
+
"storage",
|
|
92
|
+
"uploads",
|
|
93
|
+
"image",
|
|
94
|
+
"conversions",
|
|
95
|
+
"sharp",
|
|
96
|
+
"attachment",
|
|
97
|
+
"agora"
|
|
98
|
+
],
|
|
99
|
+
"scripts": {
|
|
100
|
+
"build": "tsc -p tsconfig.json && pnpm run copy:stubs",
|
|
101
|
+
"copy:stubs": "mkdir -p dist/stubs/config dist/stubs/database/migrations && cp stubs/config/media.stub dist/stubs/config/media.stub && cp -r stubs/database/migrations/. dist/stubs/database/migrations/",
|
|
102
|
+
"test": "vitest run --passWithNoTests",
|
|
103
|
+
"test:watch": "vitest",
|
|
104
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
105
|
+
}
|
|
106
|
+
}
|