mikro-orm-attachments 1.3.2 → 2.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.
@@ -0,0 +1 @@
1
+ import{a as o}from"../shared/chunk-4thj50nc.js";import{b as i}from"../shared/chunk-tgvybtjr.js";import"../shared/chunk-v2cxb1jc.js";import{fileTypeFromBuffer as n}from"file-type";class m extends o{options;constructor(t){super();this.options=t}async supports(t){return t.mimeType.startsWith("image/")}async handle(t){let e=await(await i("imgkit")).transform(t.buffer,this.options??{}),r=await n(new Uint8Array(e.buffer));return{buffer:e,mimeType:r?.mime??t.mimeType,extname:r?.ext??t.extname}}}export{m as ImgkitConverter};
@@ -0,0 +1,38 @@
1
+ type VariantSpec = BaseConverter<ConvertInput, ConvertOutput>;
2
+ interface ConvertInput {
3
+ buffer: Buffer;
4
+ size: number;
5
+ mimeType: string;
6
+ variantName?: string;
7
+ variant?: VariantSpec;
8
+ extname: string;
9
+ }
10
+ interface ConvertOutput {
11
+ buffer: Buffer;
12
+ mimeType: string;
13
+ extname: string;
14
+ }
15
+ declare abstract class BaseConverter<
16
+ TInput extends ConvertInput,
17
+ TOutput extends ConvertOutput
18
+ > {
19
+ abstract supports(input: TInput): Promise<boolean>;
20
+ abstract handle(input: TInput): Promise<TOutput>;
21
+ }
22
+ import * as Sharp from "sharp";
23
+ type SharpFormat = "jpg" | "jpeg" | "png" | "webp" | "avif" | "gif" | "tiff" | "heic" | "heif";
24
+ interface SharpConverterOptions {
25
+ resize?: Sharp.ResizeOptions;
26
+ autoOrient?: boolean;
27
+ format?: SharpFormat | {
28
+ format: SharpFormat;
29
+ options: Sharp.PngOptions | Sharp.JpegOptions | Sharp.WebpOptions | Sharp.AvifOptions | Sharp.GifOptions | Sharp.TiffOptions | Sharp.HeifOptions;
30
+ };
31
+ }
32
+ declare class SharpConverter extends BaseConverter<ConvertInput, ConvertOutput> {
33
+ private readonly options?;
34
+ constructor(options?: SharpConverterOptions | undefined);
35
+ supports(input: ConvertInput): Promise<boolean>;
36
+ handle(input: ConvertInput): Promise<ConvertOutput>;
37
+ }
38
+ export { SharpConverter };
@@ -0,0 +1 @@
1
+ import{a as n}from"../shared/chunk-4thj50nc.js";import{b as a}from"../shared/chunk-tgvybtjr.js";import"../shared/chunk-v2cxb1jc.js";import{fileTypeFromBuffer as h}from"file-type";class u extends n{options;constructor(t){super();this.options=t}async supports(t){return t.mimeType.startsWith("image/")}async handle(t){let s=await a("sharp"),f=this.options?.resize||{},e=this.options?.format||"webp",m=this.options?.autoOrient||!0,r={};if(typeof e!=="string")r=e?.options,e=e.format;let o=s(t.buffer).withMetadata();if(m)o.autoOrient();let p=await o.resize(f).toFormat(e,r).toBuffer(),i=await h(p);return{buffer:p,mimeType:i?.mime??t.mimeType,extname:i?.ext??t.extname}}}export{u as SharpConverter};
package/dist/index.d.ts CHANGED
@@ -1,143 +1,32 @@
1
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>;
2
+ import { DriverContract as DriverContract2 } from "flydrive/types";
3
+ declare abstract class BaseMetadata<TMetadata> {
4
+ abstract metadata(input: ConvertInput): Promise<TMetadata>;
6
5
  }
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;
6
+ import { DriverContract } from "flydrive/types";
7
+ interface EventSubscriber {
8
+ getSubscribedEvents(): string[];
9
+ onLoad(args: any): Promise<void>;
10
+ beforeFlush(args: any): Promise<void>;
19
11
  }
20
- interface ConvertOutput {
21
- buffer: Buffer;
22
- mimeType: string;
23
- extname: string;
12
+ declare class AttachmentSubscriber<
13
+ const TDrivers extends Record<string, DriverContract>,
14
+ const TVariants extends Record<string, VariantSpec>
15
+ > implements EventSubscriber {
16
+ private;
17
+ private readonly options;
18
+ private readonly disks;
19
+ constructor(options: AttachmentOptions<TDrivers, TVariants>);
20
+ onLoad(args: any): Promise<void>;
21
+ beforeFlush(args: any): Promise<void>;
22
+ AttachmentDecorator(options?: AttachmentDecoratorProps<AttachmentSubscriber<TDrivers, TVariants>>): (target: any, propertyKey: string) => void;
24
23
  }
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
24
  type StringKeyOf<T> = Extract<keyof T, string>;
136
25
  type DriversOf<S> = S extends AttachmentSubscriber<infer TDrivers, any> ? TDrivers : never;
137
26
  type VariantsOf<S> = S extends AttachmentSubscriber<any, infer TVariants> ? TVariants : never;
138
27
  type VariantSelection<TVariants extends Record<string, VariantSpec>> = ReadonlyArray<StringKeyOf<TVariants> | Record<string, VariantSpec>> | Partial<TVariants> | Record<string, VariantSpec>;
139
28
  interface AttachmentPropertyOptions<
140
- TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,
29
+ TDrivers extends Record<string, DriverContract2> = Record<string, DriverContract2>,
141
30
  TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>
142
31
  > {
143
32
  folder?: string;
@@ -147,14 +36,15 @@ interface AttachmentPropertyOptions<
147
36
  }
148
37
  type AttachmentPropertyOptionsFor<S extends AttachmentSubscriber<any, any>> = AttachmentPropertyOptions<DriversOf<S>, VariantsOf<S>>;
149
38
  interface AttachmentOptions<
150
- TDrivers extends Record<string, DriverContract> = Record<string, DriverContract>,
151
- TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>
39
+ TDrivers extends Record<string, DriverContract2> = Record<string, DriverContract2>,
40
+ TVariants extends Record<string, VariantSpec> = Record<string, VariantSpec>,
41
+ TMetadata extends BaseMetadata<any> = BaseMetadata<any>
152
42
  > {
153
43
  readonly drivers: TDrivers;
154
44
  readonly defaultDriver: StringKeyOf<TDrivers>;
155
45
  readonly rename?: boolean | ((file: File, columnName: string, entity: any) => string);
156
- readonly converters?: Converter[];
157
46
  readonly variants?: TVariants;
47
+ readonly metadata?: TMetadata;
158
48
  }
159
49
  declare const ALLOWED_PROPERTY_OPTIONS: readonly ["accessor", "comment", "customOrder", "getter", "getterName", "hidden", "index", "lazy", "name", "nullable", "serializedName", "serializedPrimaryKey", "serializer", "version"];
160
50
  type AllowedPropertyOptions = (typeof ALLOWED_PROPERTY_OPTIONS)[number];
@@ -167,28 +57,42 @@ interface AttachmentBase {
167
57
  mimeType: string;
168
58
  path: string;
169
59
  originalName: string;
60
+ meta?: ConvertMetadata;
170
61
  variants: Omit<AttachmentBase, "variants" | "originalName" | "drive">[];
171
62
  }
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>;
63
+ type VariantSpec = BaseConverter<ConvertInput, ConvertOutput>;
64
+ type BlurhashOptions = {
65
+ enabled: boolean;
66
+ componentX: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
67
+ componentY: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
68
+ };
69
+ interface ConvertInput {
70
+ buffer: Buffer;
71
+ size: number;
72
+ mimeType: string;
73
+ variantName?: string;
74
+ variant?: VariantSpec;
75
+ extname: string;
178
76
  }
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;
77
+ interface ConvertOutput {
78
+ buffer: Buffer;
79
+ mimeType: string;
80
+ extname: string;
81
+ }
82
+ interface ConvertMetadata {
83
+ dimension: {
84
+ width: number;
85
+ height: number;
86
+ };
87
+ }
88
+ declare abstract class BaseConverter<
89
+ TInput extends ConvertInput,
90
+ TOutput extends ConvertOutput
91
+ > {
92
+ abstract supports(input: TInput): Promise<boolean>;
93
+ abstract handle(input: TInput): Promise<TOutput>;
191
94
  }
95
+ import { Buffer as Buffer2 } from "node:buffer";
192
96
  import { Disk } from "flydrive";
193
97
  import { SignedURLOptions } from "flydrive/types";
194
98
  import { Readable as Readable_d9sohc } from "node:stream";
@@ -205,18 +109,21 @@ declare class Attachment<Variants extends string = string> {
205
109
  * @throws An error if the file cannot be downloaded.
206
110
  */
207
111
  static fromUrl(url: string): Promise<Attachment>;
208
- url(variant?: string): string | Promise<string>;
209
- preSignedUrl(variantNameOrOptions?: string | SignedURLOptions, signedUrlOptions?: SignedURLOptions): Promise<string>;
112
+ url(variant?: Variants): string | Promise<string> | undefined;
113
+ originalName(): string;
114
+ size(variant?: Variants): number | undefined;
115
+ meta(variant?: Variants): ConvertMetadata | undefined;
116
+ preSignedUrl(variantNameOrOptions?: string | SignedURLOptions, signedUrlOptions?: SignedURLOptions): Promise<string> | undefined;
210
117
  blurhash(): string | undefined;
211
- getDisk(): Disk;
118
+ getDisk(): Disk | undefined;
212
119
  getDrive(): string;
213
- getBytes(variantName?: Variants): Promise<Uint8Array<ArrayBufferLike>>;
214
- getBuffer(variantName?: Variants): Promise<Buffer<ArrayBuffer>>;
215
- getStream(variantName?: Variants): Promise<Readable_d9sohc>;
120
+ getBytes(variantName?: Variants): Promise<Uint8Array<ArrayBufferLike> | undefined>;
121
+ getBuffer(variantName?: Variants): Promise<Buffer2<ArrayBuffer> | null>;
122
+ getStream(variantName?: Variants): Promise<Readable_d9sohc | undefined>;
216
123
  getMimeType(variantName?: Variants): string;
217
124
  toJSON(): {
218
- url: string | Promise<string>;
125
+ url: string | Promise<string> | undefined;
219
126
  blurhash: string | undefined;
220
127
  };
221
128
  }
222
- export { AttachmentSubscriber, AttachmentPropertyOptions, AttachmentOptions, Attachment };
129
+ export { AttachmentSubscriber, AttachmentPropertyOptions, AttachmentOptions, AttachmentDecoratorProps, Attachment };
package/dist/index.js CHANGED
@@ -1 +1,15 @@
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};
1
+ import{a as jY}from"./shared/chunk-4thj50nc.js";import{c as wY}from"./shared/chunk-tgvybtjr.js";import{e as HV,f as WV}from"./shared/chunk-v2cxb1jc.js";var UY=WV(()=>{/*! *****************************************************************************
2
+ Copyright (C) Microsoft. All rights reserved.
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4
+ this file except in compliance with the License. You may obtain a copy of the
5
+ License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
9
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
10
+ MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ See the Apache Version 2.0 License for specific language governing permissions
13
+ and limitations under the License.
14
+ ***************************************************************************** */var xY;(function(A){(function(X){var Q=typeof globalThis==="object"?globalThis:typeof global==="object"?global:typeof self==="object"?self:typeof this==="object"?this:x(),q=H(A);if(typeof Q.Reflect<"u")q=H(Q.Reflect,q);if(X(q,Q),typeof Q.Reflect>"u")Q.Reflect=A;function H(D,U){return function(b,v){if(Object.defineProperty(D,b,{configurable:!0,writable:!0,value:v}),U)U(b,v)}}function L(){try{return Function("return this;")()}catch(D){}}function E(){try{return(0,eval)("(function() { return this; })()")}catch(D){}}function x(){return L()||E()}})(function(X,Q){var q=Object.prototype.hasOwnProperty,H=typeof Symbol==="function",L=H&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",E=H&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",x=typeof Object.create==="function",D={__proto__:[]}instanceof Array,U=!x&&!D,b={create:x?function(){return YY(Object.create(null))}:D?function(){return YY({__proto__:null})}:function(){return YY({})},has:U?function(Y,V){return q.call(Y,V)}:function(Y,V){return V in Y},get:U?function(Y,V){return q.call(Y,V)?Y[V]:void 0}:function(Y,V){return Y[V]}},v=Object.getPrototypeOf(Function),c=typeof Map==="function"&&typeof Map.prototype.entries==="function"?Map:YV(),o=typeof Set==="function"&&typeof Set.prototype.entries==="function"?Set:VV(),r=typeof WeakMap==="function"?WeakMap:AV(),K=H?Symbol.for("@reflect-metadata:registry"):void 0,s=aY(),XY=tY(s);function OY(Y,V,J,$){if(!R(J)){if(!HY(Y))throw TypeError();if(!T(V))throw TypeError();if(!T($)&&!R($)&&!k($))throw TypeError();if(k($))$=void 0;return J=P(J),nY(Y,V,J,$)}else{if(!HY(Y))throw TypeError();if(!RY(V))throw TypeError();return sY(Y,V)}}X("decorate",OY);function KY(Y,V){function J($,W){if(!T($))throw TypeError();if(!R(W)&&!oY(W))throw TypeError();ZY(Y,V,$,W)}return J}X("metadata",KY);function kY(Y,V,J,$){if(!T(J))throw TypeError();if(!R($))$=P($);return ZY(Y,V,J,$)}X("defineMetadata",kY);function uY(Y,V,J){if(!T(V))throw TypeError();if(!R(J))J=P(J);return $Y(Y,V,J)}X("hasMetadata",uY);function MY(Y,V,J){if(!T(V))throw TypeError();if(!R(J))J=P(J);return a(Y,V,J)}X("hasOwnMetadata",MY);function vY(Y,V,J){if(!T(V))throw TypeError();if(!R(J))J=P(J);return QY(Y,V,J)}X("getMetadata",vY);function cY(Y,V,J){if(!T(V))throw TypeError();if(!R(J))J=P(J);return BY(Y,V,J)}X("getOwnMetadata",cY);function mY(Y,V){if(!T(Y))throw TypeError();if(!R(V))V=P(V);return zY(Y,V)}X("getMetadataKeys",mY);function gY(Y,V){if(!T(Y))throw TypeError();if(!R(V))V=P(V);return FY(Y,V)}X("getOwnMetadataKeys",gY);function lY(Y,V,J){if(!T(V))throw TypeError();if(!R(J))J=P(J);if(!T(V))throw TypeError();if(!R(J))J=P(J);var $=m(V,J,!1);if(R($))return!1;return $.OrdinaryDeleteMetadata(Y,V,J)}X("deleteMetadata",lY);function sY(Y,V){for(var J=Y.length-1;J>=0;--J){var $=Y[J],W=$(V);if(!R(W)&&!k(W)){if(!RY(W))throw TypeError();V=W}}return V}function nY(Y,V,J,$){for(var W=Y.length-1;W>=0;--W){var j=Y[W],h=j(V,J,$);if(!R(h)&&!k(h)){if(!T(h))throw TypeError();$=h}}return $}function $Y(Y,V,J){var $=a(Y,V,J);if($)return!0;var W=e(V);if(!k(W))return $Y(Y,W,J);return!1}function a(Y,V,J){var $=m(V,J,!1);if(R($))return!1;return WY($.OrdinaryHasOwnMetadata(Y,V,J))}function QY(Y,V,J){var $=a(Y,V,J);if($)return BY(Y,V,J);var W=e(V);if(!k(W))return QY(Y,W,J);return}function BY(Y,V,J){var $=m(V,J,!1);if(R($))return;return $.OrdinaryGetOwnMetadata(Y,V,J)}function ZY(Y,V,J,$){var W=m(J,$,!0);W.OrdinaryDefineOwnMetadata(Y,V,J,$)}function zY(Y,V){var J=FY(Y,V),$=e(Y);if($===null)return J;var W=zY($,V);if(W.length<=0)return J;if(J.length<=0)return W;var j=new o,h=[];for(var _=0,B=J;_<B.length;_++){var Z=B[_],z=j.has(Z);if(!z)j.add(Z),h.push(Z)}for(var F=0,G=W;F<G.length;F++){var Z=G[F],z=j.has(Z);if(!z)j.add(Z),h.push(Z)}return h}function FY(Y,V){var J=m(Y,V,!1);if(!J)return[];return J.OrdinaryOwnMetadataKeys(Y,V)}function qY(Y){if(Y===null)return 1;switch(typeof Y){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return Y===null?1:6;default:return 6}}function R(Y){return Y===void 0}function k(Y){return Y===null}function dY(Y){return typeof Y==="symbol"}function T(Y){return typeof Y==="object"?Y!==null:typeof Y==="function"}function yY(Y,V){switch(qY(Y)){case 0:return Y;case 1:return Y;case 2:return Y;case 3:return Y;case 4:return Y;case 5:return Y}var J=V===3?"string":V===5?"number":"default",$=_Y(Y,L);if($!==void 0){var W=$.call(Y,J);if(T(W))throw TypeError();return W}return iY(Y,J==="default"?"number":J)}function iY(Y,V){if(V==="string"){var J=Y.toString;if(u(J)){var $=J.call(Y);if(!T($))return $}var W=Y.valueOf;if(u(W)){var $=W.call(Y);if(!T($))return $}}else{var W=Y.valueOf;if(u(W)){var $=W.call(Y);if(!T($))return $}var j=Y.toString;if(u(j)){var $=j.call(Y);if(!T($))return $}}throw TypeError()}function WY(Y){return!!Y}function pY(Y){return""+Y}function P(Y){var V=yY(Y,3);if(dY(V))return V;return pY(V)}function HY(Y){return Array.isArray?Array.isArray(Y):Y instanceof Object?Y instanceof Array:Object.prototype.toString.call(Y)==="[object Array]"}function u(Y){return typeof Y==="function"}function RY(Y){return typeof Y==="function"}function oY(Y){switch(qY(Y)){case 3:return!0;case 4:return!0;default:return!1}}function t(Y,V){return Y===V||Y!==Y&&V!==V}function _Y(Y,V){var J=Y[V];if(J===void 0||J===null)return;if(!u(J))throw TypeError();return J}function GY(Y){var V=_Y(Y,E);if(!u(V))throw TypeError();var J=V.call(Y);if(!T(J))throw TypeError();return J}function LY(Y){return Y.value}function DY(Y){var V=Y.next();return V.done?!1:V}function EY(Y){var V=Y.return;if(V)V.call(Y)}function e(Y){var V=Object.getPrototypeOf(Y);if(typeof Y!=="function"||Y===v)return V;if(V!==v)return V;var J=Y.prototype,$=J&&Object.getPrototypeOf(J);if($==null||$===Object.prototype)return V;var W=$.constructor;if(typeof W!=="function")return V;if(W===Y)return V;return W}function rY(){var Y;if(!R(K)&&typeof Q.Reflect<"u"&&!(K in Q.Reflect)&&typeof Q.Reflect.defineMetadata==="function")Y=eY(Q.Reflect);var V,J,$,W=new r,j={registerProvider:h,getProvider:B,setProvider:z};return j;function h(F){if(!Object.isExtensible(j))throw Error("Cannot add provider to a frozen registry.");switch(!0){case Y===F:break;case R(V):V=F;break;case V===F:break;case R(J):J=F;break;case J===F:break;default:if($===void 0)$=new o;$.add(F);break}}function _(F,G){if(!R(V)){if(V.isProviderFor(F,G))return V;if(!R(J)){if(J.isProviderFor(F,G))return V;if(!R($)){var S=GY($);while(!0){var w=DY(S);if(!w)return;var I=LY(w);if(I.isProviderFor(F,G))return EY(S),I}}}}if(!R(Y)&&Y.isProviderFor(F,G))return Y;return}function B(F,G){var S=W.get(F),w;if(!R(S))w=S.get(G);if(!R(w))return w;if(w=_(F,G),!R(w)){if(R(S))S=new c,W.set(F,S);S.set(G,w)}return w}function Z(F){if(R(F))throw TypeError();return V===F||J===F||!R($)&&$.has(F)}function z(F,G,S){if(!Z(S))throw Error("Metadata provider not registered.");var w=B(F,G);if(w!==S){if(!R(w))return!1;var I=W.get(F);if(R(I))I=new c,W.set(F,I);I.set(G,S)}return!0}}function aY(){var Y;if(!R(K)&&T(Q.Reflect)&&Object.isExtensible(Q.Reflect))Y=Q.Reflect[K];if(R(Y))Y=rY();if(!R(K)&&T(Q.Reflect)&&Object.isExtensible(Q.Reflect))Object.defineProperty(Q.Reflect,K,{enumerable:!1,configurable:!1,writable:!1,value:Y});return Y}function tY(Y){var V=new r,J={isProviderFor:function(Z,z){var F=V.get(Z);if(R(F))return!1;return F.has(z)},OrdinaryDefineOwnMetadata:h,OrdinaryHasOwnMetadata:W,OrdinaryGetOwnMetadata:j,OrdinaryOwnMetadataKeys:_,OrdinaryDeleteMetadata:B};return s.registerProvider(J),J;function $(Z,z,F){var G=V.get(Z),S=!1;if(R(G)){if(!F)return;G=new c,V.set(Z,G),S=!0}var w=G.get(z);if(R(w)){if(!F)return;if(w=new c,G.set(z,w),!Y.setProvider(Z,z,J)){if(G.delete(z),S)V.delete(Z);throw Error("Wrong provider for target.")}}return w}function W(Z,z,F){var G=$(z,F,!1);if(R(G))return!1;return WY(G.has(Z))}function j(Z,z,F){var G=$(z,F,!1);if(R(G))return;return G.get(Z)}function h(Z,z,F,G){var S=$(F,G,!0);S.set(Z,z)}function _(Z,z){var F=[],G=$(Z,z,!1);if(R(G))return F;var S=G.keys(),w=GY(S),I=0;while(!0){var SY=DY(w);if(!SY)return F.length=I,F;var JV=LY(SY);try{F[I]=JV}catch(XV){try{EY(w)}finally{throw XV}}I++}}function B(Z,z,F){var G=$(z,F,!1);if(R(G))return!1;if(!G.delete(Z))return!1;if(G.size===0){var S=V.get(z);if(!R(S)){if(S.delete(F),S.size===0)V.delete(S)}}return!0}}function eY(Y){var{defineMetadata:V,hasOwnMetadata:J,getOwnMetadata:$,getOwnMetadataKeys:W,deleteMetadata:j}=Y,h=new r,_={isProviderFor:function(B,Z){var z=h.get(B);if(!R(z)&&z.has(Z))return!0;if(W(B,Z).length){if(R(z))z=new o,h.set(B,z);return z.add(Z),!0}return!1},OrdinaryDefineOwnMetadata:V,OrdinaryHasOwnMetadata:J,OrdinaryGetOwnMetadata:$,OrdinaryOwnMetadataKeys:W,OrdinaryDeleteMetadata:j};return _}function m(Y,V,J){var $=s.getProvider(Y,V);if(!R($))return $;if(J){if(s.setProvider(Y,V,XY))return XY;throw Error("Illegal state.")}return}function YV(){var Y={},V=[],J=function(){function _(B,Z,z){this._index=0,this._keys=B,this._values=Z,this._selector=z}return _.prototype["@@iterator"]=function(){return this},_.prototype[E]=function(){return this},_.prototype.next=function(){var B=this._index;if(B>=0&&B<this._keys.length){var Z=this._selector(this._keys[B],this._values[B]);if(B+1>=this._keys.length)this._index=-1,this._keys=V,this._values=V;else this._index++;return{value:Z,done:!1}}return{value:void 0,done:!0}},_.prototype.throw=function(B){if(this._index>=0)this._index=-1,this._keys=V,this._values=V;throw B},_.prototype.return=function(B){if(this._index>=0)this._index=-1,this._keys=V,this._values=V;return{value:B,done:!0}},_}(),$=function(){function _(){this._keys=[],this._values=[],this._cacheKey=Y,this._cacheIndex=-2}return Object.defineProperty(_.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),_.prototype.has=function(B){return this._find(B,!1)>=0},_.prototype.get=function(B){var Z=this._find(B,!1);return Z>=0?this._values[Z]:void 0},_.prototype.set=function(B,Z){var z=this._find(B,!0);return this._values[z]=Z,this},_.prototype.delete=function(B){var Z=this._find(B,!1);if(Z>=0){var z=this._keys.length;for(var F=Z+1;F<z;F++)this._keys[F-1]=this._keys[F],this._values[F-1]=this._values[F];if(this._keys.length--,this._values.length--,t(B,this._cacheKey))this._cacheKey=Y,this._cacheIndex=-2;return!0}return!1},_.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=Y,this._cacheIndex=-2},_.prototype.keys=function(){return new J(this._keys,this._values,W)},_.prototype.values=function(){return new J(this._keys,this._values,j)},_.prototype.entries=function(){return new J(this._keys,this._values,h)},_.prototype["@@iterator"]=function(){return this.entries()},_.prototype[E]=function(){return this.entries()},_.prototype._find=function(B,Z){if(!t(this._cacheKey,B)){this._cacheIndex=-1;for(var z=0;z<this._keys.length;z++)if(t(this._keys[z],B)){this._cacheIndex=z;break}}if(this._cacheIndex<0&&Z)this._cacheIndex=this._keys.length,this._keys.push(B),this._values.push(void 0);return this._cacheIndex},_}();return $;function W(_,B){return _}function j(_,B){return B}function h(_,B){return[_,B]}}function VV(){var Y=function(){function V(){this._map=new c}return Object.defineProperty(V.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),V.prototype.has=function(J){return this._map.has(J)},V.prototype.add=function(J){return this._map.set(J,J),this},V.prototype.delete=function(J){return this._map.delete(J)},V.prototype.clear=function(){this._map.clear()},V.prototype.keys=function(){return this._map.keys()},V.prototype.values=function(){return this._map.keys()},V.prototype.entries=function(){return this._map.entries()},V.prototype["@@iterator"]=function(){return this.keys()},V.prototype[E]=function(){return this.keys()},V}();return Y}function AV(){var Y=16,V=b.create(),J=$();return function(){function B(){this._key=$()}return B.prototype.has=function(Z){var z=W(Z,!1);return z!==void 0?b.has(z,this._key):!1},B.prototype.get=function(Z){var z=W(Z,!1);return z!==void 0?b.get(z,this._key):void 0},B.prototype.set=function(Z,z){var F=W(Z,!0);return F[this._key]=z,this},B.prototype.delete=function(Z){var z=W(Z,!1);return z!==void 0?delete z[this._key]:!1},B.prototype.clear=function(){this._key=$()},B}();function $(){var B;do B="@@WeakMap@@"+_();while(b.has(V,B));return V[B]=!0,B}function W(B,Z){if(!q.call(B,J)){if(!Z)return;Object.defineProperty(B,J,{value:b.create()})}return B[J]}function j(B,Z){for(var z=0;z<Z;++z)B[z]=Math.random()*255|0;return B}function h(B){if(typeof Uint8Array==="function"){var Z=new Uint8Array(B);if(typeof crypto<"u")crypto.getRandomValues(Z);else if(typeof msCrypto<"u")msCrypto.getRandomValues(Z);else j(Z,B);return Z}return j(Array(B),B)}function _(){var B=h(Y);B[6]=B[6]&79|64,B[8]=B[8]&191|128;var Z="";for(var z=0;z<Y;++z){var F=B[z];if(z===4||z===6||z===8)Z+="-";if(F<16)Z+="0";Z+=F.toString(16).toLowerCase()}return Z}}function YY(Y){return Y.__=void 0,delete Y.__,Y}})})(xY||(xY={}))});import{Buffer as TY}from"node:buffer";var f=Symbol("attachment:loaded"),EV=Symbol("attachment:options"),g=Symbol("attachment:file"),M=Symbol("attachment:disk"),n=Symbol("attachment:fn:process"),l=Symbol("attachment:fn:load"),d=Symbol("attachment:fn:save");class N{[f]=!1;[g];[M];data;constructor(A){if(A instanceof File)this[g]=A;else this[f]=!0,this.data=A}#Y(){if(!this[f])throw Error("Attachment is not processed, please flush the entity first.")}get#A(){return this.#Y(),this[M]}[d](){return this.data??{}}static[l](A){return new N(A)}[n](A){if(this[f])return;this.data=A,this[f]=!0}static fromFile(A){return new N(A)}static async fromUrl(A){let X=await fetch(A),Q=await X.arrayBuffer(),q,H=X.headers.get("content-disposition");if(H){let D=H.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/i);if(D)q=D[1].replace(/['"]/g,"")}if(!q)q=A.split("?")[0].split("/").pop()||"download";let L=TY.from(Q),E=new File([L],q,{type:X.headers.get("content-type")??""});return new N(E)}#V(A){this.#Y();let X=this.data?.variants.find((Q)=>Q.name===A)??null;if(!X)throw Error(`Attachment: Variant '${A}' not found`);return X}url(A){if(this.#Y(),A)return this.#A?.getUrl(this.#V(A).path);return this.data?.url}originalName(){return this.data?.originalName??""}size(A){if(A)return this.#V(A).size;return this.data?.size}meta(A){if(A)return this.#V(A).meta;return this.data?.meta}preSignedUrl(A,X){if(this.#Y(),typeof A==="string")return this.#A?.getSignedUrl(this.#V(A).path,X);return this.#A?.getSignedUrl(this.data?.path??"",X)}blurhash(){return this.#Y(),this.data?.blurhash}getDisk(){return this.#A}getDrive(){return this.data?.drive??""}async getBytes(A){this.#Y();let X=A?this.#V(A).path:this.data?.path??"";return this.#A?.getBytes(X)}async getBuffer(A){this.#Y();let X=await this.getBytes(A);if(!X)return null;return TY.from(X)}async getStream(A){this.#Y();let X=A?this.#V(A).path:this.data?.path??"";return this.#A?.getStream(X)}getMimeType(A){return this.#Y(),(A?this.#V(A):this.data)?.mimeType??""}toJSON(){return{url:this.url(),blurhash:this.blurhash()}}}import{Disk as DV}from"flydrive";import{join as $V}from"node:path";import{fileTypeFromBuffer as QV}from"file-type";import{v7 as BV}from"uuid";class VY{att;file;disk;buffer;modelOptions;config;entity;columnName;diskName;fileInfo;constructor(A,X){this.att=A;let{disk:Q,options:q,config:H,entity:L,columnName:E,diskName:x}=X;if(this.disk=Q,this.modelOptions=q,this.config=H,this.entity=L,this.columnName=E,this.diskName=x,A[f])throw Error("Attachment already processed, please use the Attachment.fromFile method to create a new attachment");this.file=this.att[g]}done(A){this.att[n](A)}generateKey(A,...X){let Q=this.modelOptions.folder??"";return Q=Q.replace(/:([A-Za-z0-9_]+)/g,(q,H)=>{let L=this.entity[H];if(L===void 0||L===null)throw Error(`Missing value for Attachment path "${H}" 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(L))}),$V(Q,A,...X)}normalizeFileName(A){return encodeURIComponent(A.replace(/[^a-zA-Z0-9.-]/g,"_")).toLowerCase()}async fileToBuffer(){if(this.buffer)return this.buffer;let A=await this.file.arrayBuffer(),X=Buffer.from(A);return this.buffer=X,X}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(BV())}async getFileType(){return QV(await this.fileToBuffer())}async analyseFile(){let A=await this.getFileType();this.fileInfo={extname:A?.ext??this.file.name.split(".").pop()??"",mimeType:A?.mime??this.file.type,size:this.file.size}}async uploadFile(A,X){await this.disk.put(A,X)}async pickConverter(A,X){if(!this.fileInfo)throw Error("Attachment Converter: File info not found");if(this.config.variants?.[A])X=this.config.variants[A];if(X instanceof jY){if(await X.supports({size:this.fileInfo.size,mimeType:this.fileInfo.mimeType,buffer:await this.fileToBuffer(),extname:this.fileInfo.extname}))return X}return null}async process(){await this.analyseFile();let A=await this.fileToBuffer(),X=this.getFileName(),Q=this.fileInfo?.extname??"",q=this.generateKey(X,`${X}.${Q}`);await this.uploadFile(q,A);let H={name:X,extname:Q,size:this.file.size,drive:this.diskName,mimeType:this.file.type,path:q,url:await this.disk.getUrl(q),originalName:this.file.name,variants:[]},L=await this.config.metadata?.metadata({buffer:A,size:this.fileInfo?.size??0,mimeType:this.fileInfo?.mimeType??"",extname:this.fileInfo?.extname??""});if(H.meta=L,this.modelOptions.variants)for(let[E,x]of Object.entries(this.modelOptions.variants)){let D=await this.pickConverter(E,x);if(!D)throw Error(`Attachment Converter: No converter for the variant ${E} found`);let U=await D.handle({buffer:A,size:this.fileInfo?.size??0,mimeType:this.fileInfo?.mimeType??"",extname:this.fileInfo?.extname??"",variantName:E,variant:x}),b=this.generateKey(q.split("/").pop().split(".").shift(),`${E}.${U.extname}`);await this.uploadFile(b,U.buffer),H.variants.push({name:E,extname:U.extname,size:U.buffer.length,mimeType:U.mimeType,path:b})}if(this.fileInfo?.mimeType.startsWith("image/")){if(typeof this.modelOptions.blurhash==="boolean"?this.modelOptions.blurhash:this.modelOptions.blurhash?.enabled)H.blurhash=await wY(A,typeof this.modelOptions.blurhash==="object"?this.modelOptions.blurhash:void 0)}this.done(H)}}import{ReferenceKind as vV}from"@mikro-orm/core";import{EntityManager as fV,EntityRepository as OV,MetadataError as ZV,MetadataStorage as y,MikroORM as KV,Utils as kV}from"@mikro-orm/core";function O(A,X,Q){if(A.properties[X]&&A.properties[X].kind!==Q)throw ZV.multipleDecorators(A.className,X)}function zV(A,X){X=X||Error().stack.split(`
15
+ `);let Q=X.findIndex((q)=>/__decorate|Reflect\.decorate|_applyDecoratedDescriptor|applyClassDecs/.exec(q));if(Q===-1){let q=X.findLastIndex((H)=>H.includes("bun:wrap"));if(q!==-1&&q+1<X.length)Q=q+1;else{let H=X.findLastIndex((L)=>L.replace(/\\/g,"/").includes("node_modules/reflect-metadata/Reflect.js"));if(H===-1||H+2>=X.length||!X[H+1].includes("bun:wrap"))return A;Q=H+2}}if(X[Q].includes("Reflect.decorate"))Q++;while(Q<X.length&&/node_modules\/tslib\/|@oxc-project[/+]runtime/.test(X[Q].replace(/\\/g,"/")))Q++;try{let q=/\(.+\)/i.exec(X[Q])?/\((.*?)(?::\d+){1,2}\)/:/at\s*(.*?)(?::\d+){1,2}$/;return X[Q].match(q)[1]}catch{return A}}function C(A){if(!Object.hasOwn(A,y.PATH_SYMBOL))Object.defineProperty(A,y.PATH_SYMBOL,{value:zV(A.name),writable:!0});return y.getMetadata(A.name,A[y.PATH_SYMBOL])}import{Utils as lV}from"@mikro-orm/core";import{ReferenceKind as yV}from"@mikro-orm/core";import{ReferenceKind as rV}from"@mikro-orm/core";import{ReferenceKind as YA}from"@mikro-orm/core";import{ReferenceKind as XA}from"@mikro-orm/core";import{Utils as FV,ReferenceKind as hY}from"@mikro-orm/core";function CY(A={}){return function(X,Q){let q=C(X.constructor),H=Object.getOwnPropertyDescriptor(X,Q)||{};O(q,Q,hY.SCALAR);let L=A.name||Q;if(Q!==L&&!(H.value instanceof Function))FV.renameKey(A,"name","fieldName");A.name=Q;let{check:E,...x}=A,D={kind:hY.SCALAR,...x};if(D.getter=!!H.get,D.setter=!!H.set,H.value instanceof Function)D.getter=!0,D.persist=!1,D.type="method",D.getterName=Q,D.name=L;if(E)q.checks.push({property:D.name,expression:E});q.properties[D.name]=D}}import{ReferenceKind as HA}from"@mikro-orm/core";import{ReferenceKind as LA}from"@mikro-orm/core";import{ReferenceKind as CA,Utils as xA}from"@mikro-orm/core";import{RequestContext as fA,TransactionContext as OA}from"@mikro-orm/core";import{EventType as MA}from"@mikro-orm/core";import{TransactionPropagation as gA,RequestContext as lA,TransactionContext as sA}from"@mikro-orm/core";var pA=HV(UY(),1);import{EntitySchema as rA,MetadataProvider as aA,ReferenceKind as tA,Utils as eA}from"@mikro-orm/core";import{Type as RV,ValidationError as _V}from"@mikro-orm/core";class i extends RV{options={folder:"attachments",blurhash:!0};constructor(A){super();this.options={...this.options,...A}}convertToDatabaseValue(A){if(A===null)return null;if(A instanceof N)return A[d]();return A}convertToJSValue(A){try{return N[l](JSON.parse(A))}catch(X){try{return N[l](A)}catch(Q){throw _V.invalidType(i,A,"database")}}}getColumnType(){return"json"}}var NY={blurhash:!0},bY={rename:!0},IY=["accessor","comment","customOrder","getter","getterName","hidden","index","lazy","name","nullable","serializedName","serializedPrimaryKey","serializer","version"];var p=Symbol("attachment:props");function GV(A={}){return(X,Q)=>{let{mikro:q,attachment:H}=LV(A,IY);H={...NY,...H};let L=X.constructor;if(!L[p])L[p]={};return L[p][Q]=H,CY({...q,type:new i(H)})(X,Q)}}function PY(A){return GV(A)}function JY(A){let Q=A.constructor[p];return Q?Q:{}}function LV(A,X){let Q=new Set(X),q={},H={};for(let L in A)if(Q.has(L))q[L]=A[L];else H[L]=A[L];return{mikro:q,attachment:H}}class fY{options;disks;constructor(A){this.options=A;this.options={...bY,...this.options},this.disks=new Map(Object.entries(this.options.drivers).map(([X,Q])=>[X,new DV(Q)]))}async onLoad(A){let{entity:X}=A,Q=JY(X);for(let q of Object.keys(Q)){let H=X[q],L=Q[q];if(H instanceof N){let E=this.#Y(L,H.getDrive(),!1);if(!E)continue;H[M]=E}}}#Y(A,X,Q){let q=this.disks.get(X??A.driver??this.options.defaultDriver);if(X&&!q)q=this.disks.get(A.driver??this.options.defaultDriver);if(!q){if(Q)throw Error(`Unknown attachment driver "${String(X??A.driver??this.options.defaultDriver)}"`);return null}return q}async beforeFlush(A){let{uow:X}=A,Q=new Set([...X.getChangeSets().map((q)=>q.entity),...X.getPersistStack()]);for(let q of Q)await this.#A(q)}async#A(A){let X=JY(A);for(let Q of Object.keys(X)){let q=A[Q],H=X[Q];if(q instanceof N){if(q[f])continue;let L=this.#Y(H);if(!L)continue;q[M]=L;let E=this.#V(H.variants),x=new VY(q,{disk:L,options:{...H,variants:E},config:this.options,entity:A,columnName:Q,diskName:H.driver??this.options.defaultDriver});try{await x.process()}catch(D){throw console.error(D),Error("Failed to process attachment")}}}}AttachmentDecorator(A){return PY(A)}#V(A){if(!A)return;if(Array.isArray(A)){let X={};for(let Q of A)if(typeof Q==="string"){let q=this.options.variants?.[Q];if(!q)throw Error(`Unknown attachment variant "${Q}"`);X[Q]=q}else if(Q&&typeof Q==="object")Object.assign(X,Q);return X}if(A&&typeof A==="object")return A;return}}export{fY as AttachmentSubscriber,N as Attachment};
@@ -0,0 +1,25 @@
1
+ declare abstract class BaseMetadata<TMetadata> {
2
+ abstract metadata(input: ConvertInput): Promise<TMetadata>;
3
+ }
4
+ type VariantSpec = BaseConverter<ConvertInput, ConvertOutput>;
5
+ interface ConvertInput {
6
+ buffer: Buffer;
7
+ size: number;
8
+ mimeType: string;
9
+ variantName?: string;
10
+ variant?: VariantSpec;
11
+ extname: string;
12
+ }
13
+ interface ConvertOutput {
14
+ buffer: Buffer;
15
+ mimeType: string;
16
+ extname: string;
17
+ }
18
+ declare abstract class BaseConverter<
19
+ TInput extends ConvertInput,
20
+ TOutput extends ConvertOutput
21
+ > {
22
+ abstract supports(input: TInput): Promise<boolean>;
23
+ abstract handle(input: TInput): Promise<TOutput>;
24
+ }
25
+ export { BaseMetadata };
@@ -0,0 +1 @@
1
+ import{d as a}from"../shared/chunk-wrbx2tbm.js";import"../shared/chunk-v2cxb1jc.js";export{a as BaseMetadata};
@@ -0,0 +1,28 @@
1
+ declare abstract class BaseMetadata<TMetadata> {
2
+ abstract metadata(input: ConvertInput): Promise<TMetadata>;
3
+ }
4
+ type VariantSpec = BaseConverter<ConvertInput, ConvertOutput>;
5
+ interface ConvertInput {
6
+ buffer: Buffer;
7
+ size: number;
8
+ mimeType: string;
9
+ variantName?: string;
10
+ variant?: VariantSpec;
11
+ extname: string;
12
+ }
13
+ interface ConvertOutput {
14
+ buffer: Buffer;
15
+ mimeType: string;
16
+ extname: string;
17
+ }
18
+ declare abstract class BaseConverter<
19
+ TInput extends ConvertInput,
20
+ TOutput extends ConvertOutput
21
+ > {
22
+ abstract supports(input: TInput): Promise<boolean>;
23
+ abstract handle(input: TInput): Promise<TOutput>;
24
+ }
25
+ declare class ImgkitMetadata<T extends exports_index_d.ImageMetadata> extends BaseMetadata<T> {
26
+ metadata(input: ConvertInput): Promise<T>;
27
+ }
28
+ export { ImgkitMetadata };
@@ -0,0 +1 @@
1
+ import{b as t}from"../shared/chunk-tgvybtjr.js";import{d as a}from"../shared/chunk-wrbx2tbm.js";import"../shared/chunk-v2cxb1jc.js";class m extends a{async metadata(e){return await(await t("imgkit")).metadata(e.buffer)}}export{m as ImgkitMetadata};
@@ -0,0 +1 @@
1
+ import"../shared/chunk-tgvybtjr.js";import"../shared/chunk-wrbx2tbm.js";import"../shared/chunk-v2cxb1jc.js";
@@ -0,0 +1,2 @@
1
+ class t{}
2
+ export{t as a};
@@ -0,0 +1,2 @@
1
+ import{createRequire as l}from"module";import{encode as h}from"blurhash";var m=l(import.meta.url);async function f(t){try{let r=await import(t);if(r.default)return r.default;return r}catch(r){throw Error(`Module ${t} not found, please install it first.`)}}function w(t,r){let{componentX:n,componentY:a}=r??{enabled:!0,componentX:4,componentY:4};return new Promise(async(i,s)=>{try{let e=await f("sharp"),{data:u,info:o}=await e(t).raw().ensureAlpha().toBuffer({resolveWithObject:!0}),c=h(new Uint8ClampedArray(u),o.width,o.height,n,a);return i(c)}catch(e){return s(e)}})}
2
+ export{f as b,w as c};
@@ -0,0 +1,2 @@
1
+ import{createRequire as t}from"node:module";var j=Object.create;var{getPrototypeOf:k,defineProperty:i,getOwnPropertyNames:l}=Object;var m=Object.prototype.hasOwnProperty;function n(a){return this[a]}var o,p,q=(a,b,d)=>{var f=a!=null&&typeof a==="object";if(f){var g=b?o??=new WeakMap:p??=new WeakMap,h=g.get(a);if(h)return h}d=a!=null?j(k(a)):{};let c=b||!a||!a.__esModule?i(d,"default",{value:a,enumerable:!0}):d;for(let e of l(a))if(!m.call(c,e))i(c,e,{get:n.bind(a,e),enumerable:!0});if(f)g.set(a,c);return c};var r=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);
2
+ export{q as e,r as f};
@@ -0,0 +1,2 @@
1
+ class t{}
2
+ export{t as d};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mikro-orm-attachments",
3
3
  "description": "Attachment handling for MikroORM with support for image processing, variants, and multiple storage drivers",
4
- "version": "1.3.2",
4
+ "version": "2.1.0",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -17,6 +17,36 @@
17
17
  "default": "./dist/index.js"
18
18
  }
19
19
  },
20
+ "./converters/SharpConverter": {
21
+ "import": {
22
+ "types": "./dist/converters/SharpConverter.d.ts",
23
+ "default": "./dist/converters/SharpConverter.js"
24
+ }
25
+ },
26
+ "./converters/BaseConverter": {
27
+ "import": "./dist/converters/BaseConverter.js"
28
+ },
29
+ "./converters/ImgkitConverter": {
30
+ "import": {
31
+ "types": "./dist/converters/ImgkitConverter.d.ts",
32
+ "default": "./dist/converters/ImgkitConverter.js"
33
+ }
34
+ },
35
+ "./metadata/ImgkitMetadata": {
36
+ "import": {
37
+ "types": "./dist/metadata/ImgkitMetadata.d.ts",
38
+ "default": "./dist/metadata/ImgkitMetadata.js"
39
+ }
40
+ },
41
+ "./metadata/BaseMetadata": {
42
+ "import": {
43
+ "types": "./dist/metadata/BaseMetadata.d.ts",
44
+ "default": "./dist/metadata/BaseMetadata.js"
45
+ }
46
+ },
47
+ "./metadata/SharpMetadata": {
48
+ "import": "./dist/metadata/SharpMetadata.js"
49
+ },
20
50
  "./package.json": "./package.json"
21
51
  },
22
52
  "scripts": {
@@ -43,24 +73,25 @@
43
73
  "url": "https://github.com/reptoxx/mikro-orm-attachments"
44
74
  },
45
75
  "optionalDependencies": {
46
- "@mikro-orm/decorators": "^7.0.0 || ^7.0.0-rc.1 || ^7.0.0-rc.2"
76
+ "@mikro-orm/decorators": "^7.0.9"
47
77
  },
48
78
  "peerDependencies": {
49
- "@mikro-orm/core": "^6.6.3 || ^7.0.0 || ^7.0.0-rc.1 || ^7.0.0-rc.2",
79
+ "@mikro-orm/core": "^7.0.9",
50
80
  "sharp": "^0.34.5",
51
81
  "blurhash": "^2.0.5",
52
- "flydrive": "^1.3.0"
82
+ "flydrive": "^2.1.0"
53
83
  },
54
84
  "devDependencies": {
55
- "@mikro-orm/core": "^6.6.3",
56
- "@typescript/native-preview": "^7.0.0-dev.20260224.1",
57
- "bun-types": "latest",
58
- "bunup": "^0.16.29",
85
+ "@mikro-orm/core": "^7.0.9",
86
+ "@typescript/native-preview": "^7.0.0-dev.20260407.1",
87
+ "bun-types": "1.3.11",
88
+ "bunup": "^0.16.31",
89
+ "imgkit": "^2.2.1",
59
90
  "standard-version": "^9.5.0",
60
- "typescript": "^5.0.0"
91
+ "typescript": "^6.0.2"
61
92
  },
62
93
  "dependencies": {
63
- "file-type": "^21.3.0",
94
+ "file-type": "^21.3.4",
64
95
  "uuid": "^13.0.0"
65
96
  },
66
97
  "engines": {