@uxf/resizer 1.2.2 → 2.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/.resizer-config.json +14 -0
- package/README.md +34 -43
- package/bin/uxf-resizer.js +35 -68
- package/example-assets/assets/logo.png +0 -0
- package/example-upload/namespace/a/b/ab7dea3a-ba56-4fa0-a407-d9c4a236d153.png +0 -0
- package/index.js +126 -128
- package/package.json +1 -2
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"route": "/generated/:namespace/:p1/:p2/:filename([a-f0-9\\-]+)_:width(\\d+)_:height(\\d+)_:fit([a-z]+)_:position([a-z]+)_:background([a-z]+)_:trim([a-z]+)_:extension.:toFormat",
|
|
4
|
+
"source": "/Users/vejvis/UXF/projects/resizer/example-upload/:namespace/:p1/:p2/:filename.:extension"
|
|
5
|
+
},
|
|
6
|
+
{
|
|
7
|
+
"route": "/generated/:namespace/:p1/:p2/:filename([a-f0-9\\-]+)_:width(\\d+)_:height(\\d+)_:fit([a-z]+).:extension",
|
|
8
|
+
"source": "/Users/vejvis/UXF/projects/resizer/example-upload/:namespace/:p1/:p2/:filename.:extension"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"route": "/generated/opentopo/:width(\\d+)_:height(\\d+)/:filename",
|
|
12
|
+
"source": "https://opentopo.app/:filename"
|
|
13
|
+
}
|
|
14
|
+
]
|
package/README.md
CHANGED
|
@@ -7,27 +7,53 @@
|
|
|
7
7
|
// global installation
|
|
8
8
|
yarn global add @uxf/resizer
|
|
9
9
|
export PATH="$(yarn global bin):$PATH"
|
|
10
|
-
|
|
10
|
+
uxf-resizer
|
|
11
11
|
|
|
12
12
|
// local installation
|
|
13
13
|
yarn add @uxf/resizer
|
|
14
|
-
|
|
14
|
+
uxf-resizer
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## Configuration
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
You can use configuration file `.resizer-config.json` or environment variable `UXF_RESIZER_CONFIG`
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
[
|
|
23
|
+
{
|
|
24
|
+
"route": "/generated/:namespace/:p1/:p2/:filename([a-f0-9\\-]+)_:width(\\d+)_:height(\\d+)_:fit([a-z]+)_:position([a-z]+)_:background([a-z]+)_:trim([a-z]+)_:extension.:toFormat",
|
|
25
|
+
"source": "/var/www/UXF/projects/resizer/example-upload/:namespace/:p1/:p2/:filename.:extension"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"route": "/generated/:namespace/:p1/:p2/:filename([a-f0-9\\-]+)_:width(\\d+)_:height(\\d+)_:fit([a-z]+).:extension",
|
|
29
|
+
"source": "/var/www/UXF/projects/resizer/example-upload/:namespace/:p1/:p2/:filename.:extension"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"route": "/generated/opentopo/:width(\\d+)_:height(\\d+)_:fit([a-z]+)/:filename",
|
|
33
|
+
"source": "https://opentopo.app/:filename"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
21
36
|
```
|
|
22
37
|
|
|
23
|
-
###
|
|
38
|
+
### Supported route parameters
|
|
39
|
+
| Parameter name | Type | Default sharp value |
|
|
40
|
+
|----------------|-------------------------------|---------------------|
|
|
41
|
+
| width | `number` or `x` (auto) | `undefined` |
|
|
42
|
+
| height | `number` or `x` (auto) | `undefined` |
|
|
43
|
+
| fit | `Fit` | cover |
|
|
44
|
+
| position | `Position` | |
|
|
45
|
+
| background | `FFFFFF` or `t` (transparent) | |
|
|
46
|
+
| toFormat | `webp`, `png`, `avif`, `jpg` | `jpg` |
|
|
47
|
+
| trim | `number` or `nt` (not trim) | |
|
|
48
|
+
|
|
49
|
+
#### Fit
|
|
24
50
|
- `cv`: cover,
|
|
25
51
|
- `f`: fill,
|
|
26
52
|
- `cn`: contain,
|
|
27
53
|
- `in`: inside,
|
|
28
54
|
- `out`: outside,
|
|
29
55
|
|
|
30
|
-
|
|
56
|
+
#### Position
|
|
31
57
|
- `a`: attention
|
|
32
58
|
- `b`: bottom
|
|
33
59
|
- `c`: centre
|
|
@@ -38,39 +64,4 @@ UXF_RESIZER_SOURCE_PATH=${PWD}/example/source UXF_RESIZER_GENERATE_PATH=${PWD}/e
|
|
|
38
64
|
- `r`: right
|
|
39
65
|
- `rb`: right bottom
|
|
40
66
|
- `rt`: right top
|
|
41
|
-
- `t`: top
|
|
42
|
-
|
|
43
|
-
### background
|
|
44
|
-
- `t`: transparent
|
|
45
|
-
- `FFFFF`: white (or other hex color)
|
|
46
|
-
|
|
47
|
-
### trim
|
|
48
|
-
- `nt`: not trim
|
|
49
|
-
- `number`: number value
|
|
50
|
-
|
|
51
|
-
### toFormat
|
|
52
|
-
- `webp | png | avif | or other`
|
|
53
|
-
|
|
54
|
-
## Help
|
|
55
|
-
|
|
56
|
-
```
|
|
57
|
-
Usage:
|
|
58
|
-
uxf-resizer
|
|
59
|
-
|
|
60
|
-
Environment variables:
|
|
61
|
-
UXF_RESIZER_SOURCE_PATH - required
|
|
62
|
-
UXF_RESIZER_GENERATE_PATH - required
|
|
63
|
-
|
|
64
|
-
Options
|
|
65
|
-
--disable-namespace [boolean] [default: false]
|
|
66
|
-
--source-folder-depth Depth of the source folder [number] [default: 2]
|
|
67
|
-
--generated-folder-depth Depth of the generated folder
|
|
68
|
-
[number] [default: 2]
|
|
69
|
-
--filename-regexp Filename regexp (see:
|
|
70
|
-
https://github.com/pillarjs/path-to-regexp)
|
|
71
|
-
[string]
|
|
72
|
-
-h, --help Show help [boolean]
|
|
73
|
-
|
|
74
|
-
Options:
|
|
75
|
-
--version Show version number [boolean]
|
|
76
|
-
```
|
|
67
|
+
- `t`: top
|
package/bin/uxf-resizer.js
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
+
if (mod && mod.__esModule) return mod;
|
|
21
|
+
var result = {};
|
|
22
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
+
__setModuleDefault(result, mod);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
3
26
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
27
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
5
28
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -36,17 +59,6 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
36
59
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
37
60
|
}
|
|
38
61
|
};
|
|
39
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
40
|
-
var t = {};
|
|
41
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
42
|
-
t[p] = s[p];
|
|
43
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
44
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
45
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
46
|
-
t[p[i]] = s[p[i]];
|
|
47
|
-
}
|
|
48
|
-
return t;
|
|
49
|
-
};
|
|
50
62
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
51
63
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
52
64
|
};
|
|
@@ -54,80 +66,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
54
66
|
var process_1 = require("process");
|
|
55
67
|
var yargs_1 = __importDefault(require("yargs"));
|
|
56
68
|
var index_1 = require("../index");
|
|
69
|
+
var express_1 = __importDefault(require("express"));
|
|
70
|
+
var fs = __importStar(require("fs"));
|
|
57
71
|
var uxfResizer = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
58
|
-
var
|
|
72
|
+
var help, configFilename, configString, config_1;
|
|
73
|
+
var _a;
|
|
59
74
|
return __generator(this, function (_b) {
|
|
60
75
|
yargs_1.default.command("$0", "UXF Resizer", function (yargs) {
|
|
61
|
-
yargs.demandCommand(0, 0).usage("\nUsage:\n uxf-resizer\n \nEnvironment variables:\n
|
|
62
|
-
})
|
|
63
|
-
.option("disable-namespace", {
|
|
64
|
-
group: "Options",
|
|
65
|
-
default: false,
|
|
66
|
-
type: "boolean",
|
|
67
|
-
})
|
|
68
|
-
.option("source-folder-depth", {
|
|
69
|
-
group: "Options",
|
|
70
|
-
description: "Depth of the source folder",
|
|
71
|
-
default: 2,
|
|
72
|
-
type: "number",
|
|
73
|
-
})
|
|
74
|
-
.option("generated-folder-depth", {
|
|
75
|
-
group: "Options",
|
|
76
|
-
description: "Depth of the generated folder",
|
|
77
|
-
default: 2,
|
|
78
|
-
type: "number",
|
|
79
|
-
})
|
|
80
|
-
.option("filename-regexp", {
|
|
81
|
-
group: "Options",
|
|
82
|
-
description: "Filename regexp (see: https://github.com/pillarjs/path-to-regexp)",
|
|
83
|
-
type: "string",
|
|
76
|
+
yargs.demandCommand(0, 0).usage("\nUsage:\n uxf-resizer\n \nEnvironment variables:\n UXF_RESIZER_GENERATE_PATH - required");
|
|
84
77
|
})
|
|
85
78
|
.option("h", { alias: "help", group: "Options" })
|
|
86
79
|
.strict(false)
|
|
87
80
|
.exitProcess(false);
|
|
88
81
|
try {
|
|
89
|
-
|
|
82
|
+
help = yargs_1.default.parse(process_1.argv.slice(2)).help;
|
|
90
83
|
if (help) {
|
|
91
84
|
return [2 /*return*/, 0];
|
|
92
85
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (!sourcePath_1) {
|
|
99
|
-
// eslint-disable-next-line no-console
|
|
100
|
-
console.error("Source directory must be set. Use environment variable UXF_RESIZER_SOURCE_PATH.");
|
|
101
|
-
return [2 /*return*/, 1];
|
|
102
|
-
}
|
|
103
|
-
generatePath_1 = process_1.env.UXF_RESIZER_GENERATE_PATH;
|
|
104
|
-
if (!generatePath_1) {
|
|
105
|
-
// eslint-disable-next-line no-console
|
|
106
|
-
console.error("Generated directory must be set. Use environment variable UXF_RESIZER_GENERATED_PATH.");
|
|
107
|
-
return [2 /*return*/, 1];
|
|
86
|
+
configFilename = process.cwd() + "/.resizer-config.json";
|
|
87
|
+
configString = (_a = process_1.env.UXF_RESIZER_CONFIG) !== null && _a !== void 0 ? _a : (fs.existsSync(configFilename) ? fs.readFileSync(configFilename).toString() : "[]");
|
|
88
|
+
config_1 = JSON.parse(configString);
|
|
89
|
+
if (!Array.isArray(config_1) || config_1.length === 0) {
|
|
90
|
+
throw new Error("Invalid or empty configuration");
|
|
108
91
|
}
|
|
109
92
|
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
110
93
|
try {
|
|
111
|
-
var app_1 = (0,
|
|
94
|
+
var app_1 = (0, express_1.default)().use((0, index_1.resizerMiddleware)(config_1));
|
|
112
95
|
var listenedApp_1 = app_1.listen(3000, function () {
|
|
113
|
-
// eslint-disable-next-line no-console
|
|
114
|
-
console.log("\nSOURCE_PATH: ".concat(sourcePath_1));
|
|
115
|
-
// eslint-disable-next-line no-console
|
|
116
|
-
console.log("GENERATED_PATH: ".concat(generatePath_1));
|
|
117
|
-
// eslint-disable-next-line no-console
|
|
118
|
-
console.log("Source folder depth: ".concat(sourceFolderDepth_1));
|
|
119
|
-
// eslint-disable-next-line no-console
|
|
120
|
-
console.log("Generated folder depth: ".concat(generatedFolderDepth_1));
|
|
121
|
-
// eslint-disable-next-line no-console
|
|
122
|
-
console.log("Filename regexp: ".concat(filenameRegexp_1));
|
|
123
|
-
// eslint-disable-next-line no-console
|
|
124
|
-
console.log("Namespace: ".concat(disableNamespace_1 ? "disabled" : "enabled"));
|
|
125
96
|
// eslint-disable-next-line no-console
|
|
126
97
|
console.log("\nImage resizer app listening on port 3000");
|
|
127
|
-
if (process.env.NODE_ENV !== "production") {
|
|
128
|
-
// eslint-disable-next-line no-console
|
|
129
|
-
console.log("Example image: http://localhost:3000/generated/namespace/a/b/ab7dea3a-ba56-4fa0-a407-d9c4a236d153_300_500_cv_c_t_nt_png.png");
|
|
130
|
-
}
|
|
131
98
|
app_1.on("close", function () {
|
|
132
99
|
listenedApp_1.close();
|
|
133
100
|
resolve(true);
|
|
Binary file
|
package/index.js
CHANGED
|
@@ -1,27 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -62,11 +39,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
62
39
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
63
40
|
};
|
|
64
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
-
exports.
|
|
66
|
-
var express_1 =
|
|
42
|
+
exports.resizerMiddleware = void 0;
|
|
43
|
+
var express_1 = require("express");
|
|
67
44
|
var node_fetch_1 = __importDefault(require("node-fetch"));
|
|
68
45
|
var fs_1 = require("fs");
|
|
69
|
-
var
|
|
46
|
+
var path_1 = require("path");
|
|
70
47
|
var sharp_1 = __importDefault(require("sharp"));
|
|
71
48
|
var path_to_regexp_1 = require("path-to-regexp");
|
|
72
49
|
var FIT_OPTIONS = {
|
|
@@ -89,107 +66,128 @@ var POSITION_OPTIONS = {
|
|
|
89
66
|
rt: "right top",
|
|
90
67
|
t: "top",
|
|
91
68
|
};
|
|
92
|
-
var
|
|
93
|
-
var
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
var
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
69
|
+
var getWidth = function (_a) {
|
|
70
|
+
var width = _a.width;
|
|
71
|
+
return (width && width !== "x" ? Number(width) : undefined);
|
|
72
|
+
};
|
|
73
|
+
var getHeight = function (_a) {
|
|
74
|
+
var height = _a.height;
|
|
75
|
+
return (height && height !== "x" ? Number(height) : undefined);
|
|
76
|
+
};
|
|
77
|
+
var getBackground = function (_a) {
|
|
78
|
+
var background = _a.background;
|
|
79
|
+
return background === undefined ? undefined : background === "t" ? "transparent" : "#".concat(background);
|
|
80
|
+
};
|
|
81
|
+
var getFit = function (_a) {
|
|
82
|
+
var _b;
|
|
83
|
+
var fit = _a.fit;
|
|
84
|
+
return (fit ? (_b = FIT_OPTIONS[fit]) !== null && _b !== void 0 ? _b : "cover" : "cover");
|
|
85
|
+
};
|
|
86
|
+
var getPosition = function (_a) {
|
|
87
|
+
var _b;
|
|
88
|
+
var position = _a.position;
|
|
89
|
+
return (position ? (_b = POSITION_OPTIONS[position]) !== null && _b !== void 0 ? _b : "centre" : undefined);
|
|
90
|
+
};
|
|
91
|
+
var getWithoutEnlargement = function (_a) {
|
|
92
|
+
var extension = _a.extension;
|
|
93
|
+
return extension !== "svg";
|
|
94
|
+
};
|
|
95
|
+
var getTrim = function (_a) {
|
|
96
|
+
var trim = _a.trim;
|
|
97
|
+
return (trim === undefined || trim === "nt" ? undefined : Number(trim));
|
|
98
|
+
};
|
|
99
|
+
function log(message) {
|
|
105
100
|
// eslint-disable-next-line no-console
|
|
106
|
-
console.log(
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
?
|
|
123
|
-
:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
101
|
+
console.log(message);
|
|
102
|
+
}
|
|
103
|
+
var resizerMiddleware = function (config) {
|
|
104
|
+
var middleware = (0, express_1.Router)();
|
|
105
|
+
config.forEach(function (c, i) {
|
|
106
|
+
log("Config #".concat(i + 1, ":"));
|
|
107
|
+
log(" Route: ".concat(c.route));
|
|
108
|
+
log(" Source: ".concat(c.source));
|
|
109
|
+
middleware.get(c.route, function (req, res) { return __awaiter(void 0, void 0, void 0, function () {
|
|
110
|
+
var url, domain, sourceFilename, generatedFilename, generatedDirectory, params, sourceFile, _a, pipeline, trim;
|
|
111
|
+
var _b, _c;
|
|
112
|
+
return __generator(this, function (_d) {
|
|
113
|
+
switch (_d.label) {
|
|
114
|
+
case 0:
|
|
115
|
+
url = c.source.startsWith("http") ? new URL(c.source) : null;
|
|
116
|
+
domain = url === null || url === void 0 ? void 0 : url.origin;
|
|
117
|
+
sourceFilename = (0, path_to_regexp_1.compile)((_b = url === null || url === void 0 ? void 0 : url.pathname) !== null && _b !== void 0 ? _b : c.source, {})(req.params);
|
|
118
|
+
generatedFilename = ((_c = process.env.UXF_RESIZER_GENERATE_PATH) !== null && _c !== void 0 ? _c : process.cwd()) + req.path;
|
|
119
|
+
if ((0, fs_1.existsSync)(generatedFilename)) {
|
|
120
|
+
return [2 /*return*/, res.sendFile(generatedFilename)];
|
|
121
|
+
}
|
|
122
|
+
log("----------------------------------------");
|
|
123
|
+
log(req.params);
|
|
124
|
+
log("Source filename: ".concat(sourceFilename));
|
|
125
|
+
log("Generated filename: ".concat(generatedFilename));
|
|
126
|
+
generatedDirectory = (0, path_1.dirname)(generatedFilename);
|
|
127
|
+
if (!(0, fs_1.existsSync)(generatedDirectory)) {
|
|
128
|
+
(0, fs_1.mkdirSync)(generatedDirectory, { recursive: true });
|
|
129
|
+
}
|
|
130
|
+
params = req.params;
|
|
131
|
+
if (!domain) return [3 /*break*/, 3];
|
|
132
|
+
return [4 /*yield*/, (0, node_fetch_1.default)(domain + sourceFilename)];
|
|
133
|
+
case 1: return [4 /*yield*/, (_d.sent()).buffer()];
|
|
134
|
+
case 2:
|
|
135
|
+
_a = _d.sent();
|
|
136
|
+
return [3 /*break*/, 4];
|
|
137
|
+
case 3:
|
|
138
|
+
_a = sourceFilename;
|
|
139
|
+
_d.label = 4;
|
|
140
|
+
case 4:
|
|
141
|
+
sourceFile = _a;
|
|
142
|
+
return [4 /*yield*/, (0, sharp_1.default)(sourceFile)
|
|
143
|
+
.rotate()
|
|
144
|
+
.resize({
|
|
145
|
+
width: getWidth(params),
|
|
146
|
+
height: getHeight(params),
|
|
147
|
+
background: getBackground(params),
|
|
148
|
+
fastShrinkOnLoad: false,
|
|
149
|
+
fit: getFit(params),
|
|
150
|
+
position: getPosition(params),
|
|
151
|
+
withoutEnlargement: getWithoutEnlargement(params),
|
|
152
|
+
})];
|
|
153
|
+
case 5:
|
|
154
|
+
pipeline = _d.sent();
|
|
155
|
+
trim = getTrim(params);
|
|
156
|
+
if (trim !== undefined) {
|
|
157
|
+
pipeline.trim(trim);
|
|
158
|
+
}
|
|
159
|
+
switch (params.toFormat) {
|
|
160
|
+
case "webp":
|
|
161
|
+
pipeline.webp({ quality: 60 });
|
|
162
|
+
res.setHeader("Content-Type", "image/webp");
|
|
163
|
+
break;
|
|
164
|
+
case "png":
|
|
165
|
+
pipeline.png({ progressive: true, quality: 60 });
|
|
166
|
+
res.setHeader("Content-Type", "image/png");
|
|
167
|
+
break;
|
|
168
|
+
case "avif":
|
|
169
|
+
pipeline.avif();
|
|
170
|
+
res.setHeader("Content-Type", "image/avif");
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
pipeline.jpeg({ progressive: true, quality: 60 });
|
|
174
|
+
res.setHeader("Content-Type", "image/jpeg");
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
pipeline
|
|
178
|
+
.withMetadata({ density: 72 })
|
|
179
|
+
.toColorspace("srgb")
|
|
180
|
+
.toFile(generatedFilename)
|
|
181
|
+
.then(function () { return res.sendFile(generatedFilename); })
|
|
182
|
+
.catch(function (e) {
|
|
183
|
+
log(e);
|
|
184
|
+
return res.sendStatus(404);
|
|
185
|
+
});
|
|
186
|
+
return [2 /*return*/];
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
}); });
|
|
190
|
+
});
|
|
191
|
+
return middleware;
|
|
194
192
|
};
|
|
195
|
-
exports.
|
|
193
|
+
exports.resizerMiddleware = resizerMiddleware;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uxf/resizer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"description": "UXF Resizer",
|
|
6
6
|
"author": "UXFans <dev@uxf.cz>",
|
|
@@ -25,7 +25,6 @@
|
|
|
25
25
|
"yargs": "^17.2.1"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@types/crypto-js": "^4.0.2",
|
|
29
28
|
"@types/express": "^4.17.13",
|
|
30
29
|
"@types/jest": "^27.0.1",
|
|
31
30
|
"@types/node-fetch": "^2.5.12",
|