mikro-orm-attachments 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/Attachment.d.ts +13 -5
- package/dist/Attachment.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
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.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
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* attachment from url ([3cb835f](https://github.com/reptoxx/mikro-orm-attachments/commit/3cb835f660a98f027e0d677145a4285feae0b101))
|
|
11
|
+
|
|
12
|
+
## [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)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* made Attachment generic ([42413f7](https://github.com/reptoxx/mikro-orm-attachments/commit/42413f7875ba06d5753e41bcf9d47dae43d35fc2))
|
|
18
|
+
|
|
5
19
|
## 1.0.0 (2026-01-24)
|
|
6
20
|
|
|
7
21
|
|
package/dist/Attachment.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Disk } from "flydrive";
|
|
|
2
2
|
import { ATTACHMENT_DISK, ATTACHMENT_FILE, ATTACHMENT_FN_LOAD, ATTACHMENT_FN_PROCESS, ATTACHMENT_FN_SAVE, ATTACHMENT_LOADED } from "./symbols";
|
|
3
3
|
import { AttachmentBase } from "./typings";
|
|
4
4
|
import { SignedURLOptions } from "flydrive/types";
|
|
5
|
-
export declare class Attachment {
|
|
5
|
+
export declare class Attachment<Variants extends string = string> {
|
|
6
6
|
#private;
|
|
7
7
|
[ATTACHMENT_LOADED]: boolean;
|
|
8
8
|
[ATTACHMENT_FILE]?: File;
|
|
@@ -13,15 +13,23 @@ export declare class Attachment {
|
|
|
13
13
|
static [ATTACHMENT_FN_LOAD](value: AttachmentBase): Attachment;
|
|
14
14
|
[ATTACHMENT_FN_PROCESS](data: AttachmentBase): void;
|
|
15
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>;
|
|
16
24
|
url(variant?: string): string | Promise<string>;
|
|
17
25
|
preSignedUrl(variantNameOrOptions?: string | SignedURLOptions, signedUrlOptions?: SignedURLOptions): Promise<string>;
|
|
18
26
|
blurhash(): string | undefined;
|
|
19
27
|
getDisk(): Disk;
|
|
20
28
|
getDrive(): string;
|
|
21
|
-
getBytes(variantName?:
|
|
22
|
-
getBuffer(variantName?:
|
|
23
|
-
getStream(variantName?:
|
|
24
|
-
getMimeType(variantName?:
|
|
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;
|
|
25
33
|
toJSON(): {
|
|
26
34
|
url: string | Promise<string>;
|
|
27
35
|
blurhash: string | undefined;
|
package/dist/Attachment.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;;
|
|
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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Disk as
|
|
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
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=D6CAA0FA0CC1E84D64756E2164756E21
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
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
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 {\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#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?:
|
|
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
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
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
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",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
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
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
14
|
],
|
|
15
|
-
"mappings": "AACA,eAAS,iBCDF,IAAM,EAAoB,OAAO,mBAAmB,EAC9C,EAAqB,OAAO,oBAAoB,EAChD,EAAkB,OAAO,iBAAiB,EAC1C,EAAkB,OAAO,iBAAiB,EAC1C,EAAwB,OAAO,uBAAuB,EACtD,EAAqB,OAAO,oBAAoB,EAChD,EAAqB,OAAO,oBAAoB,ECOtD,MAAM,
|
|
16
|
-
"debugId": "
|
|
15
|
+
"mappings": "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",
|
|
16
|
+
"debugId": "D6CAA0FA0CC1E84D64756E2164756E21",
|
|
17
17
|
"names": []
|
|
18
18
|
}
|
package/package.json
CHANGED