@tc-libs/file-handler 5.3.1 → 5.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tc-libs/file-handler",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.1",
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"@tc-libs/app-cache": "5.
|
|
6
|
-
"@tc-libs/constant": "5.
|
|
7
|
-
"@tc-libs/database": "5.
|
|
8
|
-
"@tc-libs/file": "5.
|
|
9
|
-
"@tc-libs/storage": "5.
|
|
5
|
+
"@tc-libs/app-cache": "5.4.1",
|
|
6
|
+
"@tc-libs/constant": "5.4.1",
|
|
7
|
+
"@tc-libs/database": "5.4.1",
|
|
8
|
+
"@tc-libs/file": "5.4.1",
|
|
9
|
+
"@tc-libs/storage": "5.4.1",
|
|
10
10
|
"bytes": "3.1.2",
|
|
11
11
|
"fluent-ffmpeg": "^2.1.3",
|
|
12
|
-
"lodash": "^4.17.21",
|
|
13
12
|
"officeparser": "^5.1.1",
|
|
14
13
|
"sharp": "^0.33.5",
|
|
15
14
|
"tmp-promise": "^3.0.3",
|
|
@@ -6,14 +6,13 @@ const tslib_1 = require("tslib");
|
|
|
6
6
|
const common_1 = require("@nestjs/common");
|
|
7
7
|
const storage_1 = require("@tc-libs/storage");
|
|
8
8
|
const bytes_1 = tslib_1.__importDefault(require("bytes"));
|
|
9
|
-
const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
|
10
|
-
const path_1 = require("path");
|
|
11
9
|
const uuid_1 = require("uuid");
|
|
12
10
|
// import { WorkBook, utils } from 'xlsx';
|
|
13
11
|
const promises_1 = require("fs/promises");
|
|
12
|
+
const file_1 = require("@tc-libs/file");
|
|
14
13
|
const file_handler_module_options_1 = require("../file-handler.module.options");
|
|
15
14
|
const handlers_1 = require("./handlers");
|
|
16
|
-
const
|
|
15
|
+
const file_2 = require("./handlers/file");
|
|
17
16
|
let FileHandlerService = FileHandlerService_1 = class FileHandlerService {
|
|
18
17
|
constructor(_options, _storage) {
|
|
19
18
|
this._options = _options;
|
|
@@ -75,7 +74,7 @@ let FileHandlerService = FileHandlerService_1 = class FileHandlerService {
|
|
|
75
74
|
// remote folder + filename
|
|
76
75
|
const hashName = this.hashName(file.originalname);
|
|
77
76
|
// get extension
|
|
78
|
-
const ext = (0,
|
|
77
|
+
const ext = (0, file_1.toStorageExtension)(file);
|
|
79
78
|
return {
|
|
80
79
|
mime,
|
|
81
80
|
fileType,
|
|
@@ -100,14 +99,15 @@ let FileHandlerService = FileHandlerService_1 = class FileHandlerService {
|
|
|
100
99
|
// remote folder + filename
|
|
101
100
|
const hashName = this.hashName(file.originalname);
|
|
102
101
|
// get extension
|
|
103
|
-
const ext = (0,
|
|
102
|
+
const ext = (0, file_1.toStorageExtension)(file);
|
|
104
103
|
// content
|
|
105
104
|
const content = file.buffer;
|
|
106
105
|
// final response
|
|
107
106
|
let response = null;
|
|
108
107
|
switch (fileType) {
|
|
109
108
|
case 'image':
|
|
110
|
-
|
|
109
|
+
// Un SVG si carica così com'è, senza ricampionamenti; le GIF passano da sharp in modalità animata.
|
|
110
|
+
if (mime !== file_1.IMAGE_FORMAT_MIME.svg)
|
|
111
111
|
response = await (0, handlers_1.handleImg)(this._imgConf, ext, hashName, file, mime, content, fileType, this._storage, options);
|
|
112
112
|
break;
|
|
113
113
|
// case 'video':
|
|
@@ -136,11 +136,11 @@ let FileHandlerService = FileHandlerService_1 = class FileHandlerService {
|
|
|
136
136
|
// break;
|
|
137
137
|
}
|
|
138
138
|
if (!response)
|
|
139
|
-
response = await (0,
|
|
139
|
+
response = await (0, file_2.handleFile)(ext, hashName, file, mime, content, fileType, this._storage, options);
|
|
140
140
|
return response;
|
|
141
141
|
}
|
|
142
142
|
hashName(name) {
|
|
143
|
-
return `${
|
|
143
|
+
return `${(0, file_1.toStorageBaseName)(name)}-${(0, uuid_1.v4)()}`;
|
|
144
144
|
}
|
|
145
145
|
};
|
|
146
146
|
exports.FileHandlerService = FileHandlerService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-handler.service.js","sourceRoot":"","sources":["../../../../../packages/file-handler/src/services/file-handler.service.ts"],"names":[],"mappings":";;;;;AAAA,2CAA4D;AAC5D,8CAA4D;AAC5D,0DAA0B;AAC1B
|
|
1
|
+
{"version":3,"file":"file-handler.service.js","sourceRoot":"","sources":["../../../../../packages/file-handler/src/services/file-handler.service.ts"],"names":[],"mappings":";;;;;AAAA,2CAA4D;AAC5D,8CAA4D;AAC5D,0DAA0B;AAC1B,+BAAoC;AACpC,0CAA0C;AAC1C,0CAAuC;AACvC,wCAKuB;AACvB,gFAGwC;AAKxC,yCAAuC;AACvC,0CAA6C;AAQtC,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAG7B,YAEE,QAAmD,EAClC,QAA6B;QAD7B,aAAQ,GAAR,QAAQ,CAA0B;QAClC,aAAQ,GAAR,QAAQ,CAAqB;QALvC,WAAM,GAAW,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAO5D,2DAA2D;QAC3D,IAAI,CAAC,QAAQ,GAAG;YACd,0DAA0D;YAC1D,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO;YACpC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC9B,0BAA0B;SAC3B,CAAC;QACF,gDAAgD;IAClD,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,QAAgB;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,uBAAuB;IACvB,8CAA8C;IAC9C,gBAAgB;IAChB,eAAe;IACf,iEAAiE;IAEjE,iBAAiB;IACjB,iDAAiD;IAEjD,gBAAgB;IAChB,uCAAuC;IAEvC,iEAAiE;IACjE,6BAA6B;IAC7B,gBAAgB;IAChB,iBAAiB;IACjB,sCAAsC;IACtC,OAAO;IAEP,qBAAqB;IACrB,IAAI;IAEJ,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAA,eAAK,EAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,KAAc,EACd,UAA6B,EAAE,GAAG,EAAE,aAAG,CAAC,WAAW,EAAE;QAErD,yBAAyB;QACzB,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,IAAW;QAMrB,gBAAgB;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,gBAAgB;QAChB,MAAM,GAAG,GAAG,IAAA,yBAAkB,EAAC,IAAI,CAAC,CAAC;QACrC,OAAO;YACL,IAAI;YACJ,QAAQ;YACR,QAAQ;YACR,GAAG;SACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAW,EACX,OAA0B;QAE1B,IAAI,CAAC,OAAO;YACV,OAAO,GAAG;gBACR,GAAG,EAAE,aAAG,CAAC,WAAW;gBACpB,WAAW,EAAE,KAAK;aACnB,CAAC;QACJ,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,GAAG,aAAG,CAAC,WAAW,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;QACtD,gBAAgB;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,gBAAgB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,gBAAgB;QAChB,MAAM,GAAG,GAAG,IAAA,yBAAkB,EAAC,IAAI,CAAC,CAAC;QACrC,UAAU;QACV,MAAM,OAAO,GAAW,IAAI,CAAC,MAAM,CAAC;QACpC,iBAAiB;QACjB,IAAI,QAAQ,GAAuB,IAAI,CAAC;QACxC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,mGAAmG;gBACnG,IAAI,IAAI,KAAK,wBAAiB,CAAC,GAAG;oBAChC,QAAQ,GAAG,MAAM,IAAA,oBAAS,EACxB,IAAI,CAAC,QAAQ,EACb,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,OAAO,CACR,CAAC;gBACJ,MAAM;YACR,gBAAgB;YAChB,kCAAkC;YAClC,qBAAqB;YACrB,WAAW;YACX,gBAAgB;YAChB,YAAY;YACZ,YAAY;YACZ,eAAe;YACf,gBAAgB;YAChB,qBAAqB;YACrB,OAAO;YACP,WAAW;YACX,gBAAgB;YAChB,kCAAkC;YAClC,qBAAqB;YACrB,WAAW;YACX,gBAAgB;YAChB,YAAY;YACZ,YAAY;YACZ,eAAe;YACf,gBAAgB;YAChB,qBAAqB;YACrB,OAAO;YACP,WAAW;QACb,CAAC;QACD,IAAI,CAAC,QAAQ;YACX,QAAQ,GAAG,MAAM,IAAA,iBAAU,EACzB,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,IAAI,CAAC,QAAQ,EACb,OAAO,CACR,CAAC;QACJ,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,GAAG,IAAA,wBAAiB,EAAC,IAAI,CAAC,IAAI,IAAA,SAAM,GAAE,EAAE,CAAC;IAClD,CAAC;CACF,CAAA;AA1KY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAKR,mBAAA,IAAA,eAAM,EAAC,yDAA2B,CAAC,CAAA;qDAET,6BAAmB;GANrC,kBAAkB,CA0K9B"}
|
|
@@ -5,15 +5,18 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const sharp_1 = tslib_1.__importDefault(require("sharp"));
|
|
6
6
|
sharp_1.default.cache(false);
|
|
7
7
|
const resizeAndUpload = async (resize, remoteFolder, remoteKey, mime, content, storage, options) => {
|
|
8
|
+
// GIF animate: sharp tiene tutti i fotogrammi, che hanno altezza pageHeight.
|
|
9
|
+
const animated = mime === 'image/gif';
|
|
8
10
|
// get image by sharp
|
|
9
|
-
const image = (0, sharp_1.default)(content);
|
|
11
|
+
const image = (0, sharp_1.default)(content, { animated });
|
|
10
12
|
// get metadata for estract original width and height
|
|
11
13
|
const metadata = await image.metadata();
|
|
14
|
+
const frameHeight = metadata.pageHeight ?? metadata.height ?? 0;
|
|
12
15
|
if (resize && resize.size && resize.size > 0) {
|
|
13
16
|
// if resize is bigger than original, skip it
|
|
14
17
|
// if (Math.max(metadata.width, metadata.height) < resize.size) return null;
|
|
15
18
|
// check which is the bigger dimension
|
|
16
|
-
const biggerDimension = (metadata.width ?? 0) >
|
|
19
|
+
const biggerDimension = (metadata.width ?? 0) > frameHeight ? 'width' : 'height';
|
|
17
20
|
// build the resize param
|
|
18
21
|
const resizeObj = {};
|
|
19
22
|
resizeObj[biggerDimension] = resize.size;
|
|
@@ -39,7 +42,13 @@ const resizeAndUpload = async (resize, remoteFolder, remoteKey, mime, content, s
|
|
|
39
42
|
}
|
|
40
43
|
image.withMetadata({ density: 72 });
|
|
41
44
|
// resize img to a buffer
|
|
42
|
-
const { data, info } = await image.toBuffer({
|
|
45
|
+
const { data, info: output } = await image.toBuffer({
|
|
46
|
+
resolveWithObject: true,
|
|
47
|
+
});
|
|
48
|
+
// Per un'immagine animata l'altezza dell'output è quella di tutti i fotogrammi in colonna.
|
|
49
|
+
const info = animated
|
|
50
|
+
? { ...output, height: Math.round(output.height / (metadata.pages ?? 1)) }
|
|
51
|
+
: output;
|
|
43
52
|
// upload buffer to blob storage
|
|
44
53
|
const storageResponse = await storage.uploadItem(remoteKey, data, {
|
|
45
54
|
path: remoteFolder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jpg.js","sourceRoot":"","sources":["../../../../../../packages/file-handler/src/services/handlers/jpg.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAY1B,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAEnB,MAAM,eAAe,GAAG,KAAK,EAC3B,MAAqE,EACrE,YAAoB,EACpB,SAAiB,EACjB,IAAY,EACZ,OAAe,EACf,OAA4B,EAC5B,OAA0B,EAKzB,EAAE;IACH,qBAAqB;IACrB,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"jpg.js","sourceRoot":"","sources":["../../../../../../packages/file-handler/src/services/handlers/jpg.ts"],"names":[],"mappings":"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"}
|