medusa-plugin-r2 1.0.0-canary.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.
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ const widgetModule = { widgets: [] };
3
+ const routeModule = {
4
+ routes: []
5
+ };
6
+ const menuItemModule = {
7
+ menuItems: []
8
+ };
9
+ const formModule = { customFields: {} };
10
+ const displayModule = {
11
+ displays: {}
12
+ };
13
+ const i18nModule = { resources: {} };
14
+ const plugin = {
15
+ widgetModule,
16
+ routeModule,
17
+ menuItemModule,
18
+ formModule,
19
+ displayModule,
20
+ i18nModule
21
+ };
22
+ module.exports = plugin;
@@ -0,0 +1,23 @@
1
+ const widgetModule = { widgets: [] };
2
+ const routeModule = {
3
+ routes: []
4
+ };
5
+ const menuItemModule = {
6
+ menuItems: []
7
+ };
8
+ const formModule = { customFields: {} };
9
+ const displayModule = {
10
+ displays: {}
11
+ };
12
+ const i18nModule = { resources: {} };
13
+ const plugin = {
14
+ widgetModule,
15
+ routeModule,
16
+ menuItemModule,
17
+ formModule,
18
+ displayModule,
19
+ i18nModule
20
+ };
21
+ export {
22
+ plugin as default
23
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const providers_1 = require("../providers");
5
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.FILE, {
6
+ services: [providers_1.R2FileProvider]
7
+ });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFtRTtBQUNuRSw0Q0FBNkM7QUFFN0Msa0JBQWUsSUFBQSxzQkFBYyxFQUFDLGVBQU8sQ0FBQyxJQUFJLEVBQUU7SUFDM0MsUUFBUSxFQUFFLENBQUMsMEJBQWMsQ0FBQztDQUMxQixDQUFDLENBQUEifQ==
@@ -0,0 +1,247 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.R2FileProvider = void 0;
7
+ const client_s3_1 = require("@aws-sdk/client-s3");
8
+ const lib_storage_1 = require("@aws-sdk/lib-storage");
9
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
10
+ const utils_1 = require("@medusajs/framework/utils");
11
+ const path_1 = __importDefault(require("path"));
12
+ const stream_1 = require("stream");
13
+ const ulid_1 = require("ulid");
14
+ const DEFAULT_UPLOAD_EXPIRATION_DURATION_SECONDS = 60 * 60;
15
+ class R2FileProvider extends utils_1.AbstractFileProviderService {
16
+ constructor({ logger }, options) {
17
+ super();
18
+ if (!options.accessKeyId || !options.secretAccessKey) {
19
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Access key ID and secret access key are required when using access key authentication`);
20
+ }
21
+ this.config_ = {
22
+ region: options.region,
23
+ bucket: options.bucket,
24
+ accessKeyId: options.accessKeyId,
25
+ secretAccessKey: options.secretAccessKey,
26
+ fileUrl: options.fileUrl,
27
+ endpoint: options.endpoint,
28
+ globalPrefix: options.globalPrefix ?? '',
29
+ cacheControl: options.cacheControl ?? 'public, max-age=31536000',
30
+ downloadFileDuration: options.downloadFileDuration ?? 60 * 60,
31
+ additionalClientConfig: options.additionalClientConfig ?? {},
32
+ // Private bucket options
33
+ privateRegion: options.privateRegion,
34
+ privateBucket: options.privateBucket,
35
+ privateAccessKeyId: options.privateAccessKeyId,
36
+ privateSecretAccessKey: options.privateSecretAccessKey,
37
+ privateEndpoint: options.privateEndpoint
38
+ };
39
+ this.logger_ = logger;
40
+ this.client_ = this.getClient();
41
+ this.privateClient_ = this.getClient(true);
42
+ }
43
+ getClient(priv = false) {
44
+ if (priv) {
45
+ if (!this.config_.privateAccessKeyId ||
46
+ !this.config_.privateSecretAccessKey ||
47
+ !this.config_.privateBucket ||
48
+ !this.config_.privateEndpoint) {
49
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Private bucket configuration is incomplete. Please provide privateAccessKeyId, privateSecretAccessKey, privateBucket, and privateEndpoint in the configuration.`);
50
+ }
51
+ const config = {
52
+ credentials: {
53
+ accessKeyId: this.config_.privateAccessKeyId,
54
+ secretAccessKey: this.config_.privateSecretAccessKey
55
+ },
56
+ region: this.config_.privateRegion,
57
+ endpoint: this.config_.privateEndpoint,
58
+ ...this.config_.additionalClientConfig
59
+ };
60
+ return new client_s3_1.S3Client(config);
61
+ }
62
+ const config = {
63
+ credentials: {
64
+ accessKeyId: this.config_.accessKeyId,
65
+ secretAccessKey: this.config_.secretAccessKey
66
+ },
67
+ region: this.config_.region,
68
+ endpoint: this.config_.endpoint,
69
+ ...this.config_.additionalClientConfig
70
+ };
71
+ return new client_s3_1.S3Client(config);
72
+ }
73
+ async upload(file) {
74
+ const prefix = file.prefix ?? '';
75
+ if (!file) {
76
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No file provided`);
77
+ }
78
+ if (!file.filename) {
79
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No filename provided`);
80
+ }
81
+ const parsedFilename = path_1.default.parse(file.filename);
82
+ const fileKey = `${this.config_.globalPrefix}${prefix}${parsedFilename.name}-${(0, ulid_1.ulid)()}${parsedFilename.ext}`;
83
+ let content;
84
+ try {
85
+ const decoded = Buffer.from(file.content, 'base64');
86
+ if (decoded.toString('base64') === file.content) {
87
+ content = decoded;
88
+ }
89
+ else {
90
+ content = Buffer.from(file.content, 'utf8');
91
+ }
92
+ }
93
+ catch {
94
+ // Last-resort fallback: binary
95
+ content = Buffer.from(file.content, 'binary');
96
+ }
97
+ const command = new client_s3_1.PutObjectCommand({
98
+ Bucket: file.access === 'public' ? this.config_.bucket : this.config_.privateBucket,
99
+ Body: content,
100
+ Key: fileKey,
101
+ ContentType: file.mimeType,
102
+ CacheControl: this.config_.cacheControl,
103
+ // Note: We could potentially set the content disposition when uploading,
104
+ // but storing the original filename as metadata should suffice.
105
+ Metadata: {
106
+ 'original-filename': encodeURIComponent(file.filename)
107
+ }
108
+ });
109
+ try {
110
+ const client = file.access === 'public' ? this.client_ : this.privateClient_;
111
+ await client.send(command);
112
+ }
113
+ catch (e) {
114
+ this.logger_.error(e);
115
+ throw e;
116
+ }
117
+ const url = file.access === 'public' ? `${this.config_.fileUrl}/${encodeURIComponent(fileKey)}` : '';
118
+ return {
119
+ url,
120
+ key: fileKey
121
+ };
122
+ }
123
+ async getUploadStream(fileData) {
124
+ if (!fileData.filename) {
125
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No filename provided`);
126
+ }
127
+ const prefix = fileData.prefix ?? '';
128
+ const parsedFilename = path_1.default.parse(fileData.filename);
129
+ const fileKey = `${this.config_.globalPrefix}${prefix}${parsedFilename.name}-${(0, ulid_1.ulid)()}${parsedFilename.ext}`;
130
+ const pass = new stream_1.PassThrough();
131
+ const upload = new lib_storage_1.Upload({
132
+ client: fileData.access === 'public' ? this.client_ : this.privateClient_,
133
+ params: {
134
+ Bucket: fileData.access === 'public' ? this.config_.bucket : this.config_.privateBucket,
135
+ Key: fileKey,
136
+ Body: pass,
137
+ ContentType: fileData.mimeType,
138
+ CacheControl: this.config_.cacheControl,
139
+ Metadata: {
140
+ 'original-filename': encodeURIComponent(fileData.filename)
141
+ }
142
+ }
143
+ });
144
+ const promise = upload.done().then(() => ({
145
+ url: fileData.access === 'public' ? `${this.config_.fileUrl}/${fileKey}` : '',
146
+ key: fileKey
147
+ }));
148
+ return {
149
+ writeStream: pass,
150
+ promise,
151
+ url: `${this.config_.fileUrl}/${fileKey}`,
152
+ fileKey
153
+ };
154
+ }
155
+ async delete(files) {
156
+ try {
157
+ /**
158
+ * Bulk delete files
159
+ */
160
+ if (Array.isArray(files)) {
161
+ await this.client_.send(new client_s3_1.DeleteObjectsCommand({
162
+ Bucket: this.config_.bucket,
163
+ Delete: {
164
+ Objects: files.map(file => ({
165
+ Key: file.fileKey
166
+ })),
167
+ Quiet: true
168
+ }
169
+ }));
170
+ }
171
+ else {
172
+ const client = files.access === 'public' ? this.client_ : this.privateClient_;
173
+ await client.send(new client_s3_1.DeleteObjectCommand({
174
+ Bucket: files.access === 'public' ? this.config_.bucket : this.config_.privateBucket,
175
+ Key: files.fileKey
176
+ }));
177
+ }
178
+ }
179
+ catch (e) {
180
+ // TODO: Rethrow depending on the error (eg. a file not found error is fine, but a failed request should be rethrown)
181
+ this.logger_.error(e);
182
+ }
183
+ }
184
+ async getPresignedDownloadUrl(fileData) {
185
+ // For r2, only the private bucket supports presigned urls
186
+ if (fileData.access === 'public') {
187
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Presigned URLs are not supported for public files.`);
188
+ }
189
+ // TODO: Allow passing content disposition when getting a presigned URL
190
+ const command = new client_s3_1.GetObjectCommand({
191
+ Bucket: this.config_.privateBucket,
192
+ Key: `${fileData.fileKey}`
193
+ });
194
+ return await (0, s3_request_presigner_1.getSignedUrl)(this.client_, command, {
195
+ expiresIn: this.config_.downloadFileDuration
196
+ });
197
+ }
198
+ async getPresignedUploadUrl(fileData) {
199
+ // For r2, only the private bucket supports presigned urls
200
+ if (fileData.access === 'public') {
201
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Presigned URLs are not supported for public files.`);
202
+ }
203
+ if (!fileData?.filename) {
204
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No filename provided`);
205
+ }
206
+ const fileKey = `${this.config_.globalPrefix}${fileData.filename}`;
207
+ const command = new client_s3_1.PutObjectCommand({
208
+ Bucket: this.config_.privateBucket,
209
+ ContentType: fileData.mimeType,
210
+ Key: fileKey
211
+ });
212
+ const signedUrl = await (0, s3_request_presigner_1.getSignedUrl)(this.privateClient_, command, {
213
+ expiresIn: fileData.expiresIn ?? DEFAULT_UPLOAD_EXPIRATION_DURATION_SECONDS
214
+ });
215
+ return {
216
+ url: signedUrl,
217
+ key: fileKey
218
+ };
219
+ }
220
+ async getDownloadStream(file) {
221
+ if (!file?.fileKey) {
222
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No fileKey provided`);
223
+ }
224
+ const fileKey = file.fileKey;
225
+ const client = file.access === 'public' ? this.client_ : this.privateClient_;
226
+ const response = await client.send(new client_s3_1.GetObjectCommand({
227
+ Key: fileKey,
228
+ Bucket: file.access === 'public' ? this.config_.bucket : this.config_.privateBucket
229
+ }));
230
+ return response.Body;
231
+ }
232
+ async getAsBuffer(file) {
233
+ if (!file?.fileKey) {
234
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No fileKey provided`);
235
+ }
236
+ const fileKey = file.fileKey;
237
+ const client = file.access === 'public' ? this.client_ : this.privateClient_;
238
+ const response = await client.send(new client_s3_1.GetObjectCommand({
239
+ Key: fileKey,
240
+ Bucket: file.access === 'public' ? this.config_.bucket : this.config_.privateBucket
241
+ }));
242
+ return Buffer.from(await response.Body.transformToByteArray());
243
+ }
244
+ }
245
+ exports.R2FileProvider = R2FileProvider;
246
+ R2FileProvider.identifier = 'r2';
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQU8yQjtBQUMzQixzREFBNkM7QUFDN0Msd0VBQTREO0FBRTVELHFEQUFvRjtBQUNwRixnREFBdUI7QUFDdkIsbUNBQXdEO0FBQ3hELCtCQUEyQjtBQXdCM0IsTUFBTSwwQ0FBMEMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFBO0FBRTFELE1BQWEsY0FBZSxTQUFRLG1DQUEyQjtJQU85RCxZQUFZLEVBQUUsTUFBTSxFQUF3QixFQUFFLE9BQTZCO1FBQzFFLEtBQUssRUFBRSxDQUFBO1FBRVAsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsdUZBQXVGLENBQ3ZGLENBQUE7UUFDRixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNkLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtZQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUU7WUFDeEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksMEJBQTBCO1lBQ2hFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUM3RCxzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCLElBQUksRUFBRTtZQUM1RCx5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
package/README.md ADDED
@@ -0,0 +1 @@
1
+
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "medusa-plugin-r2",
3
+ "version": "1.0.0-canary.0",
4
+ "description": "R2 file storage provider for Medusa v2",
5
+ "author": "Lacey Pevey",
6
+ "license": "MIT",
7
+ "files": [
8
+ ".medusa/server"
9
+ ],
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
13
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
14
+ "./providers/*": "./.medusa/server/src/providers/*/index.js",
15
+ "./*": "./.medusa/server/src/*.js"
16
+ },
17
+ "keywords": [
18
+ "medusa",
19
+ "plugin",
20
+ "medusa-plugin-r2",
21
+ "medusa r2",
22
+ "medusa-v2",
23
+ "r2",
24
+ "cloudflare r2",
25
+ "file",
26
+ "file storage",
27
+ "file provider"
28
+ ],
29
+ "scripts": {
30
+ "prebuild": "node ./scripts/check-node-version.cjs",
31
+ "build": "medusa plugin:build",
32
+ "dev": "medusa plugin:develop",
33
+ "prepublishOnly": "node ./scripts/check-node-version.cjs && medusa plugin:build",
34
+ "test:unit": "TEST_TYPE=unit NODE_OPTIONS=--experimental-vm-modules jest --silent --runInBand --detectOpenHandles --forceExit"
35
+ },
36
+ "dependencies": {
37
+ "@aws-sdk/client-sesv2": "^3.1019.0",
38
+ "nodemailer": "^8.0.4"
39
+ },
40
+ "devDependencies": {
41
+ "@medusajs/admin-sdk": "2.12.4",
42
+ "@medusajs/cli": "2.12.4",
43
+ "@medusajs/framework": "2.12.4",
44
+ "@medusajs/icons": "2.12.4",
45
+ "@medusajs/medusa": "2.12.4",
46
+ "@medusajs/test-utils": "2.12.4",
47
+ "@medusajs/ui": "4.0.25",
48
+ "@swc/core": "^1.7.28",
49
+ "@swc/jest": "^0.2.39",
50
+ "@types/jest": "^30.0.0",
51
+ "@types/node": "^20.0.0",
52
+ "@types/nodemailer": "^8.0.0",
53
+ "@types/react": "^18.3.2",
54
+ "@types/react-dom": "^18.2.25",
55
+ "jest": "^29.7.0",
56
+ "prop-types": "^15.8.1",
57
+ "react": "^18.2.0",
58
+ "react-dom": "^18.2.0",
59
+ "ts-node": "^10.9.2",
60
+ "typescript": "^5.6.2",
61
+ "vite": "^5.2.11",
62
+ "yalc": "^1.0.0-pre.53"
63
+ },
64
+ "peerDependencies": {
65
+ "@medusajs/admin-sdk": "2.12.4",
66
+ "@medusajs/cli": "2.12.4",
67
+ "@medusajs/framework": "2.12.4",
68
+ "@medusajs/icons": "2.12.4",
69
+ "@medusajs/medusa": "2.12.4",
70
+ "@medusajs/test-utils": "2.12.4",
71
+ "@medusajs/ui": "4.0.25"
72
+ },
73
+ "engines": {
74
+ "node": ">=20 <25"
75
+ }
76
+ }