@uploadista/flow-images-sharp 0.1.4-beta.1 → 1.0.0-beta.2
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/dist/index.cjs +1 -1
- package/package.json +6 -6
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:stream`),l=require(`@uploadista/core/errors`),u=require(`@uploadista/core/flow`),d=require(`@uploadista/observability`),f=require(`effect`),p=require(`sharp`);p=s(p);const m=e=>{switch(e){case`fill`:return`cover`;case`contain`:return`contain`}},h=(e,t,n,r,i,a=0,o=0)=>{let s=0,c=0;switch(e){case`top-left`:s=o,c=a;break;case`top-right`:s=o,c=t-r-a;break;case`bottom-left`:s=n-i-o,c=a;break;case`bottom-right`:s=n-i-o,c=t-r-a;break;case`center`:s=Math.floor((n-i)/2)+o,c=Math.floor((t-r)/2)+a;break}return{top:s,left:c}},g=()=>f.Layer.succeed(u.ImagePlugin,u.ImagePlugin.of({optimize:(e,{quality:t,format:n})=>f.Effect.gen(function*(){let r=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).toFormat(n,{quality:t}).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{cause:e})});return new Uint8Array(r)}).pipe((0,d.withOperationSpan)(`image`,`optimize`,{"image.format":n,"image.quality":t,"image.input_size":e.byteLength})),resize:(e,{width:t,height:n,fit:r})=>f.Effect.gen(function*(){if(!t&&!n)throw Error(`Either width or height must be specified for resize`);let i=m(r),a=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).resize(t,n,{fit:i}).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{cause:e})});return new Uint8Array(a)}).pipe((0,d.withOperationSpan)(`image`,`resize`,{"image.width":t,"image.height":n,"image.fit":r,"image.input_size":e.byteLength})),transform:(e,t)=>f.Effect.gen(function*(){let n=(0,p.default)(e);switch(t.type){case`resize`:{let e=m(t.fit);n=n.resize(t.width,t.height,{fit:e});break}case`blur`:n=n.blur(t.sigma);break;case`rotate`:{let e=t.background?{background:t.background}:void 0;n=n.rotate(t.angle,e);break}case`flip`:n=t.direction===`horizontal`?n.flop():n.flip();break;case`grayscale`:n=n.grayscale();break;case`sepia`:n=n.tint({r:112,g:66,b:20});break;case`brightness`:{let e=1+t.value/100;n=n.modulate({brightness:e});break}case`contrast`:{let e=1+t.value/100;n=n.linear(e,0);break}case`sharpen`:n=t.sigma===void 0?n.sharpen():n.sharpen({sigma:t.sigma});break;case`watermark`:{let e=yield*f.Effect.tryPromise({try:async()=>{let e=await fetch(t.imagePath);if(!e.ok)throw Error(`Failed to fetch watermark: ${e.statusText}`);let n=await e.arrayBuffer();return Buffer.from(n)},catch:e=>l.UploadistaError.fromCode(`FILE_NOT_FOUND`,{body:`Watermark image not found or failed to fetch: ${t.imagePath}`,cause:e})}).pipe((0,d.withOperationSpan)(`image`,`fetch-watermark`,{"image.watermark_url":t.imagePath})),r=yield*f.Effect.tryPromise({try:async()=>await n.metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read image metadata`,cause:e})}),i=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read watermark metadata`,cause:e})});if(!r.width||!r.height||!i.width||!i.height)return yield*f.Effect.fail(l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Could not determine image or watermark dimensions`}));let{top:a,left:o}=h(t.position,r.width,r.height,i.width,i.height,t.offsetX,t.offsetY),s=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).composite([{input:Buffer.from([255,255,255,Math.round(t.opacity*255)]),raw:{width:1,height:1,channels:4},tile:!0,blend:`dest-in`}]).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to apply watermark opacity`,cause:e})});n=n.composite([{input:s,top:a,left:o}]);break}case`logo`:{let e=yield*f.Effect.tryPromise({try:async()=>{let e=await fetch(t.imagePath);if(!e.ok)throw Error(`Failed to fetch logo: ${e.statusText}`);let n=await e.arrayBuffer();return Buffer.from(n)},catch:e=>l.UploadistaError.fromCode(`FILE_NOT_FOUND`,{body:`Logo image not found or failed to fetch: ${t.imagePath}`,cause:e})}).pipe((0,d.withOperationSpan)(`image`,`fetch-logo`,{"image.logo_url":t.imagePath})),r=yield*f.Effect.tryPromise({try:async()=>await n.metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read image metadata`,cause:e})}),i=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read logo metadata`,cause:e})});if(!r.width||!r.height||!i.width||!i.height)return yield*f.Effect.fail(l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Could not determine image or logo dimensions`}));let a=Math.round(i.width*t.scale),o=Math.round(i.height*t.scale),s=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).resize(a,o).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to scale logo`,cause:e})}),{top:c,left:u}=h(t.position,r.width,r.height,a,o,t.offsetX,t.offsetY);n=n.composite([{input:s,top:c,left:u}]);break}case`text`:{let e=yield*f.Effect.tryPromise({try:async()=>await n.metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read image metadata`,cause:e})});if(!e.width||!e.height)return yield*f.Effect.fail(l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Could not determine image dimensions`}));let r=t.fontFamily||`sans-serif`,i=t.text.length*t.fontSize*.6,a=t.fontSize,{top:o,left:s}=h(t.position,e.width,e.height,i,a,t.offsetX,t.offsetY),c=`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:stream`),l=require(`@uploadista/core/errors`),u=require(`@uploadista/core/flow`),d=require(`@uploadista/observability`),f=require(`effect`),p=require(`sharp`);p=s(p);const m=e=>{switch(e){case`fill`:return`cover`;case`contain`:return`contain`}},h=(e,t,n,r,i,a=0,o=0)=>{let s=0,c=0;switch(e){case`top-left`:s=o,c=a;break;case`top-right`:s=o,c=t-r-a;break;case`bottom-left`:s=n-i-o,c=a;break;case`bottom-right`:s=n-i-o,c=t-r-a;break;case`center`:s=Math.floor((n-i)/2)+o,c=Math.floor((t-r)/2)+a;break}return{top:s,left:c}},g=()=>f.Layer.succeed(u.ImagePlugin,u.ImagePlugin.of({optimize:(e,{quality:t,format:n})=>f.Effect.gen(function*(){let r=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).toFormat(n,{quality:t}).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{cause:e})});return new Uint8Array(r)}).pipe((0,d.withOperationSpan)(`image`,`optimize`,{"image.format":n,"image.quality":t,"image.input_size":e.byteLength})),resize:(e,{width:t,height:n,fit:r})=>f.Effect.gen(function*(){if(!t&&!n)throw Error(`Either width or height must be specified for resize`);let i=m(r),a=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).resize(t,n,{fit:i}).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{cause:e})});return new Uint8Array(a)}).pipe((0,d.withOperationSpan)(`image`,`resize`,{"image.width":t,"image.height":n,"image.fit":r,"image.input_size":e.byteLength})),transform:(e,t)=>f.Effect.gen(function*(){let n=(0,p.default)(e);switch(t.type){case`resize`:{let e=m(t.fit);n=n.resize(t.width,t.height,{fit:e});break}case`blur`:n=n.blur(t.sigma);break;case`rotate`:{let e=t.background?{background:t.background}:void 0;n=n.rotate(t.angle,e);break}case`flip`:n=t.direction===`horizontal`?n.flop():n.flip();break;case`grayscale`:n=n.grayscale();break;case`sepia`:n=n.tint({r:112,g:66,b:20});break;case`brightness`:{let e=1+t.value/100;n=n.modulate({brightness:e});break}case`contrast`:{let e=1+t.value/100;n=n.linear(e,0);break}case`sharpen`:n=t.sigma===void 0?n.sharpen():n.sharpen({sigma:t.sigma});break;case`watermark`:{let e=yield*f.Effect.tryPromise({try:async()=>{let e=await fetch(t.imagePath);if(!e.ok)throw Error(`Failed to fetch watermark: ${e.statusText}`);let n=await e.arrayBuffer();return Buffer.from(n)},catch:e=>l.UploadistaError.fromCode(`FILE_NOT_FOUND`,{body:`Watermark image not found or failed to fetch: ${t.imagePath}`,cause:e})}).pipe((0,d.withOperationSpan)(`image`,`fetch-watermark`,{"image.watermark_url":t.imagePath})),r=yield*f.Effect.tryPromise({try:async()=>await n.metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read image metadata`,cause:e})}),i=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read watermark metadata`,cause:e})});if(!r.width||!r.height||!i.width||!i.height)return yield*f.Effect.fail(l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Could not determine image or watermark dimensions`}));let{top:a,left:o}=h(t.position,r.width,r.height,i.width,i.height,t.offsetX,t.offsetY),s=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).composite([{input:Buffer.from([255,255,255,Math.round(t.opacity*255)]),raw:{width:1,height:1,channels:4},tile:!0,blend:`dest-in`}]).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to apply watermark opacity`,cause:e})});n=n.composite([{input:s,top:a,left:o}]);break}case`logo`:{let e=yield*f.Effect.tryPromise({try:async()=>{let e=await fetch(t.imagePath);if(!e.ok)throw Error(`Failed to fetch logo: ${e.statusText}`);let n=await e.arrayBuffer();return Buffer.from(n)},catch:e=>l.UploadistaError.fromCode(`FILE_NOT_FOUND`,{body:`Logo image not found or failed to fetch: ${t.imagePath}`,cause:e})}).pipe((0,d.withOperationSpan)(`image`,`fetch-logo`,{"image.logo_url":t.imagePath})),r=yield*f.Effect.tryPromise({try:async()=>await n.metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read image metadata`,cause:e})}),i=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read logo metadata`,cause:e})});if(!r.width||!r.height||!i.width||!i.height)return yield*f.Effect.fail(l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Could not determine image or logo dimensions`}));let a=Math.round(i.width*t.scale),o=Math.round(i.height*t.scale),s=yield*f.Effect.tryPromise({try:async()=>await(0,p.default)(e).resize(a,o).toBuffer(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to scale logo`,cause:e})}),{top:c,left:u}=h(t.position,r.width,r.height,a,o,t.offsetX,t.offsetY);n=n.composite([{input:s,top:c,left:u}]);break}case`text`:{let e=yield*f.Effect.tryPromise({try:async()=>await n.metadata(),catch:e=>l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Failed to read image metadata`,cause:e})});if(!e.width||!e.height)return yield*f.Effect.fail(l.UploadistaError.fromCode(`UNKNOWN_ERROR`,{body:`Could not determine image dimensions`}));let r=t.fontFamily||`sans-serif`,i=t.text.length*t.fontSize*.6,a=t.fontSize,{top:o,left:s}=h(t.position,e.width,e.height,i,a,t.offsetX,t.offsetY),c=`
|
|
2
2
|
<svg width="${e.width}" height="${e.height}">
|
|
3
3
|
<text
|
|
4
4
|
x="${s}"
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uploadista/flow-images-sharp",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "1.0.0-beta.2",
|
|
5
5
|
"description": "Sharp image processing service for Uploadista Flow",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Uploadista",
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"sharp": "0.34.5",
|
|
18
18
|
"tinycolor2": "1.6.0",
|
|
19
|
-
"@uploadista/core": "0.
|
|
20
|
-
"@uploadista/observability": "0.
|
|
19
|
+
"@uploadista/core": "1.0.0-beta.2",
|
|
20
|
+
"@uploadista/observability": "1.0.0-beta.2"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"effect": "^3.0.0",
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
"@effect/vitest": "0.27.0",
|
|
28
28
|
"@types/node": "24.10.9",
|
|
29
29
|
"@types/tinycolor2": "1.4.6",
|
|
30
|
-
"effect": "3.19.
|
|
31
|
-
"tsdown": "0.20.
|
|
30
|
+
"effect": "3.19.19",
|
|
31
|
+
"tsdown": "0.20.3",
|
|
32
32
|
"vitest": "4.0.18",
|
|
33
33
|
"zod": "4.3.6",
|
|
34
|
-
"@uploadista/typescript-config": "0.
|
|
34
|
+
"@uploadista/typescript-config": "1.0.0-beta.2"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "tsc --noEmit && tsdown",
|