mikro-orm-attachments 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [1.3.1](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.3.0...mikro-orm-attachments@1.3.1) (2026-02-24)
6
+
7
+ ## [1.3.0](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.2.0...mikro-orm-attachments@1.3.0) (2026-02-24)
8
+
9
+
10
+ ### Features
11
+
12
+ * support mikro-orm 7 ([863f610](https://github.com/reptoxx/mikro-orm-attachments/commit/863f610c874b9db72b27234f9a091139bd75f24f))
13
+
5
14
  ## [1.2.0](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.1.0...mikro-orm-attachments@1.2.0) (2026-02-22)
6
15
 
7
16
 
@@ -0,0 +1,46 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
+
5
+ ### [1.3.1](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.3.0...mikro-orm-attachments@1.3.1) (2026-02-24)
6
+
7
+ ## [1.3.0](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.2.0...mikro-orm-attachments@1.3.0) (2026-02-24)
8
+
9
+
10
+ ### Features
11
+
12
+ * support mikro-orm 7 ([863f610](https://github.com/reptoxx/mikro-orm-attachments/commit/863f610c874b9db72b27234f9a091139bd75f24f))
13
+
14
+ ## [1.2.0](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.1.0...mikro-orm-attachments@1.2.0) (2026-02-22)
15
+
16
+
17
+ ### Features
18
+
19
+ * attachment from url ([3cb835f](https://github.com/reptoxx/mikro-orm-attachments/commit/3cb835f660a98f027e0d677145a4285feae0b101))
20
+
21
+ ## [1.1.0](https://github.com/reptoxx/mikro-orm-attachments/compare/mikro-orm-attachments@1.0.0...mikro-orm-attachments@1.1.0) (2026-01-25)
22
+
23
+
24
+ ### Features
25
+
26
+ * made Attachment generic ([42413f7](https://github.com/reptoxx/mikro-orm-attachments/commit/42413f7875ba06d5753e41bcf9d47dae43d35fc2))
27
+
28
+ ## 1.0.0 (2026-01-24)
29
+
30
+
31
+ ### Features
32
+
33
+ * included workflow to publish to npm ([e044da4](https://github.com/reptoxx/mikro-orm-attachments/commit/e044da4b5534f0ea98eab85417ef7e4418f6ef18))
34
+
35
+ # Changelog
36
+
37
+ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
38
+
39
+ # Changelog
40
+
41
+ All notable changes to this project will be documented in this file.
42
+
43
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
44
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
45
+
46
+ ## [Unreleased]
package/dist/README.md ADDED
@@ -0,0 +1,258 @@
1
+ # mikro-orm-attachments
2
+
3
+ `mikro-orm-attachments` is a plugin for [MikroORM](https://mikro-orm.io/) that adds powerful, type-safe file and image attachment support to your entities. It supports variants (transforms, thumbnails, etc), blurhash, custom storage drivers (via [flydrive](https://github.com/flydrive/core)), and declarative attachment columns.
4
+
5
+ ---
6
+
7
+ ## Features
8
+
9
+ - 📂 Attach files and images to MikroORM entities
10
+ - 🖼 Supports variants (e.g., thumbnails, webp, custom transforms)
11
+ - 🤏 Generates blurhash for fast image previews
12
+ - 💾 Storage abstraction via Flydrive (local, S3, etc.)
13
+ - 🔄 Custom converters and pipeline transforms
14
+ - 🔥 TypeScript-first & type-safe
15
+
16
+ ---
17
+
18
+ ## Installation
19
+
20
+ ```sh
21
+ npm install mikro-orm-attachments flydrive
22
+ # If you want blurhash & image variants:
23
+ npm install sharp blurhash
24
+ ```
25
+
26
+ ---
27
+
28
+ ## Quick Start
29
+
30
+ ### 1. Create the Attachment-Service (Mikro-ORM Subscriber)
31
+
32
+ ```ts
33
+ import { AttachmentSubscriber } from "mikro-orm-attachments";
34
+
35
+ const attachmentSubscriber = new AttachmentSubscriber({
36
+ drivers: {
37
+ fs: new FSDriver({
38
+ location: "./uploads",
39
+ urlBuilder: {
40
+ async generateURL(key, filePath) {
41
+ return `http://localhost:3000/uploads/${key}`;
42
+ },
43
+ },
44
+ }),
45
+ },
46
+ defaultDriver: "fs",
47
+ });
48
+
49
+ export const AttachmentProperty = attachmentSubscriber.AttachmentDecorator;
50
+ ```
51
+
52
+ ### 2. Define an Entity with an Attachment
53
+
54
+ ```ts
55
+ import { Entity, PrimaryKey, Property } from "@mikro-orm/core";
56
+ import { Attachment } from "mikro-orm-attachments";
57
+ import { AttachmentProperty } from "./attachmentSubscriber";
58
+
59
+ @Entity()
60
+ export class Project {
61
+ @PrimaryKey()
62
+ id!: number;
63
+
64
+ @Property()
65
+ name!: string;
66
+
67
+ @AttachmentProperty()
68
+ avatar!: Attachment;
69
+ }
70
+ ```
71
+
72
+ ### 3. Use the subscriber in your MikroORM Config
73
+
74
+ In your MikroORM config:
75
+
76
+ ```ts
77
+ import { MikroORM } from "@mikro-orm/core";
78
+ import { attachmentSubscriber } from "./attachmentSubscriber";
79
+
80
+ const orm = await MikroORM.init({
81
+ // ... your config,
82
+ subscribers: [attachmentSubscriber],
83
+ });
84
+ ```
85
+
86
+ ---
87
+
88
+ ## Usage
89
+
90
+ ### Attaching a File
91
+
92
+ You can set entity attachments by assigning a File-like object:
93
+
94
+ ```ts
95
+ import { Attachment } from "mikro-orm-attachments";
96
+
97
+ const project = orm.em.create(Project, {
98
+ name: "My App",
99
+ avatar: Attachment.fromFile(fileStream),
100
+ });
101
+ await orm.em.persist(project).flush(); // flush before using. Image gets uploaded and resized in this step.
102
+
103
+ // avatar column will be persisted: includes URL, size, variants, etc.
104
+ ```
105
+
106
+ ### Accessing Attachment Metadata
107
+
108
+ ```ts
109
+ console.log(project.avatar.url()); // download URL (from urlBuilder)
110
+ console.log(project.avatar.getStream()); // File-Stream
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Advanced Features
116
+
117
+ ### Variants
118
+
119
+ Variants allow you to automatically create different versions of an attachment (thumbnails, webp, etc):
120
+
121
+ **Example:**
122
+
123
+ ```ts
124
+ @AttachmentProperty({
125
+ driver: "fs",
126
+ variants: {
127
+ thumbnail: {
128
+ format: "jpeg",
129
+ resize: { width: 64, height: 64 }
130
+ },
131
+ webp: {
132
+ format: "webp",
133
+ options: { quality: 70 }
134
+ }
135
+ }
136
+ })
137
+ avatar!: Attachment<"thumbnail" | "webp">;
138
+ ```
139
+
140
+ The plugin will generate and persist all declared variants.
141
+ Adding the variant names to the Attachment Generic Type gives you and your team better DX by adding the variants to all Attachment functions
142
+ ```ts
143
+ console.log(project.avatar.url("thumbnail"))
144
+ // ^ -- typed, when added manually
145
+ ```
146
+
147
+ You can also define global variants, that can be reused inside a single entity.
148
+
149
+ ```ts
150
+ export const attachmentSubscriber = new AttachmentSubscriber({
151
+ // ... your config
152
+ variants: {
153
+ thumbnail: {
154
+ resize: {
155
+ height: 100,
156
+ },
157
+ format: {
158
+ format: "webp",
159
+ options: {
160
+ quality: 80,
161
+ },
162
+ },
163
+ },
164
+ },
165
+ });
166
+ ```
167
+
168
+ To now use this predefined variant, you'll have to add this to your entities config.
169
+
170
+ ```ts
171
+ @AttachmentProperty({
172
+ variants: ["thumbnail"]
173
+ })
174
+ avatar!: Attachment<"thumbnail">;
175
+ ```
176
+
177
+ This will automatically apply the global defined rules to this field.
178
+
179
+ ### Blurhash
180
+
181
+ Fast low-quality image previews are automatically enabled. Read more at [Blurhash](https://blurha.sh).
182
+ You can also disable it for your fields.
183
+
184
+ ```ts
185
+ @AttachmentProperty({
186
+ blurhash: false, // or set BlurhashOptions
187
+ })
188
+ avatar!: Attachment;
189
+ ```
190
+
191
+ Resulting attachments will include a `.blurhash()` function, that returns the corresponding blurhash string.
192
+
193
+ ---
194
+
195
+ ## API Reference
196
+
197
+ ### `AttachmentProperty(options)`
198
+
199
+ Decorator for MikroORM entity properties.
200
+
201
+ **Options:**
202
+
203
+ - `driver`: Optionally select which configured storage to use (`"fs"`, `"s3"`, etc.)
204
+ - `folder`: Folder/name prefix for storage
205
+ - `blurhash`: Enable/disable or configure [Blurhash](https://blurha.sh)
206
+ - `variants`: Object or array of variant specs (resize, format, etc.)
207
+
208
+ ### Attachment Object
209
+
210
+ Stored in the DB as JSON:
211
+
212
+ ```ts
213
+ {
214
+ name: string;
215
+ extname: string;
216
+ size: number;
217
+ drive: string;
218
+ mimeType: string;
219
+ path: string;
220
+ url: string;
221
+ originalName: string;
222
+ blurhash?: string;
223
+ variants: Attachment[];
224
+ }
225
+ ```
226
+
227
+ ---
228
+
229
+ ## Migration
230
+
231
+ When adding a new attachment column:
232
+
233
+ 1. Add the property using `@AttachmentProperty`.
234
+ 2. Add a JSON or JSONB column to your DB schema.
235
+
236
+ ---
237
+
238
+ ## FAQ
239
+
240
+ **Q: How do I upload files in HTTP requests?**
241
+
242
+ A: Accept file uploads in your framework, parse as a buffer; pass to your entity's attachment property before persist.
243
+
244
+ **Q: Can I use S3?**
245
+
246
+ A: Yes! Configure an S3 driver in `drivers` with flydrive.
247
+
248
+ **Q: Is it type-safe?**
249
+
250
+ A: Yes! Variants are type-safe and can be passed through by typing the generic `Attachment` Type to provide better DX.
251
+
252
+ ---
253
+
254
+ ## Credits
255
+
256
+ Created by [@ReptoxX](https://github.com/reptoxx) and contributors.
257
+
258
+ ---
package/dist/index.d.ts CHANGED
@@ -1,4 +1,222 @@
1
- export { AttachmentSubscriber } from "./subscribers/AttachmentSubscriber";
2
- export { Attachment } from "./Attachment";
3
- export type { AttachmentPropertyOptions, AttachmentOptions } from "./typings";
4
- //# sourceMappingURL=index.d.ts.map
1
+ import { PropertyOptions } from "@mikro-orm/core";
2
+ import { DriverContract } from "flydrive/types";
3
+ interface Converter {
4
+ supports(input: ConvertInput, options: ConverterOptions): Promise<boolean>;
5
+ handle(input: ConvertInput, options: ConverterOptions): Promise<ConvertOutput>;
6
+ }
7
+ type BlurhashOptions = {
8
+ enabled: boolean;
9
+ componentX: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
10
+ componentY: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
11
+ };
12
+ interface ConvertInput {
13
+ buffer: Buffer;
14
+ size: number;
15
+ mimeType: string;
16
+ variantName: string;
17
+ variant: VariantSpec;
18
+ extname: string;
19
+ }
20
+ interface ConvertOutput {
21
+ buffer: Buffer;
22
+ mimeType: string;
23
+ extname: string;
24
+ }
25
+ type jpeg = {
26
+ format: "jpeg";
27
+ options?: {
28
+ quality?: number;
29
+ progressive?: boolean;
30
+ chromaSubsampling?: string;
31
+ optimiseCoding?: boolean;
32
+ optimizeCoding?: boolean;
33
+ mozjpeg?: boolean;
34
+ trellisQuantisation?: boolean;
35
+ overshootDeringing?: boolean;
36
+ optimiseScans?: boolean;
37
+ optimizeScans?: boolean;
38
+ quantisationTable?: number;
39
+ quantizationTable?: number;
40
+ force?: boolean;
41
+ };
42
+ };
43
+ type png = {
44
+ format: "png";
45
+ options?: {
46
+ quality?: number;
47
+ progressive?: boolean;
48
+ compressionLevel?: number;
49
+ adaptiveFiltering?: boolean;
50
+ palette?: boolean;
51
+ effort?: number;
52
+ colours?: number;
53
+ colors?: number;
54
+ dither?: number;
55
+ force?: boolean;
56
+ };
57
+ };
58
+ type gif = {
59
+ format: "gif";
60
+ options?: {
61
+ reuse?: boolean;
62
+ progressive?: boolean;
63
+ colours?: number;
64
+ colors?: number;
65
+ effort?: number;
66
+ dither?: number;
67
+ interFrameMaxError?: number;
68
+ interPaletteMaxError?: number;
69
+ loop?: number;
70
+ delay?: number | number[];
71
+ force?: boolean;
72
+ };
73
+ };
74
+ type webp = {
75
+ format: "webp";
76
+ options?: {
77
+ quality?: number;
78
+ alphaQuality?: number;
79
+ lossless?: boolean;
80
+ nearLossless?: boolean;
81
+ smartSubsample?: boolean;
82
+ preset?: string;
83
+ effort?: number;
84
+ loop?: number;
85
+ delay?: number | number[];
86
+ minSize?: boolean;
87
+ mixed?: boolean;
88
+ force?: boolean;
89
+ };
90
+ };
91
+ type avif = {
92
+ format: "avif";
93
+ options?: {
94
+ quality?: number;
95
+ lossless?: boolean;
96
+ effort?: number;
97
+ chromaSubsampling?: string;
98
+ bitdepth?: number;
99
+ };
100
+ };
101
+ type heif = {
102
+ format: "heif";
103
+ options?: {
104
+ compression?: string;
105
+ quality?: number;
106
+ lossless?: boolean;
107
+ effort?: number;
108
+ chromaSubsampling?: string;
109
+ bitdepth?: number;
110
+ };
111
+ };
112
+ type ConverterOptions = {
113
+ resize?: number | {
114
+ width?: number;
115
+ height?: number;
116
+ fit?: "contain" | "cover" | "fill" | "inside" | "outside";
117
+ position?: string;
118
+ background?: string | {
119
+ r: number;
120
+ g: number;
121
+ b: number;
122
+ alpha: number;
123
+ };
124
+ kernel?: string;
125
+ withoutEnlargement?: boolean;
126
+ withoutReduction?: boolean;
127
+ fastShrinkOnLoad?: boolean;
128
+ };
129
+ format?: "jpeg" | "jpg" | "png" | "gif" | "webp" | "avif" | "heif" | "tiff" | "raw" | jpeg | png | gif | webp | avif | heif;
130
+ autoOrient?: boolean;
131
+ blurhash?: boolean | BlurhashOptions;
132
+ startTime?: number;
133
+ startPage?: number;
134
+ };
135
+ type StringKeyOf<T> = Extract<keyof T, string>;
136
+ type DriversOf<S> = S extends AttachmentSubscriber<infer TDrivers, any> ? TDrivers : never;
137
+ type VariantsOf<S> = S extends AttachmentSubscriber<any, infer TVariants> ? TVariants : never;
138
+ type VariantSelection<TVariants extends Record<string, VariantSpec>> = ReadonlyArray<StringKeyOf<TVariants> | Record<string, VariantSpec>> | Partial<TVariants> | Record<string, VariantSpec>;
139
+ interface AttachmentPropertyOptions<
140
+ TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,
141
+ TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>
142
+ > {
143
+ folder?: string;
144
+ blurhash?: boolean | BlurhashOptions;
145
+ variants?: VariantSelection<TVariants>;
146
+ driver?: StringKeyOf<TDrivers>;
147
+ }
148
+ type AttachmentPropertyOptionsFor<S extends AttachmentSubscriber<any, any>> = AttachmentPropertyOptions<DriversOf<S>, VariantsOf<S>>;
149
+ interface AttachmentOptions<
150
+ TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,
151
+ TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>
152
+ > {
153
+ readonly drivers: TDrivers;
154
+ readonly defaultDriver: StringKeyOf<TDrivers>;
155
+ readonly rename?: boolean | ((file: File, columnName: string, entity: any) => string);
156
+ readonly converters?: Converter[];
157
+ readonly variants?: TVariants;
158
+ }
159
+ declare const ALLOWED_PROPERTY_OPTIONS: readonly ["accessor", "comment", "customOrder", "getter", "getterName", "hidden", "index", "lazy", "name", "nullable", "serializedName", "serializedPrimaryKey", "serializer", "version"];
160
+ type AllowedPropertyOptions = (typeof ALLOWED_PROPERTY_OPTIONS)[number];
161
+ interface AttachmentDecoratorProps<S extends AttachmentSubscriber<any, any>> extends AttachmentPropertyOptionsFor<S>, Pick<PropertyOptions<object>, AllowedPropertyOptions> {}
162
+ interface AttachmentBase {
163
+ drive: string;
164
+ name: string;
165
+ extname: string;
166
+ size: number;
167
+ mimeType: string;
168
+ path: string;
169
+ originalName: string;
170
+ variants: Omit<AttachmentBase, "variants" | "originalName" | "drive">[];
171
+ }
172
+ interface VariantSpec extends ConverterOptions {}
173
+ import { DriverContract as DriverContract2 } from "flydrive/types";
174
+ interface EventSubscriber {
175
+ getSubscribedEvents(): string[];
176
+ onLoad(args: any): Promise<void>;
177
+ beforeFlush(args: any): Promise<void>;
178
+ }
179
+ declare class AttachmentSubscriber<
180
+ const TDrivers extends Record<string, DriverContract2>,
181
+ const TVariants extends Record<string, VariantSpec>
182
+ > implements EventSubscriber {
183
+ private;
184
+ private readonly options;
185
+ private readonly disks;
186
+ constructor(options: AttachmentOptions<TDrivers, TVariants>);
187
+ getSubscribedEvents(): string[];
188
+ onLoad(args: any): Promise<void>;
189
+ beforeFlush(args: any): Promise<void>;
190
+ AttachmentDecorator(options?: AttachmentDecoratorProps<AttachmentSubscriber<TDrivers, TVariants>>): (target: any, propertyKey: string) => void;
191
+ }
192
+ import { Disk } from "flydrive";
193
+ import { SignedURLOptions } from "flydrive/types";
194
+ import { Readable as Readable_d9sohc } from "node:stream";
195
+ declare class Attachment<Variants extends string = string> {
196
+ private;
197
+ private data?;
198
+ constructor(data: File | AttachmentBase);
199
+ static fromFile(file: File): Attachment;
200
+ /**
201
+ * Downloads a file from a URL and returns an Attachment object.
202
+ *
203
+ * @param url - The URL of the file to download.
204
+ * @returns The Attachment object.
205
+ * @throws An error if the file cannot be downloaded.
206
+ */
207
+ static fromUrl(url: string): Promise<Attachment>;
208
+ url(variant?: string): string | Promise<string>;
209
+ preSignedUrl(variantNameOrOptions?: string | SignedURLOptions, signedUrlOptions?: SignedURLOptions): Promise<string>;
210
+ blurhash(): string | undefined;
211
+ getDisk(): Disk;
212
+ getDrive(): string;
213
+ getBytes(variantName?: Variants): Promise<Uint8Array<ArrayBufferLike>>;
214
+ getBuffer(variantName?: Variants): Promise<Buffer<ArrayBuffer>>;
215
+ getStream(variantName?: Variants): Promise<Readable_d9sohc>;
216
+ getMimeType(variantName?: Variants): string;
217
+ toJSON(): {
218
+ url: string | Promise<string>;
219
+ blurhash: string | undefined;
220
+ };
221
+ }
222
+ export { AttachmentSubscriber, AttachmentPropertyOptions, AttachmentOptions, Attachment };
package/dist/index.js CHANGED
@@ -1,4 +1 @@
1
- import{Disk as R}from"flydrive";var l=Symbol("attachment:loaded"),Y=Symbol("attachment:options"),c=Symbol("attachment:file"),a=Symbol("attachment:disk"),y=Symbol("attachment:fn:process"),u=Symbol("attachment:fn:load"),w=Symbol("attachment:fn:save");class h{[l]=!1;[c];[a];data;constructor(e){if(e instanceof File)this[c]=e;else this[l]=!0,this.data=e}#e(){if(!this[l])throw Error("Attachment is not processed, please flush the entity first.")}get#t(){return this.#e(),this[a]}[w](){return this.data??{}}static[u](e){return new h(e)}[y](e){if(this[l])return;this.data=e,this[l]=!0}static fromFile(e){return new h(e)}static async fromUrl(e){let t=await fetch(e),i=await t.arrayBuffer(),o=new File([i],e.split("/").pop(),{type:t.headers.get("content-type")??""});return new h(o)}#i(e){this.#e();let t=this.data?.variants.find((i)=>i.name===e)??null;if(!t)throw Error(`Attachment: Variant '${e}' not found`);return t}url(e){if(this.#e(),e)return this.#t.getUrl(this.#i(e).path);return this.data?.url}preSignedUrl(e,t){if(this.#e(),typeof e==="string")return this.#t.getSignedUrl(this.#i(e).path,t);return this.#t.getSignedUrl(this.data?.path??"",t)}blurhash(){return this.#e(),this.data?.blurhash}getDisk(){return this.#t}getDrive(){return this.data?.drive??""}async getBytes(e){this.#e();let t=e?this.#i(e).path:this.data?.path??"";return this.#t.getBytes(t)}async getBuffer(e){return this.#e(),Buffer.from(await this.getBytes(e))}async getStream(e){this.#e();let t=e?this.#i(e).path:this.data?.path??"";return this.#t.getStream(t)}getMimeType(e){return this.#e(),(e?this.#i(e):this.data)?.mimeType??""}toJSON(){return{url:this.url(),blurhash:this.blurhash()}}}import{join as P}from"path";import{v7 as V}from"uuid";import{fileTypeFromBuffer as J}from"file-type";import{encode as $}from"blurhash";async function d(e){try{let t=await import(e);if(t.default)return t.default;return t}catch(t){throw Error(`Module ${e} not found, please install it first.`)}}function C(e,t){let{componentX:i,componentY:o}=t??{enabled:!0,componentX:4,componentY:4};return new Promise(async(r,n)=>{try{let s=await d("sharp"),{data:f,info:m}=await s(e).raw().ensureAlpha().toBuffer({resolveWithObject:!0}),p=$(new Uint8ClampedArray(f),m.width,m.height,i,o);return r(p)}catch(s){return n(s)}})}class F{att;file;disk;buffer;modelOptions;config;entity;columnName;diskName;fileInfo;constructor(e,t){this.att=e;let{disk:i,options:o,config:r,entity:n,columnName:s,diskName:f}=t;if(this.disk=i,this.modelOptions=o,this.config=r,this.entity=n,this.columnName=s,this.diskName=f,e[l])throw Error("Attachment already processed, please use the Attachment.fromFile method to create a new attachment");this.file=this.att[c]}done(e){this.att[y](e)}generateKey(e,...t){let i=this.modelOptions.folder??"";return i=i.replace(/:([A-Za-z0-9_]+)/g,(o,r)=>{let n=this.entity[r];if(n===void 0||n===null)throw Error(`Missing value for Attachment path "${r}" in entity ${this.entity.constructor.name}. Please ensure that the referenced property is computed before the attachment is processed. (Auto incrementing fields are not supported.)`);return this.normalizeFileName(String(n))}),P(i,e,...t)}normalizeFileName(e){return encodeURIComponent(e.replace(/[^a-zA-Z0-9.-]/g,"_")).toLowerCase()}async fileToBuffer(){if(this.buffer)return this.buffer;let e=await this.file.arrayBuffer(),t=Buffer.from(e);return this.buffer=t,t}getFileName(){if(!this.config.rename)return this.normalizeFileName(this.file.name);if(typeof this.config.rename==="function")return this.normalizeFileName(this.config.rename(this.file,this.columnName,this.entity));return this.normalizeFileName(V())}async getFileType(){return J(await this.fileToBuffer())}async analyseFile(){let e=await this.getFileType();this.fileInfo={extname:e?.ext??this.file.name.split(".").pop()??"",mimeType:e?.mime??this.file.type,size:this.file.size}}async uploadFile(e,t){await this.disk.put(e,t)}async pickConverter(e,t){if(!this.fileInfo)throw Error("Attachment Converter: File info not found");for(let i of this.config.converters??[])if(await i.supports({size:this.fileInfo.size,mimeType:this.fileInfo.mimeType,variantName:e,variant:t,buffer:await this.fileToBuffer(),extname:this.fileInfo.extname},this.modelOptions))return i;return null}async process(){await this.analyseFile();let e=await this.fileToBuffer(),t=this.getFileName(),i=this.fileInfo?.extname??"",o=this.generateKey(t,`${t}.${i}`);await this.uploadFile(o,e);let r={name:t,extname:i,size:this.file.size,drive:this.diskName,mimeType:this.file.type,path:o,url:await this.disk.getUrl(o),originalName:this.file.name,variants:[]};if(this.modelOptions.variants)for(let[n,s]of Object.entries(this.modelOptions.variants)){let f=await this.pickConverter(n,s);if(f){let m=await f.handle({buffer:e,size:this.fileInfo?.size??0,mimeType:this.fileInfo?.mimeType??"",extname:this.fileInfo?.extname??"",variantName:n,variant:s},this.modelOptions.variants[n]),p=this.generateKey(o.split("/").pop().split(".").shift(),`${n}.${m.extname}`);await this.uploadFile(p,m.buffer),r.variants.push({name:n,extname:m.extname,size:m.buffer.length,mimeType:m.mimeType,path:p})}}if(this.fileInfo?.mimeType.startsWith("image/")){if(typeof this.modelOptions.blurhash==="boolean"?this.modelOptions.blurhash:this.modelOptions.blurhash?.enabled)r.blurhash=await C(e,typeof this.modelOptions.blurhash==="object"?this.modelOptions.blurhash:void 0)}this.done(r)}}import{Property as Z}from"@mikro-orm/core";import{Type as W}from"@mikro-orm/core";class g extends W{options={folder:"attachments",blurhash:!0};constructor(e){super();this.options={...this.options,...e}}convertToDatabaseValue(e){return e[w]()}convertToJSValue(e){try{return h[u](JSON.parse(e))}catch(t){try{return h[u](e)}catch(i){throw Error("Invalid attachment data")}}}getColumnType(){return"json"}}import{fileTypeFromBuffer as X}from"file-type";class B{async supports(e,t){return e.mimeType.startsWith("image/")}async handle(e,t){let i=await d("sharp"),o=t?.resize||{},r=t?.format||"webp",n=t?.autoOrient||!0,s={};if(typeof r!=="string")s=r?.options,r=r.format;let f=i(e.buffer).withMetadata();if(n)f.autoOrient();let m=await f.resize(o).toFormat(r,s).toBuffer(),p=await X(m);return{buffer:m,mimeType:p?.mime??e.mimeType,extname:p?.ext??e.extname}}}var I={blurhash:!0},T={rename:!0,converters:[new B]},b=["accessor","comment","customOrder","getter","getterName","hidden","index","lazy","name","nullable","serializedName","serializedPrimaryKey","serializer","version"];var x=Symbol("attachment:props");function q(e={}){return(t,i)=>{let{mikro:o,attachment:r}=Q(e,b);r={...I,...r};let n=t.constructor;if(!n[x])n[x]={};return n[x][i]=r,Z({...o,type:new g(r)})(t,i)}}function O(e){return q(e)}function z(e){let i=e.constructor[x];return i?i:{}}function Q(e,t){let i=new Set(t),o={},r={};for(let n in e)if(i.has(n))o[n]=e[n];else r[n]=e[n];return{mikro:o,attachment:r}}class S{options;disks;constructor(e){this.options=e;this.options={...T,...this.options},this.disks=new Map(Object.entries(this.options.drivers).map(([t,i])=>[t,new R(i)]))}getSubscribedEvents(){return["onLoad","beforeFlush"]}async onLoad(e){let t=e.entity,i=z(t);for(let o of Object.keys(i)){let r=t[o],n=i[o];if(r instanceof h){let s=this.#e(n,r.getDrive());r[a]=s}}}#e(e,t){let i=this.disks.get(t??e.driver??this.options.defaultDriver);if(t&&!i)i=this.disks.get(e.driver??this.options.defaultDriver);if(!i)throw Error(`Unknown attachment driver "${String(t??e.driver??this.options.defaultDriver)}"`);return i}async beforeFlush(e){let t=e.uow,i=new Set([...t.getChangeSets().map((o)=>o.entity),...t.getPersistStack()]);for(let o of i)await this.#t(o)}async#t(e){let t=z(e);for(let i of Object.keys(t)){let o=e[i],r=t[i];if(o instanceof h){if(o[l])continue;let n=this.#e(r);o[a]=n;let s=this.#i(r.variants),f=new F(o,{disk:n,options:{...r,variants:s},config:this.options,entity:e,columnName:i,diskName:r.driver??this.options.defaultDriver});try{await f.process()}catch(m){throw console.error(m),Error("Failed to process attachment")}}}}AttachmentDecorator(e){return O(e)}#i(e){if(!e)return;if(Array.isArray(e)){let t={};for(let i of e)if(typeof i==="string"){let o=this.options.variants?.[i];if(!o)throw Error(`Unknown attachment variant "${i}"`);t[i]=o}else if(i&&typeof i==="object")Object.assign(t,i);return t}if(e&&typeof e==="object")return e;return}}export{S as AttachmentSubscriber,h as Attachment};
2
-
3
- //# debugId=D6CAA0FA0CC1E84D64756E2164756E21
4
- //# sourceMappingURL=index.js.map
1
+ import{Disk as j}from"flydrive";var l=Symbol("attachment:loaded"),G=Symbol("attachment:options"),c=Symbol("attachment:file"),a=Symbol("attachment:disk"),y=Symbol("attachment:fn:process"),u=Symbol("attachment:fn:load"),w=Symbol("attachment:fn:save");class h{[l]=!1;[c];[a];data;constructor(e){if(e instanceof File)this[c]=e;else this[l]=!0,this.data=e}#e(){if(!this[l])throw Error("Attachment is not processed, please flush the entity first.")}get#t(){return this.#e(),this[a]}[w](){return this.data??{}}static[u](e){return new h(e)}[y](e){if(this[l])return;this.data=e,this[l]=!0}static fromFile(e){return new h(e)}static async fromUrl(e){let t=await fetch(e),r=await t.arrayBuffer(),o=new File([r],e.split("/").pop(),{type:t.headers.get("content-type")??""});return new h(o)}#r(e){this.#e();let t=this.data?.variants.find((r)=>r.name===e)??null;if(!t)throw Error(`Attachment: Variant '${e}' not found`);return t}url(e){if(this.#e(),e)return this.#t.getUrl(this.#r(e).path);return this.data?.url}preSignedUrl(e,t){if(this.#e(),typeof e==="string")return this.#t.getSignedUrl(this.#r(e).path,t);return this.#t.getSignedUrl(this.data?.path??"",t)}blurhash(){return this.#e(),this.data?.blurhash}getDisk(){return this.#t}getDrive(){return this.data?.drive??""}async getBytes(e){this.#e();let t=e?this.#r(e).path:this.data?.path??"";return this.#t.getBytes(t)}async getBuffer(e){return this.#e(),Buffer.from(await this.getBytes(e))}async getStream(e){this.#e();let t=e?this.#r(e).path:this.data?.path??"";return this.#t.getStream(t)}getMimeType(e){return this.#e(),(e?this.#r(e):this.data)?.mimeType??""}toJSON(){return{url:this.url(),blurhash:this.blurhash()}}}import{join as J}from"path";import{v7 as W}from"uuid";import{fileTypeFromBuffer as X}from"file-type";import{createRequire as P}from"module";import{encode as q}from"blurhash";var V=P(import.meta.url);async function d(e){try{let t=await import(e);if(t.default)return t.default;return t}catch(t){throw Error(`Module ${e} not found, please install it first.`)}}function C(e){for(let t of e)try{return V(t)}catch{continue}throw Error(`Could not resolve any of the following modules: ${e.join(", ")}`)}function T(e,t){let{componentX:r,componentY:o}=t??{enabled:!0,componentX:4,componentY:4};return new Promise(async(i,n)=>{try{let s=await d("sharp"),{data:f,info:m}=await s(e).raw().ensureAlpha().toBuffer({resolveWithObject:!0}),p=q(new Uint8ClampedArray(f),m.width,m.height,r,o);return i(p)}catch(s){return n(s)}})}class g{att;file;disk;buffer;modelOptions;config;entity;columnName;diskName;fileInfo;constructor(e,t){this.att=e;let{disk:r,options:o,config:i,entity:n,columnName:s,diskName:f}=t;if(this.disk=r,this.modelOptions=o,this.config=i,this.entity=n,this.columnName=s,this.diskName=f,e[l])throw Error("Attachment already processed, please use the Attachment.fromFile method to create a new attachment");this.file=this.att[c]}done(e){this.att[y](e)}generateKey(e,...t){let r=this.modelOptions.folder??"";return r=r.replace(/:([A-Za-z0-9_]+)/g,(o,i)=>{let n=this.entity[i];if(n===void 0||n===null)throw Error(`Missing value for Attachment path "${i}" in entity ${this.entity.constructor.name}. Please ensure that the referenced property is computed before the attachment is processed. (Auto incrementing fields are not supported.)`);return this.normalizeFileName(String(n))}),J(r,e,...t)}normalizeFileName(e){return encodeURIComponent(e.replace(/[^a-zA-Z0-9.-]/g,"_")).toLowerCase()}async fileToBuffer(){if(this.buffer)return this.buffer;let e=await this.file.arrayBuffer(),t=Buffer.from(e);return this.buffer=t,t}getFileName(){if(!this.config.rename)return this.normalizeFileName(this.file.name);if(typeof this.config.rename==="function")return this.normalizeFileName(this.config.rename(this.file,this.columnName,this.entity));return this.normalizeFileName(W())}async getFileType(){return X(await this.fileToBuffer())}async analyseFile(){let e=await this.getFileType();this.fileInfo={extname:e?.ext??this.file.name.split(".").pop()??"",mimeType:e?.mime??this.file.type,size:this.file.size}}async uploadFile(e,t){await this.disk.put(e,t)}async pickConverter(e,t){if(!this.fileInfo)throw Error("Attachment Converter: File info not found");for(let r of this.config.converters??[])if(await r.supports({size:this.fileInfo.size,mimeType:this.fileInfo.mimeType,variantName:e,variant:t,buffer:await this.fileToBuffer(),extname:this.fileInfo.extname},this.modelOptions))return r;return null}async process(){await this.analyseFile();let e=await this.fileToBuffer(),t=this.getFileName(),r=this.fileInfo?.extname??"",o=this.generateKey(t,`${t}.${r}`);await this.uploadFile(o,e);let i={name:t,extname:r,size:this.file.size,drive:this.diskName,mimeType:this.file.type,path:o,url:await this.disk.getUrl(o),originalName:this.file.name,variants:[]};if(this.modelOptions.variants)for(let[n,s]of Object.entries(this.modelOptions.variants)){let f=await this.pickConverter(n,s);if(f){let m=await f.handle({buffer:e,size:this.fileInfo?.size??0,mimeType:this.fileInfo?.mimeType??"",extname:this.fileInfo?.extname??"",variantName:n,variant:s},this.modelOptions.variants[n]),p=this.generateKey(o.split("/").pop().split(".").shift(),`${n}.${m.extname}`);await this.uploadFile(p,m.buffer),i.variants.push({name:n,extname:m.extname,size:m.buffer.length,mimeType:m.mimeType,path:p})}}if(this.fileInfo?.mimeType.startsWith("image/")){if(typeof this.modelOptions.blurhash==="boolean"?this.modelOptions.blurhash:this.modelOptions.blurhash?.enabled)i.blurhash=await T(e,typeof this.modelOptions.blurhash==="object"?this.modelOptions.blurhash:void 0)}this.done(i)}}import{Type as Z}from"@mikro-orm/core";class F extends Z{options={folder:"attachments",blurhash:!0};constructor(e){super();this.options={...this.options,...e}}convertToDatabaseValue(e){return e[w]()}convertToJSValue(e){try{return h[u](JSON.parse(e))}catch(t){try{return h[u](e)}catch(r){throw Error("Invalid attachment data")}}}getColumnType(){return"json"}}import{fileTypeFromBuffer as R}from"file-type";class B{async supports(e,t){return e.mimeType.startsWith("image/")}async handle(e,t){let r=await d("sharp"),o=t?.resize||{},i=t?.format||"webp",n=t?.autoOrient||!0,s={};if(typeof i!=="string")s=i?.options,i=i.format;let f=r(e.buffer).withMetadata();if(n)f.autoOrient();let m=await f.resize(o).toFormat(i,s).toBuffer(),p=await R(m);return{buffer:m,mimeType:p?.mime??e.mimeType,extname:p?.ext??e.extname}}}var I={blurhash:!0},b={rename:!0,converters:[new B]},O=["accessor","comment","customOrder","getter","getterName","hidden","index","lazy","name","nullable","serializedName","serializedPrimaryKey","serializer","version"];var{Property:Q}=C(["@mikro-orm/decorators/legacy","@mikro-orm/core"]),x=Symbol("attachment:props");function Y(e={}){return(t,r)=>{let{mikro:o,attachment:i}=M(e,O);i={...I,...i};let n=t.constructor;if(!n[x])n[x]={};return n[x][r]=i,Q({...o,type:new F(i)})(t,r)}}function S(e){return Y(e)}function z(e){let r=e.constructor[x];return r?r:{}}function M(e,t){let r=new Set(t),o={},i={};for(let n in e)if(r.has(n))o[n]=e[n];else i[n]=e[n];return{mikro:o,attachment:i}}class ${options;disks;constructor(e){this.options=e;this.options={...b,...this.options},this.disks=new Map(Object.entries(this.options.drivers).map(([t,r])=>[t,new j(r)]))}getSubscribedEvents(){return["onLoad","beforeFlush"]}async onLoad(e){let{entity:t}=e,r=z(t);for(let o of Object.keys(r)){let i=t[o],n=r[o];if(i instanceof h){let s=this.#e(n,i.getDrive());i[a]=s}}}#e(e,t){let r=this.disks.get(t??e.driver??this.options.defaultDriver);if(t&&!r)r=this.disks.get(e.driver??this.options.defaultDriver);if(!r)throw Error(`Unknown attachment driver "${String(t??e.driver??this.options.defaultDriver)}"`);return r}async beforeFlush(e){let{uow:t}=e,r=new Set([...t.getChangeSets().map((o)=>o.entity),...t.getPersistStack()]);for(let o of r)await this.#t(o)}async#t(e){let t=z(e);for(let r of Object.keys(t)){let o=e[r],i=t[r];if(o instanceof h){if(o[l])continue;let n=this.#e(i);o[a]=n;let s=this.#r(i.variants),f=new g(o,{disk:n,options:{...i,variants:s},config:this.options,entity:e,columnName:r,diskName:i.driver??this.options.defaultDriver});try{await f.process()}catch(m){throw console.error(m),Error("Failed to process attachment")}}}}AttachmentDecorator(e){return S(e)}#r(e){if(!e)return;if(Array.isArray(e)){let t={};for(let r of e)if(typeof r==="string"){let o=this.options.variants?.[r];if(!o)throw Error(`Unknown attachment variant "${r}"`);t[r]=o}else if(r&&typeof r==="object")Object.assign(t,r);return t}if(e&&typeof e==="object")return e;return}}export{$ as AttachmentSubscriber,h as Attachment};
package/package.json CHANGED
@@ -1,24 +1,27 @@
1
1
  {
2
2
  "name": "mikro-orm-attachments",
3
- "version": "1.2.0",
4
3
  "description": "Attachment handling for MikroORM with support for image processing, variants, and multiple storage drivers",
4
+ "version": "1.3.1",
5
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
- "default": "./dist/index.js"
13
- }
14
- },
15
6
  "files": [
16
7
  "dist",
17
8
  "README.md",
18
9
  "CHANGELOG.md"
19
10
  ],
11
+ "module": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
20
22
  "scripts": {
21
- "build": "bun run build.ts",
23
+ "build": "bunup",
24
+ "dev": "bunup --watch",
22
25
  "prepublishOnly": "bun run build",
23
26
  "version:patch": "standard-version --release-as patch",
24
27
  "version:minor": "standard-version --release-as minor",
@@ -38,17 +41,22 @@
38
41
  "type": "git",
39
42
  "url": "https://github.com/reptoxx/mikro-orm-attachments"
40
43
  },
44
+ "optionalDependencies": {
45
+ "@mikro-orm/decorators": "^7.0.0 || ^7.0.0-rc.1 || ^7.0.0-rc.2"
46
+ },
41
47
  "peerDependencies": {
42
- "@mikro-orm/core": "^6.6.3",
48
+ "@mikro-orm/core": "^6.6.3 || ^7.0.0 || ^7.0.0-rc.1 || ^7.0.0-rc.2",
43
49
  "sharp": "^0.34.5",
44
50
  "blurhash": "^2.0.5",
45
51
  "flydrive": "^1.3.0"
46
52
  },
47
53
  "devDependencies": {
48
- "bun-types": "latest",
49
54
  "@mikro-orm/core": "^6.6.3",
50
- "typescript": "^5.0.0",
51
- "standard-version": "^9.5.0"
55
+ "@typescript/native-preview": "^7.0.0-dev.20260224.1",
56
+ "bun-types": "latest",
57
+ "bunup": "^0.16.29",
58
+ "standard-version": "^9.5.0",
59
+ "typescript": "^5.0.0"
52
60
  },
53
61
  "dependencies": {
54
62
  "file-type": "^21.3.0",
@@ -1,38 +0,0 @@
1
- import { Disk } from "flydrive";
2
- import { ATTACHMENT_DISK, ATTACHMENT_FILE, ATTACHMENT_FN_LOAD, ATTACHMENT_FN_PROCESS, ATTACHMENT_FN_SAVE, ATTACHMENT_LOADED } from "./symbols";
3
- import { AttachmentBase } from "./typings";
4
- import { SignedURLOptions } from "flydrive/types";
5
- export declare class Attachment<Variants extends string = string> {
6
- #private;
7
- [ATTACHMENT_LOADED]: boolean;
8
- [ATTACHMENT_FILE]?: File;
9
- [ATTACHMENT_DISK]?: Disk;
10
- private data?;
11
- constructor(data: File | AttachmentBase);
12
- [ATTACHMENT_FN_SAVE](): {};
13
- static [ATTACHMENT_FN_LOAD](value: AttachmentBase): Attachment;
14
- [ATTACHMENT_FN_PROCESS](data: AttachmentBase): void;
15
- static fromFile(file: File): Attachment;
16
- /**
17
- * Downloads a file from a URL and returns an Attachment object.
18
- *
19
- * @param url - The URL of the file to download.
20
- * @returns The Attachment object.
21
- * @throws An error if the file cannot be downloaded.
22
- */
23
- static fromUrl(url: string): Promise<Attachment>;
24
- url(variant?: string): string | Promise<string>;
25
- preSignedUrl(variantNameOrOptions?: string | SignedURLOptions, signedUrlOptions?: SignedURLOptions): Promise<string>;
26
- blurhash(): string | undefined;
27
- getDisk(): Disk;
28
- getDrive(): string;
29
- getBytes(variantName?: Variants): Promise<Uint8Array<ArrayBufferLike>>;
30
- getBuffer(variantName?: Variants): Promise<Buffer<ArrayBuffer>>;
31
- getStream(variantName?: Variants): Promise<import("node:stream").Readable>;
32
- getMimeType(variantName?: Variants): string;
33
- toJSON(): {
34
- url: string | Promise<string>;
35
- blurhash: string | undefined;
36
- };
37
- }
38
- //# sourceMappingURL=Attachment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../src/Attachment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EACN,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EAEjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAmB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,qBAAa,UAAU,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM;;IACvD,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAS;IACrC,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC;IACzB,CAAC,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAiB;gBAElB,IAAI,EAAE,IAAI,GAAG,cAAc;IAoBvC,CAAC,kBAAkB,CAAC;IAIpB,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU;IAK9D,CAAC,qBAAqB,CAAC,CAAC,IAAI,EAAE,cAAc;IAQ5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU;IAKvC;;;;;;OAMG;WACU,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBtD,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM;IAQpB,YAAY,CAAC,oBAAoB,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,gBAAgB;IAQlG,QAAQ;IAKR,OAAO;IAIP,QAAQ;IAIF,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ;IAM/B,SAAS,CAAC,WAAW,CAAC,EAAE,QAAQ;IAKhC,SAAS,CAAC,WAAW,CAAC,EAAE,QAAQ;IAMtC,WAAW,CAAC,WAAW,CAAC,EAAE,QAAQ;IAMlC,MAAM;;;;CAMN"}
@@ -1,11 +0,0 @@
1
- import { Type } from "@mikro-orm/core";
2
- import { Attachment } from "./Attachment";
3
- import { AttachmentPropertyOptions } from "./typings";
4
- export declare class AttachmentType extends Type<Attachment, string> {
5
- private readonly options;
6
- constructor(options: AttachmentPropertyOptions | undefined);
7
- convertToDatabaseValue(value: Attachment): any;
8
- convertToJSValue(value: any): Attachment;
9
- getColumnType(): string;
10
- }
11
- //# sourceMappingURL=DatabaseType.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatabaseType.d.ts","sourceRoot":"","sources":["../src/DatabaseType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,qBAAa,cAAe,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGtB;gBAEU,OAAO,EAAE,yBAAyB,GAAG,SAAS;IAQ1D,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG;IAI9C,gBAAgB,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU;IAYxC,aAAa,IAAI,MAAM;CAGvB"}
@@ -1,28 +0,0 @@
1
- import { Attachment } from "../Attachment";
2
- import { AttachmentConverterProps } from "../types/attachment";
3
- import { AttachmentBase, VariantSpec } from "../typings";
4
- import type { DriverContract } from "flydrive/types";
5
- export declare class AttachmentConverter<TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>, TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>> {
6
- private readonly att;
7
- private readonly file;
8
- private readonly disk;
9
- private buffer?;
10
- private readonly modelOptions;
11
- private readonly config;
12
- private readonly entity;
13
- private readonly columnName;
14
- private readonly diskName;
15
- private fileInfo?;
16
- constructor(att: Attachment, props: AttachmentConverterProps<TDrivers, TVariants>);
17
- done(data: AttachmentBase): void;
18
- generateKey(name: string, ...path: string[]): string;
19
- normalizeFileName(fileName: string): string;
20
- fileToBuffer(): Promise<Buffer<ArrayBufferLike>>;
21
- getFileName(): string;
22
- getFileType(): Promise<import("file-type").FileTypeResult | undefined>;
23
- analyseFile(): Promise<void>;
24
- uploadFile(key: string, buffer: Buffer): Promise<void>;
25
- pickConverter(variantName: string, variant: VariantSpec): Promise<import("../types/converter").Converter | null>;
26
- process(): Promise<void>;
27
- }
28
- //# sourceMappingURL=AttachmentConverter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AttachmentConverter.d.ts","sourceRoot":"","sources":["../../src/converters/AttachmentConverter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAsC,WAAW,EAAE,MAAM,YAAY,CAAC;AAO7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,qBAAa,mBAAmB,CAC/B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAChF,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IAgB/D,OAAO,CAAC,QAAQ,CAAC,GAAG;IAdhC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2D;IACxF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,CAIf;gBAE2B,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,wBAAwB,CAAC,QAAQ,EAAE,SAAS,CAAC;IAelG,IAAI,CAAC,IAAI,EAAE,cAAc;IAIzB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE;IAiB3C,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAI5B,YAAY;IAUlB,WAAW;IAWL,WAAW;IAIX,WAAW;IASX,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAItC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW;IAwBvD,OAAO;CA+Db"}
@@ -1,6 +0,0 @@
1
- import { Converter, ConverterOptions, ConvertInput, ConvertOutput, ImageConverterOptions } from "../types/converter";
2
- export declare class ImageConverter implements Converter {
3
- supports(input: ConvertInput, options: ConverterOptions): Promise<boolean>;
4
- handle(input: ConvertInput, options?: ImageConverterOptions): Promise<ConvertOutput>;
5
- }
6
- //# sourceMappingURL=ImageConverter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageConverter.d.ts","sourceRoot":"","sources":["../../src/converters/ImageConverter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAGrH,qBAAa,cAAe,YAAW,SAAS;IACzC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1E,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;CA4B1F"}
@@ -1,6 +0,0 @@
1
- import { AttachmentDecoratorProps, AttachmentPropertyOptionsFor } from "../typings";
2
- import { AttachmentSubscriber } from "../subscribers/AttachmentSubscriber";
3
- export declare function AttachmentDecorator<S extends AttachmentSubscriber<any, any>>(options?: AttachmentDecoratorProps<S>): (target: any, propertyKey: string) => any;
4
- export declare function createAttachmentDecorator<S extends AttachmentSubscriber<any, any>>(options?: AttachmentDecoratorProps<S>): (target: any, propertyKey: string) => any;
5
- export declare function getAttachmentProps<S extends AttachmentSubscriber<any, any>>(entity: object): Record<string, AttachmentPropertyOptionsFor<S>>;
6
- //# sourceMappingURL=AttachmentDecorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AttachmentDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/AttachmentDecorator.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,wBAAwB,EAAE,4BAA4B,EAAuC,MAAM,YAAY,CAAC;AACnJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAI3E,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,GAAE,wBAAwB,CAAC,CAAC,CAAM,IAC9G,QAAQ,GAAG,EAAE,aAAa,MAAM,SAcxC;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,YAhBxG,GAAG,eAAe,MAAM,SAkBxC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAI5I"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js.map DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/subscribers/AttachmentSubscriber.ts", "../src/symbols.ts", "../src/Attachment.ts", "../src/converters/AttachmentConverter.ts", "../src/utils/helpers.ts", "../src/decorators/AttachmentDecorator.ts", "../src/DatabaseType.ts", "../src/converters/ImageConverter.ts", "../src/typings.ts"],
4
- "sourcesContent": [
5
- "import { EventArgs, EventSubscriber, FlushEventArgs } from \"@mikro-orm/core\";\nimport { Disk } from \"flydrive\";\nimport { Attachment } from \"../Attachment\";\nimport { AttachmentConverter } from \"../converters/AttachmentConverter\";\nimport { createAttachmentDecorator, getAttachmentProps } from \"../decorators/AttachmentDecorator\";\nimport { ATTACHMENT_DISK, ATTACHMENT_LOADED } from \"../symbols\";\nimport { AttachmentOptions, AttachmentDecoratorProps, DEFAULT_ATTACHMENT_OPTIONS, VariantSelection, VariantSpec, AttachmentPropertyOptions } from \"../typings\";\nimport { DriverContract } from \"flydrive/types\";\n\nexport class AttachmentSubscriber<const TDrivers extends Record<string, DriverContract>, const TVariants extends Record<string, VariantSpec>>\n\timplements EventSubscriber\n{\n\tprivate readonly disks: Map<Extract<keyof TDrivers, string>, Disk>;\n\tconstructor(private readonly options: AttachmentOptions<TDrivers, TVariants>) {\n\t\tthis.options = {\n\t\t\t...DEFAULT_ATTACHMENT_OPTIONS,\n\t\t\t...this.options,\n\t\t};\n\t\tthis.disks = new Map(Object.entries(this.options.drivers).map(([key, driver]) => [key as Extract<keyof TDrivers, string>, new Disk(driver)]));\n\t}\n\n\tgetSubscribedEvents(): string[] {\n\t\treturn [\"onLoad\", \"beforeFlush\"];\n\t}\n\n\tasync onLoad(args: EventArgs<any>): Promise<void> {\n\t\tconst entity = args.entity;\n\t\tconst props = getAttachmentProps<AttachmentSubscriber<TDrivers, TVariants>>(entity);\n\t\tfor (const prop of Object.keys(props)) {\n\t\t\tconst value = entity[prop];\n\t\t\tconst config = props[prop];\n\t\t\tif (value instanceof Attachment) {\n\t\t\t\tconst disk = this.#getDisk(config, value.getDrive() as Extract<keyof TDrivers, string>);\n\t\t\t\tvalue[ATTACHMENT_DISK] = disk;\n\t\t\t}\n\t\t}\n\t}\n\n\t#getDisk(config: AttachmentPropertyOptions<TDrivers, TVariants>, dbDriver?: Extract<keyof TDrivers, string>): Disk {\n\t\tlet disk = this.disks.get(dbDriver ?? config.driver ?? this.options.defaultDriver);\n\t\tif (dbDriver && !disk) {\n\t\t\tdisk = this.disks.get(config.driver ?? this.options.defaultDriver);\n\t\t}\n\t\tif (!disk) {\n\t\t\tthrow new Error(`Unknown attachment driver \"${String(dbDriver ?? config.driver ?? this.options.defaultDriver)}\"`);\n\t\t}\n\t\treturn disk;\n\t}\n\n\tasync beforeFlush(args: FlushEventArgs): Promise<void> {\n\t\tconst uow = args.uow;\n\t\tconst entities = new Set([...uow.getChangeSets().map((cs) => cs.entity), ...uow.getPersistStack()]);\n\t\tfor (const entity of entities) {\n\t\t\tawait this.#handleEntity(entity);\n\t\t}\n\t}\n\n\tasync #handleEntity(entity: any) {\n\t\tconst props = getAttachmentProps<AttachmentSubscriber<TDrivers, TVariants>>(entity);\n\t\tfor (const prop of Object.keys(props)) {\n\t\t\tconst value = entity[prop];\n\t\t\tconst config = props[prop];\n\t\t\tif (value instanceof Attachment) {\n\t\t\t\tif (value[ATTACHMENT_LOADED]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst disk = this.#getDisk(config);\n\t\t\t\tvalue[ATTACHMENT_DISK] = disk;\n\t\t\t\tconst variants = this.#normalizeVariants(config.variants);\n\t\t\t\tconst converter = new AttachmentConverter(value, {\n\t\t\t\t\tdisk,\n\t\t\t\t\toptions: { ...config, variants },\n\t\t\t\t\tconfig: this.options,\n\t\t\t\t\tentity: entity,\n\t\t\t\t\tcolumnName: prop,\n\t\t\t\t\tdiskName: config.driver ?? this.options.defaultDriver,\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tawait converter.process();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t\tthrow new Error(\"Failed to process attachment\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tAttachmentDecorator(options?: AttachmentDecoratorProps<AttachmentSubscriber<TDrivers, TVariants>>) {\n\t\treturn createAttachmentDecorator<AttachmentSubscriber<TDrivers, TVariants>>(options);\n\t}\n\n\t#normalizeVariants(variants: VariantSelection<TVariants> | undefined): Record<string, VariantSpec> | undefined {\n\t\tif (!variants) return undefined;\n\n\t\tif (Array.isArray(variants)) {\n\t\t\tconst out: Record<string, VariantSpec> = {};\n\t\t\tfor (const entry of variants) {\n\t\t\t\tif (typeof entry === \"string\") {\n\t\t\t\t\tconst fromGlobal = this.options.variants?.[entry as keyof TVariants];\n\t\t\t\t\tif (!fromGlobal) {\n\t\t\t\t\t\tthrow new Error(`Unknown attachment variant \"${entry}\"`);\n\t\t\t\t\t}\n\t\t\t\t\tout[entry] = fromGlobal;\n\t\t\t\t} else if (entry && typeof entry === \"object\") {\n\t\t\t\t\tObject.assign(out, entry);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\n\t\tif (variants && typeof variants === \"object\") {\n\t\t\treturn variants as Record<string, VariantSpec>;\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n",
6
- "export const ATTACHMENT_LOADED = Symbol(\"attachment:loaded\");\nexport const ATTACHMENT_OPTIONS = Symbol(\"attachment:options\");\nexport const ATTACHMENT_FILE = Symbol(\"attachment:file\");\nexport const ATTACHMENT_DISK = Symbol(\"attachment:disk\");\nexport const ATTACHMENT_FN_PROCESS = Symbol(\"attachment:fn:process\");\nexport const ATTACHMENT_FN_LOAD = Symbol(\"attachment:fn:load\");\nexport const ATTACHMENT_FN_SAVE = Symbol(\"attachment:fn:save\");\n",
7
- "import { Disk } from \"flydrive\";\nimport {\n\tATTACHMENT_DISK,\n\tATTACHMENT_FILE,\n\tATTACHMENT_FN_LOAD,\n\tATTACHMENT_FN_PROCESS,\n\tATTACHMENT_FN_SAVE,\n\tATTACHMENT_LOADED,\n\tATTACHMENT_OPTIONS,\n} from \"./symbols\";\nimport { AttachmentBase, ImageAttachment } from \"./typings\";\nimport { SignedURLOptions } from \"flydrive/types\";\n\nexport class Attachment<Variants extends string = string> {\n\t[ATTACHMENT_LOADED]: boolean = false;\n\t[ATTACHMENT_FILE]?: File;\n\t[ATTACHMENT_DISK]?: Disk;\n\tprivate data?: AttachmentBase;\n\n\tconstructor(data: File | AttachmentBase) {\n\t\tif (data instanceof File) {\n\t\t\tthis[ATTACHMENT_FILE] = data;\n\t\t} else {\n\t\t\tthis[ATTACHMENT_LOADED] = true;\n\t\t\tthis.data = data;\n\t\t}\n\t}\n\n\t#ensureLoaded() {\n\t\tif (!this[ATTACHMENT_LOADED]) {\n\t\t\tthrow new Error(\"Attachment is not processed, please flush the entity first.\");\n\t\t}\n\t}\n\tget #disk() {\n\t\tthis.#ensureLoaded();\n\t\treturn this[ATTACHMENT_DISK]!;\n\t}\n\n\t// Internal functions\n\t[ATTACHMENT_FN_SAVE]() {\n\t\treturn this.data ?? {};\n\t}\n\n\tstatic [ATTACHMENT_FN_LOAD](value: AttachmentBase): Attachment {\n\t\tconst att = new Attachment(value);\n\t\treturn att;\n\t}\n\n\t[ATTACHMENT_FN_PROCESS](data: AttachmentBase) {\n\t\tif (this[ATTACHMENT_LOADED]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.data = data;\n\t\tthis[ATTACHMENT_LOADED] = true;\n\t}\n\n\tstatic fromFile(file: File): Attachment {\n\t\tconst att = new Attachment(file);\n\t\treturn att;\n\t}\n\n\t/**\n\t * Downloads a file from a URL and returns an Attachment object.\n\t *\n\t * @param url - The URL of the file to download.\n\t * @returns The Attachment object.\n\t * @throws An error if the file cannot be downloaded.\n\t */\n\tstatic async fromUrl(url: string): Promise<Attachment> {\n\t\tconst response = await fetch(url);\n\t\tconst buffer = await response.arrayBuffer();\n\t\tconst file = new File([buffer], url.split(\"/\").pop()!, { type: response.headers.get(\"content-type\") ?? \"\" });\n\t\tconst att = new Attachment(file);\n\t\treturn att;\n\t}\n\n\t#getVariant(variantName: string) {\n\t\tthis.#ensureLoaded();\n\t\tconst variant = (this.data as ImageAttachment)?.variants.find((v) => v.name === variantName) ?? null;\n\t\tif (!variant) {\n\t\t\tthrow new Error(`Attachment: Variant '${variantName}' not found`);\n\t\t}\n\t\treturn variant;\n\t}\n\n\turl(variant?: string) {\n\t\tthis.#ensureLoaded();\n\t\tif (variant) {\n\t\t\treturn this.#disk.getUrl(this.#getVariant(variant).path);\n\t\t}\n\t\treturn (this.data as ImageAttachment)?.url;\n\t}\n\n\tpreSignedUrl(variantNameOrOptions?: string | SignedURLOptions, signedUrlOptions?: SignedURLOptions) {\n\t\tthis.#ensureLoaded();\n\t\tif (typeof variantNameOrOptions === \"string\") {\n\t\t\treturn this.#disk.getSignedUrl(this.#getVariant(variantNameOrOptions).path, signedUrlOptions);\n\t\t}\n\t\treturn this.#disk.getSignedUrl(this.data?.path ?? \"\", signedUrlOptions);\n\t}\n\n\tblurhash() {\n\t\tthis.#ensureLoaded();\n\t\treturn (this.data as ImageAttachment)?.blurhash;\n\t}\n\n\tgetDisk() {\n\t\treturn this.#disk;\n\t}\n\n\tgetDrive() {\n\t\treturn this.data?.drive ?? \"\";\n\t}\n\n\tasync getBytes(variantName?: Variants) {\n\t\tthis.#ensureLoaded();\n\t\tconst path = variantName ? this.#getVariant(variantName).path : this.data?.path ?? \"\";\n\t\treturn this.#disk.getBytes(path);\n\t}\n\n\tasync getBuffer(variantName?: Variants) {\n\t\tthis.#ensureLoaded();\n\t\treturn Buffer.from(await this.getBytes(variantName));\n\t}\n\n\tasync getStream(variantName?: Variants) {\n\t\tthis.#ensureLoaded();\n\t\tconst path = variantName ? this.#getVariant(variantName).path : this.data?.path ?? \"\";\n\t\treturn this.#disk.getStream(path);\n\t}\n\n\tgetMimeType(variantName?: Variants) {\n\t\tthis.#ensureLoaded();\n\t\tconst variant = variantName ? this.#getVariant(variantName) : this.data;\n\t\treturn variant?.mimeType ?? \"\";\n\t}\n\n\ttoJSON() {\n\t\treturn {\n\t\t\turl: this.url(),\n\t\t\tblurhash: this.blurhash(),\n\t\t};\n\t}\n}\n",
8
- "import { Disk } from \"flydrive\";\nimport { Attachment } from \"../Attachment\";\nimport { ATTACHMENT_FILE, ATTACHMENT_FN_PROCESS, ATTACHMENT_LOADED } from \"../symbols\";\nimport { AttachmentConverterProps } from \"../types/attachment\";\nimport { AttachmentBase, AttachmentOptions, ImageAttachment, VariantSpec } from \"../typings\";\nimport type { NormalizedAttachmentPropertyOptions } from \"../typings\";\nimport { join } from \"path\";\nimport { v7 } from \"uuid\";\nimport { fileTypeFromBuffer, fileTypeFromFile } from \"file-type\";\nimport { imageToBlurhash } from \"../utils/helpers\";\nimport { ImageConverter } from \"./ImageConverter\";\nimport type { DriverContract } from \"flydrive/types\";\nimport { BlurhashOptions } from \"../types/converter\";\n\nexport class AttachmentConverter<\n\tTDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,\n\tTVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>\n> {\n\tprivate readonly file: File;\n\tprivate readonly disk: Disk;\n\tprivate buffer?: Buffer;\n\tprivate readonly modelOptions: NormalizedAttachmentPropertyOptions<TDrivers, TVariants>;\n\tprivate readonly config: AttachmentOptions<TDrivers, TVariants>;\n\tprivate readonly entity: any;\n\tprivate readonly columnName: string;\n\tprivate readonly diskName: string;\n\tprivate fileInfo?: {\n\t\textname: string;\n\t\tmimeType: string;\n\t\tsize: number;\n\t};\n\n\tconstructor(private readonly att: Attachment, props: AttachmentConverterProps<TDrivers, TVariants>) {\n\t\tconst { disk, options, config, entity, columnName, diskName } = props;\n\t\tthis.disk = disk;\n\t\tthis.modelOptions = options;\n\t\tthis.config = config;\n\t\tthis.entity = entity;\n\t\tthis.columnName = columnName;\n\t\tthis.diskName = diskName;\n\n\t\tif (att[ATTACHMENT_LOADED]) {\n\t\t\tthrow new Error(\"Attachment already processed, please use the Attachment.fromFile method to create a new attachment\");\n\t\t}\n\t\tthis.file = this.att[ATTACHMENT_FILE]!;\n\t}\n\n\tdone(data: AttachmentBase) {\n\t\tthis.att[ATTACHMENT_FN_PROCESS](data);\n\t}\n\n\tgenerateKey(name: string, ...path: string[]) {\n\t\tlet folder = this.modelOptions.folder ?? \"\";\n\t\tfolder = folder.replace(/:([A-Za-z0-9_]+)/g, (full, key: string) => {\n\t\t\tlet value = this.entity[key];\n\n\t\t\tif (value === undefined || value === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Missing value for Attachment path \"${key}\" in entity ${this.entity.constructor.name}. Please ensure that the referenced property is computed before the attachment is processed. (Auto incrementing fields are not supported.)`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn this.normalizeFileName(String(value));\n\t\t});\n\n\t\treturn join(folder, name, ...path);\n\t}\n\n\tnormalizeFileName(fileName: string) {\n\t\treturn encodeURIComponent(fileName.replace(/[^a-zA-Z0-9.-]/g, \"_\")).toLowerCase();\n\t}\n\n\tasync fileToBuffer() {\n\t\tif (this.buffer) {\n\t\t\treturn this.buffer;\n\t\t}\n\t\tconst arrayBuffer = await this.file.arrayBuffer();\n\t\tconst buffer = Buffer.from(arrayBuffer);\n\t\tthis.buffer = buffer;\n\t\treturn buffer;\n\t}\n\n\tgetFileName() {\n\t\tif (!this.config.rename) {\n\t\t\treturn this.normalizeFileName(this.file.name);\n\t\t}\n\t\tif (typeof this.config.rename === \"function\") {\n\t\t\treturn this.normalizeFileName(this.config.rename(this.file, this.columnName, this.entity));\n\t\t}\n\n\t\treturn this.normalizeFileName(v7());\n\t}\n\n\tasync getFileType() {\n\t\treturn fileTypeFromBuffer(await this.fileToBuffer());\n\t}\n\n\tasync analyseFile() {\n\t\tconst fileType = await this.getFileType();\n\t\tthis.fileInfo = {\n\t\t\textname: fileType?.ext ?? this.file.name.split(\".\").pop() ?? \"\",\n\t\t\tmimeType: fileType?.mime ?? this.file.type,\n\t\t\tsize: this.file.size,\n\t\t};\n\t}\n\n\tasync uploadFile(key: string, buffer: Buffer) {\n\t\tawait this.disk.put(key, buffer);\n\t}\n\n\tasync pickConverter(variantName: string, variant: VariantSpec) {\n\t\tif (!this.fileInfo) {\n\t\t\tthrow new Error(\"Attachment Converter: File info not found\");\n\t\t}\n\t\tfor (const converter of this.config.converters ?? []) {\n\t\t\tif (\n\t\t\t\tawait converter.supports(\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: this.fileInfo.size,\n\t\t\t\t\t\tmimeType: this.fileInfo.mimeType,\n\t\t\t\t\t\tvariantName,\n\t\t\t\t\t\tvariant,\n\t\t\t\t\t\tbuffer: await this.fileToBuffer(),\n\t\t\t\t\t\textname: this.fileInfo.extname,\n\t\t\t\t\t},\n\t\t\t\t\tthis.modelOptions\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn converter;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tasync process() {\n\t\tawait this.analyseFile();\n\t\tconst buffer = await this.fileToBuffer();\n\n\t\tconst name = this.getFileName();\n\t\tconst extname = this.fileInfo?.extname ?? \"\";\n\t\tconst originalKey = this.generateKey(name, `${name}.${extname}`);\n\n\t\tawait this.uploadFile(originalKey, buffer);\n\n\t\tconst data: AttachmentBase | ImageAttachment = {\n\t\t\tname: name,\n\t\t\textname,\n\t\t\tsize: this.file.size,\n\t\t\tdrive: this.diskName,\n\t\t\tmimeType: this.file.type,\n\t\t\tpath: originalKey,\n\t\t\turl: await this.disk.getUrl(originalKey),\n\t\t\toriginalName: this.file.name,\n\t\t\tvariants: [],\n\t\t};\n\n\t\tif (this.modelOptions.variants) {\n\t\t\tfor (const [variantName, variant] of Object.entries(this.modelOptions.variants)) {\n\t\t\t\tconst converter = await this.pickConverter(variantName, variant);\n\t\t\t\tif (converter) {\n\t\t\t\t\tconst converterOutput = await converter.handle(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\t\tsize: this.fileInfo?.size ?? 0,\n\t\t\t\t\t\t\tmimeType: this.fileInfo?.mimeType ?? \"\",\n\t\t\t\t\t\t\textname: this.fileInfo?.extname ?? \"\",\n\t\t\t\t\t\t\tvariantName,\n\t\t\t\t\t\t\tvariant,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.modelOptions.variants[variantName]\n\t\t\t\t\t);\n\t\t\t\t\tconst variantKey = this.generateKey(originalKey.split(\"/\").pop()!.split(\".\").shift()!, `${variantName}.${converterOutput.extname}`);\n\t\t\t\t\tawait this.uploadFile(variantKey, converterOutput.buffer);\n\t\t\t\t\tdata.variants.push({\n\t\t\t\t\t\tname: variantName,\n\t\t\t\t\t\textname: converterOutput.extname,\n\t\t\t\t\t\tsize: converterOutput.buffer.length,\n\t\t\t\t\t\tmimeType: converterOutput.mimeType,\n\t\t\t\t\t\tpath: variantKey,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.fileInfo?.mimeType.startsWith(\"image/\")) {\n\t\t\tconst blurhashEnabled = typeof this.modelOptions.blurhash === \"boolean\" ? this.modelOptions.blurhash : this.modelOptions.blurhash?.enabled;\n\n\t\t\tif (blurhashEnabled) {\n\t\t\t\t(data as ImageAttachment).blurhash = await imageToBlurhash(\n\t\t\t\t\tbuffer,\n\t\t\t\t\ttypeof this.modelOptions.blurhash === \"object\" ? this.modelOptions.blurhash : undefined\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.done(data);\n\t}\n}\n",
9
- "import { encode } from \"blurhash\";\nimport { BlurhashOptions } from \"../types/converter\";\n\nexport async function use(module: string) {\n\ttry {\n\t\tconst result = await import(module);\n\n\t\tif (result.default) {\n\t\t\treturn result.default;\n\t\t}\n\n\t\treturn result;\n\t} catch (err) {\n\t\tthrow new Error(`Module ${module} not found, please install it first.`);\n\t}\n}\n\nexport function imageToBlurhash(input: Buffer, options?: BlurhashOptions): Promise<string> {\n\tconst { componentX, componentY } = options ?? { enabled: true, componentX: 4, componentY: 4 };\n\n\treturn new Promise(async (resolve, reject) => {\n\t\ttry {\n\t\t\tconst sharp = await use(\"sharp\");\n\t\t\tconst { data: pixels, info: metadata } = await sharp(input).raw().ensureAlpha().toBuffer({ resolveWithObject: true });\n\n\t\t\tconst blurhash = encode(new Uint8ClampedArray(pixels), metadata.width, metadata.height, componentX, componentY);\n\n\t\t\treturn resolve(blurhash);\n\t\t} catch (error) {\n\t\t\treturn reject(error);\n\t\t}\n\t});\n}\n",
10
- "import { Property } from \"@mikro-orm/core\";\nimport { AttachmentType } from \"../DatabaseType\";\nimport { ALLOWED_PROPERTY_OPTIONS, AttachmentDecoratorProps, AttachmentPropertyOptionsFor, DEFAULT_ATTACHMENT_PROPERTY_OPTIONS } from \"../typings\";\nimport { AttachmentSubscriber } from \"../subscribers/AttachmentSubscriber\";\n\nconst ATTACHMENT_PROPS = Symbol(\"attachment:props\");\n\nexport function AttachmentDecorator<S extends AttachmentSubscriber<any, any>>(options: AttachmentDecoratorProps<S> = {}) {\n\treturn (target: any, propertyKey: string) => {\n\t\tlet { mikro, attachment } = splitOptions(options, ALLOWED_PROPERTY_OPTIONS);\n\n\t\tattachment = {\n\t\t\t...DEFAULT_ATTACHMENT_PROPERTY_OPTIONS,\n\t\t\t...attachment,\n\t\t} as AttachmentPropertyOptionsFor<S>;\n\n\t\tconst ctor = target.constructor as any;\n\t\tif (!ctor[ATTACHMENT_PROPS]) ctor[ATTACHMENT_PROPS] = {} as Record<string, AttachmentPropertyOptionsFor<S>>;\n\t\tctor[ATTACHMENT_PROPS][propertyKey] = attachment;\n\n\t\treturn Property({ ...mikro, type: new AttachmentType(attachment) })(target, propertyKey);\n\t};\n}\n\nexport function createAttachmentDecorator<S extends AttachmentSubscriber<any, any>>(options?: AttachmentDecoratorProps<S>) {\n\treturn AttachmentDecorator<S>(options);\n}\n\nexport function getAttachmentProps<S extends AttachmentSubscriber<any, any>>(entity: object): Record<string, AttachmentPropertyOptionsFor<S>> {\n\tconst ctor = entity.constructor as any;\n\tconst set: Record<string, AttachmentPropertyOptionsFor<S>> | undefined = ctor[ATTACHMENT_PROPS];\n\treturn set ? set : {};\n}\n\nfunction splitOptions<T extends AttachmentDecoratorProps<any>, K extends readonly (keyof T)[]>(obj: T, mikroOptions: K) {\n\ttype Key = K[number];\n\n\tconst allowedSet = new Set<keyof T>(mikroOptions as readonly (keyof T)[]);\n\tconst mikro = {} as Pick<T, Key>;\n\tconst attachment = {} as Omit<T, Key>;\n\n\tfor (const key in obj) {\n\t\tif (allowedSet.has(key as keyof T)) {\n\t\t\t(mikro as any)[key] = obj[key];\n\t\t} else {\n\t\t\t(attachment as any)[key] = obj[key];\n\t\t}\n\t}\n\n\treturn { mikro, attachment };\n}\n",
11
- "import { Type } from \"@mikro-orm/core\";\nimport { ATTACHMENT_FN_LOAD, ATTACHMENT_FN_SAVE } from \"./symbols\";\nimport { Attachment } from \"./Attachment\";\nimport { AttachmentPropertyOptions } from \"./typings\";\n\nexport class AttachmentType extends Type<Attachment, string> {\n\tprivate readonly options: AttachmentPropertyOptions = {\n\t\tfolder: \"attachments\",\n\t\tblurhash: true,\n\t};\n\n\tconstructor(options: AttachmentPropertyOptions | undefined) {\n\t\tsuper();\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options,\n\t\t};\n\t}\n\n\tconvertToDatabaseValue(value: Attachment): any {\n\t\treturn value[ATTACHMENT_FN_SAVE]();\n\t}\n\n\tconvertToJSValue(value: any): Attachment {\n\t\ttry {\n\t\t\treturn Attachment[ATTACHMENT_FN_LOAD](JSON.parse(value));\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\treturn Attachment[ATTACHMENT_FN_LOAD](value);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new Error(\"Invalid attachment data\");\n\t\t\t}\n\t\t}\n\t}\n\n\tgetColumnType(): string {\n\t\treturn \"json\";\n\t}\n}\n",
12
- "import { fileTypeFromBuffer } from \"file-type\";\nimport { Converter, ConverterOptions, ConvertInput, ConvertOutput, ImageConverterOptions } from \"../types/converter\";\nimport { use } from \"../utils/helpers\";\n\nexport class ImageConverter implements Converter {\n\tasync supports(input: ConvertInput, options: ConverterOptions): Promise<boolean> {\n\t\treturn input.mimeType.startsWith(\"image/\");\n\t}\n\n\tasync handle(input: ConvertInput, options?: ImageConverterOptions): Promise<ConvertOutput> {\n\t\tconst sharp = await use(\"sharp\");\n\t\tconst resize = options?.resize || {};\n\t\tlet format = options?.format || \"webp\";\n\t\tconst autoOrient = options?.autoOrient || true;\n\t\tlet formatOptions: unknown = {};\n\n\t\tif (typeof format !== \"string\") {\n\t\t\tformatOptions = format?.options;\n\t\t\tformat = format.format;\n\t\t}\n\n\t\tconst image = sharp(input.buffer).withMetadata();\n\n\t\tif (autoOrient) {\n\t\t\timage.autoOrient();\n\t\t}\n\n\t\tconst buffer = await image.resize(resize).toFormat(format, formatOptions).toBuffer();\n\n\t\tconst fileType = await fileTypeFromBuffer(buffer);\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\tmimeType: fileType?.mime ?? input.mimeType,\n\t\t\textname: fileType?.ext ?? input.extname,\n\t\t};\n\t}\n}\n",
13
- "import { PropertyOptions } from \"@mikro-orm/core\";\nimport type { DriverContract } from \"flydrive/types\";\nimport { ImageConverter } from \"./converters/ImageConverter\";\nimport { BlurhashOptions, Converter, ConverterOptions } from \"./types/converter\";\nimport { AttachmentSubscriber } from \"./subscribers/AttachmentSubscriber\";\n\ntype StringKeyOf<T> = Extract<keyof T, string>;\n\nexport type DriversOf<S> = S extends AttachmentSubscriber<infer TDrivers, any> ? TDrivers : never;\nexport type VariantsOf<S> = S extends AttachmentSubscriber<any, infer TVariants> ? TVariants : never;\n\nexport type VariantSelection<TVariants extends Record<string, VariantSpec>> =\n\t| ReadonlyArray<StringKeyOf<TVariants> | Record<string, VariantSpec>>\n\t| Partial<TVariants>\n\t| Record<string, VariantSpec>;\n\nexport interface AttachmentPropertyOptions<\n\tTDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,\n\tTVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>\n> {\n\tfolder?: string;\n\tblurhash?: boolean | BlurhashOptions;\n\tvariants?: VariantSelection<TVariants>;\n\tdriver?: StringKeyOf<TDrivers>;\n}\n\nexport type AttachmentPropertyOptionsFor<S extends AttachmentSubscriber<any, any>> = AttachmentPropertyOptions<DriversOf<S>, VariantsOf<S>>;\n\nexport type NormalizedAttachmentPropertyOptions<\n\tTDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,\n\tTVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>\n> = Omit<AttachmentPropertyOptions<TDrivers, TVariants>, \"variants\"> & {\n\tvariants?: Record<string, VariantSpec>;\n};\n\nexport type NormalizedAttachmentPropertyOptionsFor<S extends AttachmentSubscriber<any, any>> = NormalizedAttachmentPropertyOptions<DriversOf<S>, VariantsOf<S>>;\n\nexport const DEFAULT_ATTACHMENT_PROPERTY_OPTIONS: AttachmentPropertyOptions = {\n\tblurhash: true,\n};\n\nexport const DEFAULT_ATTACHMENT_OPTIONS: Omit<AttachmentOptions, \"drivers\" | \"defaultDriver\" | \"variants\"> = {\n\trename: true,\n\tconverters: [new ImageConverter()],\n};\nexport interface AttachmentOptions<\n\tTDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,\n\tTVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>\n> {\n\treadonly drivers: TDrivers;\n\treadonly defaultDriver: StringKeyOf<TDrivers>;\n\treadonly rename?: boolean | ((file: File, columnName: string, entity: any) => string);\n\treadonly converters?: Converter[];\n\treadonly variants?: TVariants;\n}\n\nexport const ALLOWED_PROPERTY_OPTIONS = [\n\t\"accessor\",\n\t\"comment\",\n\t\"customOrder\",\n\t\"getter\",\n\t\"getterName\",\n\t\"hidden\",\n\t\"index\",\n\t\"lazy\",\n\t\"name\",\n\t\"nullable\",\n\t\"serializedName\",\n\t\"serializedPrimaryKey\",\n\t\"serializer\",\n\t\"version\",\n] as const;\n\nexport type AllowedPropertyOptions = (typeof ALLOWED_PROPERTY_OPTIONS)[number];\n\nexport interface AttachmentDecoratorProps<S extends AttachmentSubscriber<any, any>>\n\textends AttachmentPropertyOptionsFor<S>,\n\t\tPick<PropertyOptions<object>, AllowedPropertyOptions> {}\n\nexport interface AttachmentBase {\n\tdrive: string;\n\tname: string;\n\textname: string;\n\tsize: number;\n\tmimeType: string;\n\tpath: string;\n\toriginalName: string;\n\tvariants: Omit<AttachmentBase, \"variants\" | \"originalName\" | \"drive\">[];\n}\nexport interface ImageAttachment extends AttachmentBase {\n\tblurhash?: string;\n\tmeta: {\n\t\tdate?: string;\n\t\thost?: string;\n\t\tdimension: {\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t};\n\t\tgps?: {\n\t\t\tlatitude?: number;\n\t\t\tlongitude?: number;\n\t\t\taltitude?: number;\n\t\t};\n\t\torientation?: {\n\t\t\tvalue: number;\n\t\t\tdescription?: string;\n\t\t};\n\t};\n\tpath: string;\n\turl: string;\n}\n\nexport interface VariantSpec extends ConverterOptions {}\n"
14
- ],
15
- "mappings": "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",
16
- "debugId": "D6CAA0FA0CC1E84D64756E2164756E21",
17
- "names": []
18
- }
@@ -1,14 +0,0 @@
1
- import { EventArgs, EventSubscriber, FlushEventArgs } from "@mikro-orm/core";
2
- import { AttachmentOptions, AttachmentDecoratorProps, VariantSpec } from "../typings";
3
- import { DriverContract } from "flydrive/types";
4
- export declare class AttachmentSubscriber<const TDrivers extends Record<string, DriverContract>, const TVariants extends Record<string, VariantSpec>> implements EventSubscriber {
5
- #private;
6
- private readonly options;
7
- private readonly disks;
8
- constructor(options: AttachmentOptions<TDrivers, TVariants>);
9
- getSubscribedEvents(): string[];
10
- onLoad(args: EventArgs<any>): Promise<void>;
11
- beforeFlush(args: FlushEventArgs): Promise<void>;
12
- AttachmentDecorator(options?: AttachmentDecoratorProps<AttachmentSubscriber<TDrivers, TVariants>>): (target: any, propertyKey: string) => any;
13
- }
14
- //# sourceMappingURL=AttachmentSubscriber.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AttachmentSubscriber.d.ts","sourceRoot":"","sources":["../../src/subscribers/AttachmentSubscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAM7E,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAgD,WAAW,EAA6B,MAAM,YAAY,CAAC;AAC/J,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,oBAAoB,CAAC,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAC3I,YAAW,eAAe;;IAGd,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;gBACtC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC;IAQ5E,mBAAmB,IAAI,MAAM,EAAE;IAIzB,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB3C,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCtD,mBAAmB,CAAC,OAAO,CAAC,EAAE,wBAAwB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;CA6BjG"}
package/dist/symbols.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export declare const ATTACHMENT_LOADED: unique symbol;
2
- export declare const ATTACHMENT_OPTIONS: unique symbol;
3
- export declare const ATTACHMENT_FILE: unique symbol;
4
- export declare const ATTACHMENT_DISK: unique symbol;
5
- export declare const ATTACHMENT_FN_PROCESS: unique symbol;
6
- export declare const ATTACHMENT_FN_LOAD: unique symbol;
7
- export declare const ATTACHMENT_FN_SAVE: unique symbol;
8
- //# sourceMappingURL=symbols.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAC7D,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAC/D,eAAO,MAAM,eAAe,eAA4B,CAAC;AACzD,eAAO,MAAM,eAAe,eAA4B,CAAC;AACzD,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AACrE,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAC/D,eAAO,MAAM,kBAAkB,eAA+B,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { Disk } from "flydrive";
2
- import type { DriverContract } from "flydrive/types";
3
- import type { AttachmentOptions, NormalizedAttachmentPropertyOptions, VariantSpec } from "../typings";
4
- export type AttachmentConverterProps<TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>, TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>> = {
5
- entity: any;
6
- columnName: string;
7
- disk: Disk;
8
- diskName: string;
9
- options: NormalizedAttachmentPropertyOptions<TDrivers, TVariants>;
10
- config: AttachmentOptions<TDrivers, TVariants>;
11
- };
12
- //# sourceMappingURL=attachment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/types/attachment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mCAAmC,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtG,MAAM,MAAM,wBAAwB,CACnC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAChF,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IACxE;IACH,MAAM,EAAE,GAAG,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mCAAmC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClE,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;CAC/C,CAAC"}
@@ -1,137 +0,0 @@
1
- import { VariantSpec } from "../typings";
2
- export interface Converter {
3
- supports(input: ConvertInput, options: ConverterOptions): Promise<boolean>;
4
- handle(input: ConvertInput, options: ConverterOptions): Promise<ConvertOutput>;
5
- }
6
- export type BlurhashOptions = {
7
- enabled: boolean;
8
- componentX: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
9
- componentY: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
10
- };
11
- export interface ImageConverterOptions extends ConverterOptions {
12
- }
13
- export interface ConvertInput {
14
- buffer: Buffer;
15
- size: number;
16
- mimeType: string;
17
- variantName: string;
18
- variant: VariantSpec;
19
- extname: string;
20
- }
21
- export interface ConvertOutput {
22
- buffer: Buffer;
23
- mimeType: string;
24
- extname: string;
25
- }
26
- type jpeg = {
27
- format: "jpeg";
28
- options?: {
29
- quality?: number;
30
- progressive?: boolean;
31
- chromaSubsampling?: string;
32
- optimiseCoding?: boolean;
33
- optimizeCoding?: boolean;
34
- mozjpeg?: boolean;
35
- trellisQuantisation?: boolean;
36
- overshootDeringing?: boolean;
37
- optimiseScans?: boolean;
38
- optimizeScans?: boolean;
39
- quantisationTable?: number;
40
- quantizationTable?: number;
41
- force?: boolean;
42
- };
43
- };
44
- type png = {
45
- format: "png";
46
- options?: {
47
- quality?: number;
48
- progressive?: boolean;
49
- compressionLevel?: number;
50
- adaptiveFiltering?: boolean;
51
- palette?: boolean;
52
- effort?: number;
53
- colours?: number;
54
- colors?: number;
55
- dither?: number;
56
- force?: boolean;
57
- };
58
- };
59
- type gif = {
60
- format: "gif";
61
- options?: {
62
- reuse?: boolean;
63
- progressive?: boolean;
64
- colours?: number;
65
- colors?: number;
66
- effort?: number;
67
- dither?: number;
68
- interFrameMaxError?: number;
69
- interPaletteMaxError?: number;
70
- loop?: number;
71
- delay?: number | number[];
72
- force?: boolean;
73
- };
74
- };
75
- type webp = {
76
- format: "webp";
77
- options?: {
78
- quality?: number;
79
- alphaQuality?: number;
80
- lossless?: boolean;
81
- nearLossless?: boolean;
82
- smartSubsample?: boolean;
83
- preset?: string;
84
- effort?: number;
85
- loop?: number;
86
- delay?: number | number[];
87
- minSize?: boolean;
88
- mixed?: boolean;
89
- force?: boolean;
90
- };
91
- };
92
- type avif = {
93
- format: "avif";
94
- options?: {
95
- quality?: number;
96
- lossless?: boolean;
97
- effort?: number;
98
- chromaSubsampling?: string;
99
- bitdepth?: number;
100
- };
101
- };
102
- type heif = {
103
- format: "heif";
104
- options?: {
105
- compression?: string;
106
- quality?: number;
107
- lossless?: boolean;
108
- effort?: number;
109
- chromaSubsampling?: string;
110
- bitdepth?: number;
111
- };
112
- };
113
- export type ConverterOptions = {
114
- resize?: number | {
115
- width?: number;
116
- height?: number;
117
- fit?: "contain" | "cover" | "fill" | "inside" | "outside";
118
- position?: string;
119
- background?: string | {
120
- r: number;
121
- g: number;
122
- b: number;
123
- alpha: number;
124
- };
125
- kernel?: string;
126
- withoutEnlargement?: boolean;
127
- withoutReduction?: boolean;
128
- fastShrinkOnLoad?: boolean;
129
- };
130
- format?: "jpeg" | "jpg" | "png" | "gif" | "webp" | "avif" | "heif" | "tiff" | "raw" | jpeg | png | gif | webp | avif | heif;
131
- autoOrient?: boolean;
132
- blurhash?: boolean | BlurhashOptions;
133
- startTime?: number;
134
- startPage?: number;
135
- };
136
- export {};
137
- //# sourceMappingURL=converter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../src/types/converter.ts"],"names":[],"mappings":"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"}
package/dist/typings.d.ts DELETED
@@ -1,68 +0,0 @@
1
- import { PropertyOptions } from "@mikro-orm/core";
2
- import type { DriverContract } from "flydrive/types";
3
- import { BlurhashOptions, Converter, ConverterOptions } from "./types/converter";
4
- import { AttachmentSubscriber } from "./subscribers/AttachmentSubscriber";
5
- type StringKeyOf<T> = Extract<keyof T, string>;
6
- export type DriversOf<S> = S extends AttachmentSubscriber<infer TDrivers, any> ? TDrivers : never;
7
- export type VariantsOf<S> = S extends AttachmentSubscriber<any, infer TVariants> ? TVariants : never;
8
- export type VariantSelection<TVariants extends Record<string, VariantSpec>> = ReadonlyArray<StringKeyOf<TVariants> | Record<string, VariantSpec>> | Partial<TVariants> | Record<string, VariantSpec>;
9
- export interface AttachmentPropertyOptions<TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>, TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>> {
10
- folder?: string;
11
- blurhash?: boolean | BlurhashOptions;
12
- variants?: VariantSelection<TVariants>;
13
- driver?: StringKeyOf<TDrivers>;
14
- }
15
- export type AttachmentPropertyOptionsFor<S extends AttachmentSubscriber<any, any>> = AttachmentPropertyOptions<DriversOf<S>, VariantsOf<S>>;
16
- export type NormalizedAttachmentPropertyOptions<TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>, TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>> = Omit<AttachmentPropertyOptions<TDrivers, TVariants>, "variants"> & {
17
- variants?: Record<string, VariantSpec>;
18
- };
19
- export type NormalizedAttachmentPropertyOptionsFor<S extends AttachmentSubscriber<any, any>> = NormalizedAttachmentPropertyOptions<DriversOf<S>, VariantsOf<S>>;
20
- export declare const DEFAULT_ATTACHMENT_PROPERTY_OPTIONS: AttachmentPropertyOptions;
21
- export declare const DEFAULT_ATTACHMENT_OPTIONS: Omit<AttachmentOptions, "drivers" | "defaultDriver" | "variants">;
22
- export interface AttachmentOptions<TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>, TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>> {
23
- readonly drivers: TDrivers;
24
- readonly defaultDriver: StringKeyOf<TDrivers>;
25
- readonly rename?: boolean | ((file: File, columnName: string, entity: any) => string);
26
- readonly converters?: Converter[];
27
- readonly variants?: TVariants;
28
- }
29
- export declare const ALLOWED_PROPERTY_OPTIONS: readonly ["accessor", "comment", "customOrder", "getter", "getterName", "hidden", "index", "lazy", "name", "nullable", "serializedName", "serializedPrimaryKey", "serializer", "version"];
30
- export type AllowedPropertyOptions = (typeof ALLOWED_PROPERTY_OPTIONS)[number];
31
- export interface AttachmentDecoratorProps<S extends AttachmentSubscriber<any, any>> extends AttachmentPropertyOptionsFor<S>, Pick<PropertyOptions<object>, AllowedPropertyOptions> {
32
- }
33
- export interface AttachmentBase {
34
- drive: string;
35
- name: string;
36
- extname: string;
37
- size: number;
38
- mimeType: string;
39
- path: string;
40
- originalName: string;
41
- variants: Omit<AttachmentBase, "variants" | "originalName" | "drive">[];
42
- }
43
- export interface ImageAttachment extends AttachmentBase {
44
- blurhash?: string;
45
- meta: {
46
- date?: string;
47
- host?: string;
48
- dimension: {
49
- width: number;
50
- height: number;
51
- };
52
- gps?: {
53
- latitude?: number;
54
- longitude?: number;
55
- altitude?: number;
56
- };
57
- orientation?: {
58
- value: number;
59
- description?: string;
60
- };
61
- };
62
- path: string;
63
- url: string;
64
- }
65
- export interface VariantSpec extends ConverterOptions {
66
- }
67
- export {};
68
- //# sourceMappingURL=typings.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../src/typings.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import { BlurhashOptions } from "../types/converter";
2
- export declare function use(module: string): Promise<any>;
3
- export declare function imageToBlurhash(input: Buffer, options?: BlurhashOptions): Promise<string>;
4
- //# sourceMappingURL=helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,wBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,gBAYvC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAezF"}