@medusajs/file-local-next 0.0.3-snapshot-20240718073308 → 0.0.3-snapshot-20240719080828
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.
@@ -3,11 +3,12 @@ import { AbstractFileProviderService } from "@medusajs/utils";
|
|
3
3
|
export declare class LocalFileService extends AbstractFileProviderService {
|
4
4
|
static identifier: string;
|
5
5
|
protected uploadDir_: string;
|
6
|
+
protected privateUploadDir_: string;
|
6
7
|
protected backendUrl_: string;
|
7
8
|
constructor(_: any, options: LocalFileServiceOptions);
|
8
9
|
upload(file: FileTypes.ProviderUploadFileDTO): Promise<FileTypes.ProviderFileResultDTO>;
|
9
10
|
delete(file: FileTypes.ProviderDeleteFileDTO): Promise<void>;
|
10
|
-
getPresignedDownloadUrl(
|
11
|
+
getPresignedDownloadUrl(file: FileTypes.ProviderGetFileDTO): Promise<string>;
|
11
12
|
private getUploadFilePath;
|
12
13
|
private getUploadFileUrl;
|
13
14
|
private ensureDirExists;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"local-file.d.ts","sourceRoot":"","sources":["../../src/services/local-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EAAE,2BAA2B,EAAe,MAAM,iBAAiB,CAAA;AAI1E,qBAAa,gBAAiB,SAAQ,2BAA2B;IAC/D,MAAM,CAAC,UAAU,SAAY;IAC7B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,WAAW,EAAE,MAAM,CAAA;gBAEjB,CAAC,KAAA,EAAE,OAAO,EAAE,uBAAuB;
|
1
|
+
{"version":3,"file":"local-file.d.ts","sourceRoot":"","sources":["../../src/services/local-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,EAAE,2BAA2B,EAAe,MAAM,iBAAiB,CAAA;AAI1E,qBAAa,gBAAiB,SAAQ,2BAA2B;IAC/D,MAAM,CAAC,UAAU,SAAY;IAC7B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAA;IAC5B,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAA;IACnC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAA;gBAEjB,CAAC,KAAA,EAAE,OAAO,EAAE,uBAAuB;IAQzC,MAAM,CACV,IAAI,EAAE,SAAS,CAAC,qBAAqB,GACpC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAqCrC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5D,uBAAuB,CAC3B,IAAI,EAAE,SAAS,CAAC,kBAAkB,GACjC,OAAO,CAAC,MAAM,CAAC;IAsBlB,OAAO,CAAC,iBAAiB,CAExB;IAED,OAAO,CAAC,gBAAgB,CAIvB;YAEa,eAAe;CAU9B"}
|
@@ -10,8 +10,8 @@ const path_1 = __importDefault(require("path"));
|
|
10
10
|
class LocalFileService extends utils_1.AbstractFileProviderService {
|
11
11
|
constructor(_, options) {
|
12
12
|
super();
|
13
|
-
this.getUploadFilePath = (fileKey) => {
|
14
|
-
return path_1.default.join(
|
13
|
+
this.getUploadFilePath = (baseDir, fileKey) => {
|
14
|
+
return path_1.default.join(baseDir, fileKey);
|
15
15
|
};
|
16
16
|
this.getUploadFileUrl = (fileKey) => {
|
17
17
|
const baseUrl = new URL(this.backendUrl_);
|
@@ -19,6 +19,8 @@ class LocalFileService extends utils_1.AbstractFileProviderService {
|
|
19
19
|
return baseUrl.href;
|
20
20
|
};
|
21
21
|
this.uploadDir_ = options?.upload_dir || path_1.default.join(process.cwd(), "static");
|
22
|
+
this.privateUploadDir_ =
|
23
|
+
options?.private_upload_dir || path_1.default.join(process.cwd(), "private");
|
22
24
|
this.backendUrl_ = options?.backend_url || "http://localhost:9000/static";
|
23
25
|
}
|
24
26
|
async upload(file) {
|
@@ -29,9 +31,12 @@ class LocalFileService extends utils_1.AbstractFileProviderService {
|
|
29
31
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `No filename provided`);
|
30
32
|
}
|
31
33
|
const parsedFilename = path_1.default.parse(file.filename);
|
32
|
-
|
33
|
-
const
|
34
|
-
const
|
34
|
+
const baseDir = file.access === "public" ? this.uploadDir_ : this.privateUploadDir_;
|
35
|
+
const dir = await this.ensureDirExists(baseDir, parsedFilename.dir);
|
36
|
+
const fileKey = path_1.default.join(parsedFilename.dir,
|
37
|
+
// We append "private" to the file key so deletions and presigned URLs can know which folder to look into
|
38
|
+
`${Date.now()}-${parsedFilename.base}${file.access === "public" ? "" : "-private"}`);
|
39
|
+
const filePath = this.getUploadFilePath(baseDir, fileKey);
|
35
40
|
const fileUrl = this.getUploadFileUrl(fileKey);
|
36
41
|
const content = Buffer.from(file.content, "binary");
|
37
42
|
await promises_1.default.writeFile(filePath, content);
|
@@ -41,7 +46,10 @@ class LocalFileService extends utils_1.AbstractFileProviderService {
|
|
41
46
|
};
|
42
47
|
}
|
43
48
|
async delete(file) {
|
44
|
-
const
|
49
|
+
const baseDir = file.fileKey.endsWith("-private")
|
50
|
+
? this.privateUploadDir_
|
51
|
+
: this.uploadDir_;
|
52
|
+
const filePath = this.getUploadFilePath(baseDir, file.fileKey);
|
45
53
|
try {
|
46
54
|
await promises_1.default.access(filePath, promises_1.default.constants.F_OK);
|
47
55
|
await promises_1.default.unlink(filePath);
|
@@ -51,25 +59,34 @@ class LocalFileService extends utils_1.AbstractFileProviderService {
|
|
51
59
|
}
|
52
60
|
return;
|
53
61
|
}
|
54
|
-
|
62
|
+
// For private files, we simply return the file path, which can then be loaded manually by the backend.
|
63
|
+
// The local file provider doesn't support presigned URLs for private files.
|
64
|
+
async getPresignedDownloadUrl(file) {
|
65
|
+
const isPrivate = file.fileKey.endsWith("-private");
|
66
|
+
const baseDir = isPrivate ? this.privateUploadDir_ : this.uploadDir_;
|
67
|
+
const filePath = this.getUploadFilePath(baseDir, file.fileKey);
|
55
68
|
try {
|
56
|
-
await promises_1.default.access(
|
69
|
+
await promises_1.default.access(filePath, promises_1.default.constants.F_OK);
|
57
70
|
}
|
58
71
|
catch {
|
59
|
-
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `File with key ${
|
72
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `File with key ${file.fileKey} not found`);
|
73
|
+
}
|
74
|
+
if (isPrivate) {
|
75
|
+
return filePath;
|
60
76
|
}
|
61
|
-
return this.getUploadFileUrl(
|
77
|
+
return this.getUploadFileUrl(file.fileKey);
|
62
78
|
}
|
63
|
-
async ensureDirExists(dirPath) {
|
64
|
-
const relativePath = path_1.default.join(
|
79
|
+
async ensureDirExists(baseDir, dirPath) {
|
80
|
+
const relativePath = path_1.default.join(baseDir, dirPath);
|
65
81
|
try {
|
66
82
|
await promises_1.default.access(relativePath, promises_1.default.constants.F_OK);
|
67
83
|
}
|
68
84
|
catch (e) {
|
69
85
|
await promises_1.default.mkdir(relativePath, { recursive: true });
|
70
86
|
}
|
87
|
+
return relativePath;
|
71
88
|
}
|
72
89
|
}
|
73
90
|
exports.LocalFileService = LocalFileService;
|
74
91
|
LocalFileService.identifier = "localfs";
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9sb2NhbC1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDJDQUEwRTtBQUMxRSwyREFBNEI7QUFDNUIsZ0RBQXVCO0FBRXZCLE1BQWEsZ0JBQWlCLFNBQVEsbUNBQTJCO0lBTS9ELFlBQVksQ0FBQyxFQUFFLE9BQWdDO1FBQzdDLEtBQUssRUFBRSxDQUFBO1FBd0ZELHNCQUFpQixHQUFHLENBQUMsT0FBZSxFQUFFLE9BQWUsRUFBRSxFQUFFO1lBQy9ELE9BQU8sY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDcEMsQ0FBQyxDQUFBO1FBRU8scUJBQWdCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtZQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDekMsT0FBTyxDQUFDLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDdkQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFBO1FBQ3JCLENBQUMsQ0FBQTtRQS9GQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sRUFBRSxVQUFVLElBQUksY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDM0UsSUFBSSxDQUFDLGlCQUFpQjtZQUNwQixPQUFPLEVBQUUsa0JBQWtCLElBQUksY0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLDhCQUE4QixDQUFBO0lBQzNFLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUNW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
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@medusajs/file-local-next",
|
3
|
-
"version": "0.0.3-snapshot-
|
3
|
+
"version": "0.0.3-snapshot-20240719080828",
|
4
4
|
"description": "Local filesystem file storage for Medusa",
|
5
5
|
"main": "dist/index.js",
|
6
6
|
"repository": {
|
@@ -29,7 +29,7 @@
|
|
29
29
|
"typescript": "^5.3.3"
|
30
30
|
},
|
31
31
|
"dependencies": {
|
32
|
-
"@medusajs/utils": "1.12.0-snapshot-
|
32
|
+
"@medusajs/utils": "1.12.0-snapshot-20240719080828"
|
33
33
|
},
|
34
34
|
"keywords": [
|
35
35
|
"medusa-plugin",
|