@vendure/asset-server-plugin 2.0.0-next.9 → 2.0.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/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/src/common.d.ts +2 -1
- package/lib/src/common.js +22 -2
- package/lib/src/common.js.map +1 -1
- package/lib/src/constants.d.ts +1 -0
- package/lib/src/constants.js +2 -1
- package/lib/src/constants.js.map +1 -1
- package/lib/src/hashed-asset-naming-strategy.d.ts +1 -1
- package/lib/src/hashed-asset-naming-strategy.js +1 -1
- package/lib/src/local-asset-storage-strategy.d.ts +3 -1
- package/lib/src/local-asset-storage-strategy.js +1 -1
- package/lib/src/plugin.d.ts +18 -1
- package/lib/src/plugin.js +77 -29
- package/lib/src/plugin.js.map +1 -1
- package/lib/src/s3-asset-storage-strategy.d.ts +24 -30
- package/lib/src/s3-asset-storage-strategy.js +118 -94
- package/lib/src/s3-asset-storage-strategy.js.map +1 -1
- package/lib/src/sharp-asset-preview-strategy.d.ts +91 -5
- package/lib/src/sharp-asset-preview-strategy.js +68 -22
- package/lib/src/sharp-asset-preview-strategy.js.map +1 -1
- package/lib/src/transform-image.d.ts +2 -2
- package/lib/src/transform-image.js +18 -0
- package/lib/src/transform-image.js.map +1 -1
- package/lib/src/types.d.ts +44 -5
- package/package.json +41 -39
package/lib/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
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);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,kEAAgD;AAChD,qEAAmD;AACnD,8CAA4B"}
|
package/lib/src/common.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { Request } from 'express';
|
|
2
|
-
import { AssetServerOptions } from './types';
|
|
2
|
+
import { AssetServerOptions, ImageTransformFormat } from './types';
|
|
3
3
|
export declare function getAssetUrlPrefixFn(options: AssetServerOptions): ((request: Request, identifier: string) => string) | ((...args: any[]) => string);
|
|
4
|
+
export declare function getValidFormat(format?: unknown): ImageTransformFormat | undefined;
|
package/lib/src/common.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getAssetUrlPrefixFn = void 0;
|
|
3
|
+
exports.getValidFormat = exports.getAssetUrlPrefixFn = void 0;
|
|
4
4
|
const constants_1 = require("@vendure/core/dist/common/constants");
|
|
5
5
|
function getAssetUrlPrefixFn(options) {
|
|
6
6
|
const { assetUrlPrefix, route } = options;
|
|
7
7
|
if (assetUrlPrefix == null) {
|
|
8
|
-
return (request, identifier) =>
|
|
8
|
+
return (request, identifier) => {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
const protocol = (_a = request.headers['x-forwarded-proto']) !== null && _a !== void 0 ? _a : request.protocol;
|
|
11
|
+
return `${Array.isArray(protocol) ? protocol[0] : protocol}://${(_b = request.get('host')) !== null && _b !== void 0 ? _b : 'could-not-determine-host'}/${route}/`;
|
|
12
|
+
};
|
|
9
13
|
}
|
|
10
14
|
if (typeof assetUrlPrefix === 'string') {
|
|
11
15
|
return (...args) => assetUrlPrefix;
|
|
@@ -19,4 +23,20 @@ function getAssetUrlPrefixFn(options) {
|
|
|
19
23
|
throw new Error(`The assetUrlPrefix option was of an unexpected type: ${JSON.stringify(assetUrlPrefix)}`);
|
|
20
24
|
}
|
|
21
25
|
exports.getAssetUrlPrefixFn = getAssetUrlPrefixFn;
|
|
26
|
+
function getValidFormat(format) {
|
|
27
|
+
if (typeof format !== 'string') {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
switch (format) {
|
|
31
|
+
case 'jpg':
|
|
32
|
+
case 'jpeg':
|
|
33
|
+
case 'png':
|
|
34
|
+
case 'webp':
|
|
35
|
+
case 'avif':
|
|
36
|
+
return format;
|
|
37
|
+
default:
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.getValidFormat = getValidFormat;
|
|
22
42
|
//# sourceMappingURL=common.js.map
|
package/lib/src/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":";;;AAAA,mEAA0E;AAK1E,SAAgB,mBAAmB,CAAC,OAA2B;IAC3D,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1C,IAAI,cAAc,IAAI,IAAI,EAAE;QACxB,OAAO,CAAC,OAAgB,EAAE,UAAkB,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":";;;AAAA,mEAA0E;AAK1E,SAAgB,mBAAmB,CAAC,OAA2B;IAC3D,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1C,IAAI,cAAc,IAAI,IAAI,EAAE;QACxB,OAAO,CAAC,OAAgB,EAAE,UAAkB,EAAE,EAAE;;YAC5C,MAAM,QAAQ,GAAG,MAAA,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,mCAAI,OAAO,CAAC,QAAQ,CAAC;YAC1E,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,MACtD,MAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,mCAAI,0BAC3B,IAAI,KAAK,GAAG,CAAC;QACjB,CAAC,CAAC;KACL;IACD,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;QACpC,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,cAAc,CAAC;KAC7C;IACD,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;QACtC,OAAO,CAAC,OAAgB,EAAE,UAAkB,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAI,OAAe,CAAC,+BAAmB,CAAC,CAAC;YAClD,OAAO,cAAc,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC,CAAC;KACL;IACD,MAAM,IAAI,KAAK,CAAC,wDAAwD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AAC9G,CAAC;AApBD,kDAoBC;AAED,SAAgB,cAAc,CAAC,MAAgB;IAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QAC5B,OAAO,SAAS,CAAC;KACpB;IACD,QAAQ,MAAM,EAAE;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACP,OAAO,MAAM,CAAC;QAClB;YACI,OAAO,SAAS,CAAC;KACxB;AACL,CAAC;AAdD,wCAcC"}
|
package/lib/src/constants.d.ts
CHANGED
package/lib/src/constants.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loggerCtx = void 0;
|
|
3
|
+
exports.DEFAULT_CACHE_HEADER = exports.loggerCtx = void 0;
|
|
4
4
|
exports.loggerCtx = 'AssetServerPlugin';
|
|
5
|
+
exports.DEFAULT_CACHE_HEADER = 'public, max-age=15552000';
|
|
5
6
|
//# sourceMappingURL=constants.js.map
|
package/lib/src/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG,mBAAmB,CAAC;AAChC,QAAA,oBAAoB,GAAG,0BAA0B,CAAC"}
|
|
@@ -12,7 +12,7 @@ import { DefaultAssetNamingStrategy, RequestContext } from '@vendure/core';
|
|
|
12
12
|
* With this strategy, even with 200,000 total assets stored, each directory would
|
|
13
13
|
* only contain less than 800 files.
|
|
14
14
|
*
|
|
15
|
-
* @docsCategory AssetServerPlugin
|
|
15
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
16
16
|
*/
|
|
17
17
|
export declare class HashedAssetNamingStrategy extends DefaultAssetNamingStrategy {
|
|
18
18
|
generateSourceFileName(ctx: RequestContext, originalFileName: string, conflictFileName?: string): string;
|
|
@@ -20,7 +20,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
20
20
|
* With this strategy, even with 200,000 total assets stored, each directory would
|
|
21
21
|
* only contain less than 800 files.
|
|
22
22
|
*
|
|
23
|
-
* @docsCategory AssetServerPlugin
|
|
23
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
24
24
|
*/
|
|
25
25
|
class HashedAssetNamingStrategy extends core_1.DefaultAssetNamingStrategy {
|
|
26
26
|
generateSourceFileName(ctx, originalFileName, conflictFileName) {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
2
4
|
import { AssetStorageStrategy } from '@vendure/core';
|
|
3
5
|
import { Request } from 'express';
|
|
4
6
|
import { ReadStream } from 'fs';
|
|
@@ -7,7 +9,7 @@ import { Stream } from 'stream';
|
|
|
7
9
|
* @description
|
|
8
10
|
* A persistence strategy which saves files to the local file system.
|
|
9
11
|
*
|
|
10
|
-
* @docsCategory AssetServerPlugin
|
|
12
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
11
13
|
*/
|
|
12
14
|
export declare class LocalAssetStorageStrategy implements AssetStorageStrategy {
|
|
13
15
|
private readonly uploadPath;
|
|
@@ -10,7 +10,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
10
10
|
* @description
|
|
11
11
|
* A persistence strategy which saves files to the local file system.
|
|
12
12
|
*
|
|
13
|
-
* @docsCategory AssetServerPlugin
|
|
13
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
14
14
|
*/
|
|
15
15
|
class LocalAssetStorageStrategy {
|
|
16
16
|
constructor(uploadPath, toAbsoluteUrlFn) {
|
package/lib/src/plugin.d.ts
CHANGED
|
@@ -59,6 +59,22 @@ import { AssetServerOptions } from './types';
|
|
|
59
59
|
*
|
|
60
60
|
* `http://localhost:3000/assets/landscape.jpg?w=150&h=150&mode=crop&fpx=0.2&fpy=0.7`
|
|
61
61
|
*
|
|
62
|
+
* ### Format
|
|
63
|
+
*
|
|
64
|
+
* Since v1.7.0, the image format can be specified by adding the `format` query parameter:
|
|
65
|
+
*
|
|
66
|
+
* `http://localhost:3000/assets/some-asset.jpg?format=webp`
|
|
67
|
+
*
|
|
68
|
+
* This means that, no matter the format of your original asset files, you can use more modern formats in your storefront if the browser
|
|
69
|
+
* supports them. Supported values for `format` are:
|
|
70
|
+
*
|
|
71
|
+
* * `jpeg` or `jpg`
|
|
72
|
+
* * `png`
|
|
73
|
+
* * `webp`
|
|
74
|
+
* * `avif`
|
|
75
|
+
*
|
|
76
|
+
* The `format` parameter can also be combined with presets (see below).
|
|
77
|
+
*
|
|
62
78
|
* ### Transform presets
|
|
63
79
|
*
|
|
64
80
|
* Presets can be defined which allow a single preset name to be used instead of specifying the width, height and mode. Presets are
|
|
@@ -97,7 +113,7 @@ import { AssetServerOptions } from './types';
|
|
|
97
113
|
* By default, the AssetServerPlugin will cache every transformed image, so that the transformation only needs to be performed a single time for
|
|
98
114
|
* a given configuration. Caching can be disabled per-request by setting the `?cache=false` query parameter.
|
|
99
115
|
*
|
|
100
|
-
* @docsCategory AssetServerPlugin
|
|
116
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
101
117
|
*/
|
|
102
118
|
export declare class AssetServerPlugin implements NestModule, OnApplicationBootstrap {
|
|
103
119
|
private processContext;
|
|
@@ -105,6 +121,7 @@ export declare class AssetServerPlugin implements NestModule, OnApplicationBoots
|
|
|
105
121
|
private readonly cacheDir;
|
|
106
122
|
private presets;
|
|
107
123
|
private static options;
|
|
124
|
+
private cacheHeader;
|
|
108
125
|
/**
|
|
109
126
|
* @description
|
|
110
127
|
* Set the plugin options.
|
package/lib/src/plugin.js
CHANGED
|
@@ -20,6 +20,7 @@ const express_1 = __importDefault(require("express"));
|
|
|
20
20
|
const file_type_1 = require("file-type");
|
|
21
21
|
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
22
22
|
const path_1 = __importDefault(require("path"));
|
|
23
|
+
const common_1 = require("./common");
|
|
23
24
|
const constants_1 = require("./constants");
|
|
24
25
|
const default_asset_storage_strategy_factory_1 = require("./default-asset-storage-strategy-factory");
|
|
25
26
|
const hashed_asset_naming_strategy_1 = require("./hashed-asset-naming-strategy");
|
|
@@ -82,6 +83,22 @@ const transform_image_1 = require("./transform-image");
|
|
|
82
83
|
*
|
|
83
84
|
* `http://localhost:3000/assets/landscape.jpg?w=150&h=150&mode=crop&fpx=0.2&fpy=0.7`
|
|
84
85
|
*
|
|
86
|
+
* ### Format
|
|
87
|
+
*
|
|
88
|
+
* Since v1.7.0, the image format can be specified by adding the `format` query parameter:
|
|
89
|
+
*
|
|
90
|
+
* `http://localhost:3000/assets/some-asset.jpg?format=webp`
|
|
91
|
+
*
|
|
92
|
+
* This means that, no matter the format of your original asset files, you can use more modern formats in your storefront if the browser
|
|
93
|
+
* supports them. Supported values for `format` are:
|
|
94
|
+
*
|
|
95
|
+
* * `jpeg` or `jpg`
|
|
96
|
+
* * `png`
|
|
97
|
+
* * `webp`
|
|
98
|
+
* * `avif`
|
|
99
|
+
*
|
|
100
|
+
* The `format` parameter can also be combined with presets (see below).
|
|
101
|
+
*
|
|
85
102
|
* ### Transform presets
|
|
86
103
|
*
|
|
87
104
|
* Presets can be defined which allow a single preset name to be used instead of specifying the width, height and mode. Presets are
|
|
@@ -120,20 +137,9 @@ const transform_image_1 = require("./transform-image");
|
|
|
120
137
|
* By default, the AssetServerPlugin will cache every transformed image, so that the transformation only needs to be performed a single time for
|
|
121
138
|
* a given configuration. Caching can be disabled per-request by setting the `?cache=false` query parameter.
|
|
122
139
|
*
|
|
123
|
-
* @docsCategory AssetServerPlugin
|
|
140
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
124
141
|
*/
|
|
125
142
|
let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
126
|
-
constructor(processContext) {
|
|
127
|
-
this.processContext = processContext;
|
|
128
|
-
this.cacheDir = 'cache';
|
|
129
|
-
this.presets = [
|
|
130
|
-
{ name: 'tiny', width: 50, height: 50, mode: 'crop' },
|
|
131
|
-
{ name: 'thumb', width: 150, height: 150, mode: 'crop' },
|
|
132
|
-
{ name: 'small', width: 300, height: 300, mode: 'resize' },
|
|
133
|
-
{ name: 'medium', width: 500, height: 500, mode: 'resize' },
|
|
134
|
-
{ name: 'large', width: 800, height: 800, mode: 'resize' },
|
|
135
|
-
];
|
|
136
|
-
}
|
|
137
143
|
/**
|
|
138
144
|
* @description
|
|
139
145
|
* Set the plugin options.
|
|
@@ -144,17 +150,30 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
144
150
|
}
|
|
145
151
|
/** @internal */
|
|
146
152
|
static async configure(config) {
|
|
153
|
+
var _a;
|
|
147
154
|
const storageStrategyFactory = this.options.storageStrategyFactory || default_asset_storage_strategy_factory_1.defaultAssetStorageStrategyFactory;
|
|
148
155
|
this.assetStorage = await storageStrategyFactory(this.options);
|
|
149
|
-
config.assetOptions.assetPreviewStrategy =
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
156
|
+
config.assetOptions.assetPreviewStrategy =
|
|
157
|
+
(_a = this.options.previewStrategy) !== null && _a !== void 0 ? _a : new sharp_asset_preview_strategy_1.SharpAssetPreviewStrategy({
|
|
158
|
+
maxWidth: this.options.previewMaxWidth,
|
|
159
|
+
maxHeight: this.options.previewMaxHeight,
|
|
160
|
+
});
|
|
153
161
|
config.assetOptions.assetStorageStrategy = this.assetStorage;
|
|
154
162
|
config.assetOptions.assetNamingStrategy =
|
|
155
163
|
this.options.namingStrategy || new hashed_asset_naming_strategy_1.HashedAssetNamingStrategy();
|
|
156
164
|
return config;
|
|
157
165
|
}
|
|
166
|
+
constructor(processContext) {
|
|
167
|
+
this.processContext = processContext;
|
|
168
|
+
this.cacheDir = 'cache';
|
|
169
|
+
this.presets = [
|
|
170
|
+
{ name: 'tiny', width: 50, height: 50, mode: 'crop' },
|
|
171
|
+
{ name: 'thumb', width: 150, height: 150, mode: 'crop' },
|
|
172
|
+
{ name: 'small', width: 300, height: 300, mode: 'resize' },
|
|
173
|
+
{ name: 'medium', width: 500, height: 500, mode: 'resize' },
|
|
174
|
+
{ name: 'large', width: 800, height: 800, mode: 'resize' },
|
|
175
|
+
];
|
|
176
|
+
}
|
|
158
177
|
/** @internal */
|
|
159
178
|
onApplicationBootstrap() {
|
|
160
179
|
if (this.processContext.isWorker) {
|
|
@@ -171,6 +190,21 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
171
190
|
}
|
|
172
191
|
}
|
|
173
192
|
}
|
|
193
|
+
// Configure Cache-Control header
|
|
194
|
+
const { cacheHeader } = AssetServerPlugin_1.options;
|
|
195
|
+
if (!cacheHeader) {
|
|
196
|
+
this.cacheHeader = constants_1.DEFAULT_CACHE_HEADER;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
if (typeof cacheHeader === 'string') {
|
|
200
|
+
this.cacheHeader = cacheHeader;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
this.cacheHeader = [cacheHeader.restriction, `max-age: ${cacheHeader.maxAge}`]
|
|
204
|
+
.filter(value => !!value)
|
|
205
|
+
.join(', ');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
174
208
|
const cachePath = path_1.default.join(AssetServerPlugin_1.options.assetUploadDir, this.cacheDir);
|
|
175
209
|
fs_extra_1.default.ensureDirSync(cachePath);
|
|
176
210
|
}
|
|
@@ -204,7 +238,8 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
204
238
|
mimeType = ((_a = (await (0, file_type_1.fromBuffer)(file))) === null || _a === void 0 ? void 0 : _a.mime) || 'application/octet-stream';
|
|
205
239
|
}
|
|
206
240
|
res.contentType(mimeType);
|
|
207
|
-
res.setHeader('content-security-policy',
|
|
241
|
+
res.setHeader('content-security-policy', "default-src 'self'");
|
|
242
|
+
res.setHeader('Cache-Control', this.cacheHeader);
|
|
208
243
|
res.send(file);
|
|
209
244
|
}
|
|
210
245
|
catch (e) {
|
|
@@ -221,6 +256,7 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
221
256
|
*/
|
|
222
257
|
generateTransformedImage() {
|
|
223
258
|
return async (err, req, res, next) => {
|
|
259
|
+
var _a;
|
|
224
260
|
if (err && (err.status === 404 || err.statusCode === 404)) {
|
|
225
261
|
if (req.query) {
|
|
226
262
|
const decodedReqPath = decodeURIComponent(req.path);
|
|
@@ -229,20 +265,24 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
229
265
|
try {
|
|
230
266
|
file = await AssetServerPlugin_1.assetStorage.readFileToBuffer(decodedReqPath);
|
|
231
267
|
}
|
|
232
|
-
catch (
|
|
268
|
+
catch (_err) {
|
|
233
269
|
res.status(404).send('Resource not found');
|
|
234
270
|
return;
|
|
235
271
|
}
|
|
236
272
|
const image = await (0, transform_image_1.transformImage)(file, req.query, this.presets || []);
|
|
237
273
|
try {
|
|
238
274
|
const imageBuffer = await image.toBuffer();
|
|
275
|
+
const cachedFileName = this.getFileNameFromRequest(req);
|
|
239
276
|
if (!req.query.cache || req.query.cache === 'true') {
|
|
240
|
-
const cachedFileName = this.getFileNameFromRequest(req);
|
|
241
277
|
await AssetServerPlugin_1.assetStorage.writeFileFromBuffer(cachedFileName, imageBuffer);
|
|
242
278
|
core_1.Logger.debug(`Saved cached asset: ${cachedFileName}`, constants_1.loggerCtx);
|
|
243
279
|
}
|
|
244
|
-
|
|
245
|
-
|
|
280
|
+
let mimeType = this.getMimeType(cachedFileName);
|
|
281
|
+
if (!mimeType) {
|
|
282
|
+
mimeType = ((_a = (await (0, file_type_1.fromBuffer)(imageBuffer))) === null || _a === void 0 ? void 0 : _a.mime) || 'image/jpeg';
|
|
283
|
+
}
|
|
284
|
+
res.set('Content-Type', mimeType);
|
|
285
|
+
res.setHeader('content-security-policy', "default-src 'self'");
|
|
246
286
|
res.send(imageBuffer);
|
|
247
287
|
return;
|
|
248
288
|
}
|
|
@@ -257,22 +297,28 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
257
297
|
};
|
|
258
298
|
}
|
|
259
299
|
getFileNameFromRequest(req) {
|
|
260
|
-
const { w, h, mode, preset, fpx, fpy } = req.query;
|
|
300
|
+
const { w, h, mode, preset, fpx, fpy, format } = req.query;
|
|
301
|
+
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
|
261
302
|
const focalPoint = fpx && fpy ? `_fpx${fpx}_fpy${fpy}` : '';
|
|
303
|
+
const imageFormat = (0, common_1.getValidFormat)(format);
|
|
262
304
|
let imageParamHash = null;
|
|
263
305
|
if (w || h) {
|
|
264
306
|
const width = w || '';
|
|
265
307
|
const height = h || '';
|
|
266
|
-
imageParamHash = this.md5(`_transform_w${width}_h${height}_m${mode}${focalPoint}`);
|
|
308
|
+
imageParamHash = this.md5(`_transform_w${width}_h${height}_m${mode}${focalPoint}${imageFormat}`);
|
|
267
309
|
}
|
|
268
310
|
else if (preset) {
|
|
269
311
|
if (this.presets && !!this.presets.find(p => p.name === preset)) {
|
|
270
|
-
imageParamHash = this.md5(`_transform_pre_${preset}${focalPoint}`);
|
|
312
|
+
imageParamHash = this.md5(`_transform_pre_${preset}${focalPoint}${imageFormat}`);
|
|
271
313
|
}
|
|
272
314
|
}
|
|
315
|
+
else if (imageFormat) {
|
|
316
|
+
imageParamHash = this.md5(`_transform_${imageFormat}`);
|
|
317
|
+
}
|
|
318
|
+
/* eslint-enable @typescript-eslint/restrict-template-expressions */
|
|
273
319
|
const decodedReqPath = decodeURIComponent(req.path);
|
|
274
320
|
if (imageParamHash) {
|
|
275
|
-
return path_1.default.join(this.cacheDir, this.addSuffix(decodedReqPath, imageParamHash));
|
|
321
|
+
return path_1.default.join(this.cacheDir, this.addSuffix(decodedReqPath, imageParamHash, imageFormat));
|
|
276
322
|
}
|
|
277
323
|
else {
|
|
278
324
|
return decodedReqPath;
|
|
@@ -281,11 +327,12 @@ let AssetServerPlugin = AssetServerPlugin_1 = class AssetServerPlugin {
|
|
|
281
327
|
md5(input) {
|
|
282
328
|
return (0, crypto_1.createHash)('md5').update(input).digest('hex');
|
|
283
329
|
}
|
|
284
|
-
addSuffix(fileName, suffix) {
|
|
285
|
-
const
|
|
286
|
-
const
|
|
330
|
+
addSuffix(fileName, suffix, ext) {
|
|
331
|
+
const originalExt = path_1.default.extname(fileName);
|
|
332
|
+
const effectiveExt = ext ? `.${ext}` : originalExt;
|
|
333
|
+
const baseName = path_1.default.basename(fileName, originalExt);
|
|
287
334
|
const dirName = path_1.default.dirname(fileName);
|
|
288
|
-
return path_1.default.join(dirName, `${baseName}${suffix}${
|
|
335
|
+
return path_1.default.join(dirName, `${baseName}${suffix}${effectiveExt}`);
|
|
289
336
|
}
|
|
290
337
|
/**
|
|
291
338
|
* Attempt to get the mime type from the file name.
|
|
@@ -313,6 +360,7 @@ AssetServerPlugin = AssetServerPlugin_1 = __decorate([
|
|
|
313
360
|
(0, core_1.VendurePlugin)({
|
|
314
361
|
imports: [core_1.PluginCommonModule],
|
|
315
362
|
configuration: config => AssetServerPlugin_1.configure(config),
|
|
363
|
+
compatibility: '^2.0.0',
|
|
316
364
|
}),
|
|
317
365
|
__metadata("design:paramtypes", [core_1.ProcessContext])
|
|
318
366
|
], AssetServerPlugin);
|
package/lib/src/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,wCAQuB;AACvB,mCAAoC;AACpC,sDAAmE;AACnE,yCAAuC;AACvC,wDAA0B;AAC1B,gDAAwB;AAExB,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { AwsCredentialIdentity, AwsCredentialIdentityProvider } from '@aws-sdk/types';
|
|
2
4
|
import { AssetStorageStrategy } from '@vendure/core';
|
|
3
5
|
import { Request } from 'express';
|
|
4
|
-
import {
|
|
6
|
+
import { Readable } from 'node:stream';
|
|
5
7
|
import { AssetServerOptions } from './types';
|
|
6
|
-
export declare type S3Credentials = {
|
|
7
|
-
accessKeyId: string;
|
|
8
|
-
secretAccessKey: string;
|
|
9
|
-
};
|
|
10
|
-
export declare type S3CredentialsProfile = {
|
|
11
|
-
profile: string;
|
|
12
|
-
};
|
|
13
8
|
/**
|
|
14
9
|
* @description
|
|
15
10
|
* Configuration for connecting to AWS S3.
|
|
16
11
|
*
|
|
17
|
-
* @docsCategory
|
|
12
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
18
13
|
* @docsPage S3AssetStorageStrategy
|
|
19
14
|
*/
|
|
20
15
|
export interface S3Config {
|
|
21
16
|
/**
|
|
22
17
|
* @description
|
|
23
|
-
* The credentials used to access your s3 account. You can supply either the access key ID & secret,
|
|
24
|
-
* or you can make use of a
|
|
18
|
+
* The credentials used to access your s3 account. You can supply either the access key ID & secret, or you can make use of a
|
|
25
19
|
* [shared credentials file](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html)
|
|
26
|
-
*
|
|
20
|
+
* To use a shared credentials file, import the `fromIni()` function from the "@aws-sdk/credential-provider-ini" or "@aws-sdk/credential-providers" package and supply
|
|
21
|
+
* the profile name (e.g. `{ profile: 'default' }`) as its argument.
|
|
27
22
|
*/
|
|
28
|
-
credentials
|
|
23
|
+
credentials: AwsCredentialIdentity | AwsCredentialIdentityProvider;
|
|
29
24
|
/**
|
|
30
25
|
* @description
|
|
31
26
|
* The S3 bucket in which to store the assets. If it does not exist, it will be created on startup.
|
|
@@ -51,16 +46,17 @@ export interface S3Config {
|
|
|
51
46
|
* Returns a configured instance of the {@link S3AssetStorageStrategy} which can then be passed to the {@link AssetServerOptions}
|
|
52
47
|
* `storageStrategyFactory` property.
|
|
53
48
|
*
|
|
54
|
-
* Before using this strategy, make sure you have the `aws-sdk` package installed:
|
|
49
|
+
* Before using this strategy, make sure you have the `@aws-sdk/client-s3` and `@aws-sdk/lib-storage` package installed:
|
|
55
50
|
*
|
|
56
51
|
* ```sh
|
|
57
|
-
* npm install aws-sdk
|
|
52
|
+
* npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
|
|
58
53
|
* ```
|
|
59
54
|
*
|
|
60
55
|
* @example
|
|
61
56
|
* ```TypeScript
|
|
62
57
|
* import { AssetServerPlugin, configureS3AssetStorage } from '\@vendure/asset-server-plugin';
|
|
63
58
|
* import { DefaultAssetNamingStrategy } from '\@vendure/core';
|
|
59
|
+
* import { fromEnv } from '\@aws-sdk/credential-providers';
|
|
64
60
|
*
|
|
65
61
|
* // ...
|
|
66
62
|
*
|
|
@@ -68,14 +64,10 @@ export interface S3Config {
|
|
|
68
64
|
* AssetServerPlugin.init({
|
|
69
65
|
* route: 'assets',
|
|
70
66
|
* assetUploadDir: path.join(__dirname, 'assets'),
|
|
71
|
-
* port: 5002,
|
|
72
67
|
* namingStrategy: new DefaultAssetNamingStrategy(),
|
|
73
68
|
* storageStrategyFactory: configureS3AssetStorage({
|
|
74
69
|
* bucket: 'my-s3-bucket',
|
|
75
|
-
* credentials:
|
|
76
|
-
* accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
77
|
-
* secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
78
|
-
* },
|
|
70
|
+
* credentials: fromEnv(), // or any other credential provider
|
|
79
71
|
* }),
|
|
80
72
|
* }),
|
|
81
73
|
* ```
|
|
@@ -95,7 +87,6 @@ export interface S3Config {
|
|
|
95
87
|
* AssetServerPlugin.init({
|
|
96
88
|
* route: 'assets',
|
|
97
89
|
* assetUploadDir: path.join(__dirname, 'assets'),
|
|
98
|
-
* port: 5002,
|
|
99
90
|
* namingStrategy: new DefaultAssetNamingStrategy(),
|
|
100
91
|
* storageStrategyFactory: configureS3AssetStorage({
|
|
101
92
|
* bucket: 'my-minio-bucket',
|
|
@@ -105,13 +96,13 @@ export interface S3Config {
|
|
|
105
96
|
* },
|
|
106
97
|
* nativeS3Configuration: {
|
|
107
98
|
* endpoint: process.env.MINIO_ENDPOINT ?? 'http://localhost:9000',
|
|
108
|
-
*
|
|
99
|
+
* forcePathStyle: true,
|
|
109
100
|
* signatureVersion: 'v4',
|
|
110
101
|
* },
|
|
111
102
|
* }),
|
|
112
103
|
* }),
|
|
113
104
|
* ```
|
|
114
|
-
* @docsCategory
|
|
105
|
+
* @docsCategory core plugins/AssetServerPlugin
|
|
115
106
|
* @docsPage S3AssetStorageStrategy
|
|
116
107
|
*/
|
|
117
108
|
export declare function configureS3AssetStorage(s3Config: S3Config): (options: AssetServerOptions) => S3AssetStorageStrategy;
|
|
@@ -119,12 +110,12 @@ export declare function configureS3AssetStorage(s3Config: S3Config): (options: A
|
|
|
119
110
|
* @description
|
|
120
111
|
* An {@link AssetStorageStrategy} which uses [Amazon S3](https://aws.amazon.com/s3/) object storage service.
|
|
121
112
|
* To us this strategy you must first have access to an AWS account.
|
|
122
|
-
* See their [getting started guide](https://aws.amazon.com/s3/getting-started
|
|
113
|
+
* See their [getting started guide](https://aws.amazon.com/s3/getting-started/) for how to get set up.
|
|
123
114
|
*
|
|
124
|
-
* Before using this strategy, make sure you have the `aws-sdk` package installed:
|
|
115
|
+
* Before using this strategy, make sure you have the `@aws-sdk/client-s3` and `@aws-sdk/lib-storage` package installed:
|
|
125
116
|
*
|
|
126
117
|
* ```sh
|
|
127
|
-
* npm install aws-sdk
|
|
118
|
+
* npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
|
|
128
119
|
* ```
|
|
129
120
|
*
|
|
130
121
|
* **Note:** Rather than instantiating this manually, use the {@link configureS3AssetStorage} function.
|
|
@@ -141,18 +132,21 @@ export declare class S3AssetStorageStrategy implements AssetStorageStrategy {
|
|
|
141
132
|
private s3Config;
|
|
142
133
|
readonly toAbsoluteUrl: (request: Request, identifier: string) => string;
|
|
143
134
|
private AWS;
|
|
144
|
-
private
|
|
135
|
+
private libStorage;
|
|
136
|
+
private s3Client;
|
|
145
137
|
constructor(s3Config: S3Config, toAbsoluteUrl: (request: Request, identifier: string) => string);
|
|
146
138
|
init(): Promise<void>;
|
|
147
139
|
destroy?: (() => void | Promise<void>) | undefined;
|
|
148
140
|
writeFileFromBuffer(fileName: string, data: Buffer): Promise<string>;
|
|
149
|
-
writeFileFromStream(fileName: string, data:
|
|
141
|
+
writeFileFromStream(fileName: string, data: Readable): Promise<string>;
|
|
150
142
|
readFileToBuffer(identifier: string): Promise<Buffer>;
|
|
151
|
-
readFileToStream(identifier: string): Promise<
|
|
143
|
+
readFileToStream(identifier: string): Promise<Readable>;
|
|
144
|
+
private readFile;
|
|
145
|
+
private writeFile;
|
|
152
146
|
deleteFile(identifier: string): Promise<void>;
|
|
153
147
|
fileExists(fileName: string): Promise<boolean>;
|
|
154
148
|
private getObjectParams;
|
|
155
|
-
private getS3Credentials;
|
|
156
149
|
private ensureBucket;
|
|
150
|
+
private getCredentials;
|
|
157
151
|
private isCredentialsProfile;
|
|
158
152
|
}
|