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
|
+
}
|