@acmekit/file-local 2.13.1
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/README.md +0 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/services/local-file.d.ts +31 -0
- package/dist/services/local-file.d.ts.map +1 -0
- package/dist/services/local-file.js +171 -0
- package/dist/services/local-file.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
File without changes
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,CAAA;;AAI3B,wBAEE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalFileService = void 0;
|
|
4
|
+
const utils_1 = require("@acmekit/framework/utils");
|
|
5
|
+
const local_file_1 = require("./services/local-file");
|
|
6
|
+
Object.defineProperty(exports, "LocalFileService", { enumerable: true, get: function () { return local_file_1.LocalFileService; } });
|
|
7
|
+
const services = [local_file_1.LocalFileService];
|
|
8
|
+
exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.FILE, {
|
|
9
|
+
services,
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oDAAkE;AAClE,sDAAwD;AAC/C,iGADA,6BAAgB,OACA;AAEzB,MAAM,QAAQ,GAAG,CAAC,6BAAgB,CAAC,CAAA;AAEnC,kBAAe,IAAA,sBAAc,EAAC,eAAO,CAAC,IAAI,EAAE;IAC1C,QAAQ;CACT,CAAC,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FileTypes, LocalFileServiceOptions } from "@acmekit/framework/types";
|
|
2
|
+
import { AbstractFileProviderService } from "@acmekit/framework/utils";
|
|
3
|
+
import type { Readable, Writable } from "stream";
|
|
4
|
+
export declare class LocalFileService extends AbstractFileProviderService {
|
|
5
|
+
static identifier: string;
|
|
6
|
+
protected uploadDir_: string;
|
|
7
|
+
protected privateUploadDir_: string;
|
|
8
|
+
protected backendUrl_: string;
|
|
9
|
+
constructor(_: any, options: LocalFileServiceOptions);
|
|
10
|
+
upload(file: FileTypes.ProviderUploadFileDTO): Promise<FileTypes.ProviderFileResultDTO>;
|
|
11
|
+
getUploadStream(fileData: FileTypes.ProviderUploadStreamDTO): Promise<{
|
|
12
|
+
writeStream: Writable;
|
|
13
|
+
promise: Promise<FileTypes.ProviderFileResultDTO>;
|
|
14
|
+
url: string;
|
|
15
|
+
fileKey: string;
|
|
16
|
+
}>;
|
|
17
|
+
delete(files: FileTypes.ProviderDeleteFileDTO | FileTypes.ProviderDeleteFileDTO[]): Promise<void>;
|
|
18
|
+
getDownloadStream(file: FileTypes.ProviderGetFileDTO): Promise<Readable>;
|
|
19
|
+
getAsBuffer(file: FileTypes.ProviderGetFileDTO): Promise<Buffer>;
|
|
20
|
+
getPresignedDownloadUrl(file: FileTypes.ProviderGetFileDTO): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the pre-signed URL that the client (frontend) can use to trigger
|
|
23
|
+
* a file upload. In this case, the AcmeKit backend will implement the
|
|
24
|
+
* "/upload" endpoint to perform the file upload.
|
|
25
|
+
*/
|
|
26
|
+
getPresignedUploadUrl(fileData: FileTypes.ProviderGetPresignedUploadUrlDTO): Promise<FileTypes.ProviderFileResultDTO>;
|
|
27
|
+
private getUploadFilePath;
|
|
28
|
+
private getUploadFileUrl;
|
|
29
|
+
private ensureDirExists;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=local-file.d.ts.map
|
|
@@ -0,0 +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,0BAA0B,CAAA;AAC7E,OAAO,EACL,2BAA2B,EAE5B,MAAM,0BAA0B,CAAA;AAIjC,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEhD,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;IAazC,MAAM,CACV,IAAI,EAAE,SAAS,CAAC,qBAAqB,GACpC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAiDrC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,uBAAuB,GAAG,OAAO,CAAC;QAC1E,WAAW,EAAE,QAAQ,CAAA;QACrB,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAA;QACjD,GAAG,EAAE,MAAM,CAAA;QACX,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC;IAgDI,MAAM,CACV,KAAK,EAAE,SAAS,CAAC,qBAAqB,GAAG,SAAS,CAAC,qBAAqB,EAAE,GACzE,OAAO,CAAC,IAAI,CAAC;IAyBV,iBAAiB,CACrB,IAAI,EAAE,SAAS,CAAC,kBAAkB,GACjC,OAAO,CAAC,QAAQ,CAAC;IASd,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUhE,uBAAuB,CAC3B,IAAI,EAAE,SAAS,CAAC,kBAAkB,GACjC,OAAO,CAAC,MAAM,CAAC;IAkBlB;;;;OAIG;IACG,qBAAqB,CACzB,QAAQ,EAAE,SAAS,CAAC,gCAAgC,GACnD,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC;IAc3C,OAAO,CAAC,iBAAiB,CAExB;IAED,OAAO,CAAC,gBAAgB,CAIvB;YAEa,eAAe;CAU9B"}
|
|
@@ -0,0 +1,171 @@
|
|
|
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.LocalFileService = void 0;
|
|
7
|
+
const utils_1 = require("@acmekit/framework/utils");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
class LocalFileService extends utils_1.AbstractFileProviderService {
|
|
12
|
+
constructor(_, options) {
|
|
13
|
+
super();
|
|
14
|
+
this.getUploadFilePath = (baseDir, fileKey) => {
|
|
15
|
+
return path_1.default.join(baseDir, fileKey);
|
|
16
|
+
};
|
|
17
|
+
this.getUploadFileUrl = (fileKey) => {
|
|
18
|
+
const baseUrl = new URL(this.backendUrl_);
|
|
19
|
+
baseUrl.pathname = path_1.default.join(baseUrl.pathname, fileKey);
|
|
20
|
+
return baseUrl.href;
|
|
21
|
+
};
|
|
22
|
+
this.uploadDir_ = options?.upload_dir || path_1.default.join(process.cwd(), "static");
|
|
23
|
+
// Since there is no way to serve private files through a static server, we simply place them in `static`.
|
|
24
|
+
// This means that the files will be available publicly if the filename is known. Since the local file provider
|
|
25
|
+
// is for development only, this shouldn't be an issue. If you really want to use it in production (and you shouldn't)
|
|
26
|
+
// You can change the private upload dir to `/private` but none of the functionalities where you use a presigned URL will work.
|
|
27
|
+
this.privateUploadDir_ =
|
|
28
|
+
options?.private_upload_dir || path_1.default.join(process.cwd(), "static");
|
|
29
|
+
this.backendUrl_ = options?.backend_url || "http://localhost:9000/static";
|
|
30
|
+
}
|
|
31
|
+
async upload(file) {
|
|
32
|
+
if (!file) {
|
|
33
|
+
throw new utils_1.AcmeKitError(utils_1.AcmeKitError.Types.INVALID_DATA, `No file provided`);
|
|
34
|
+
}
|
|
35
|
+
if (!file.filename) {
|
|
36
|
+
throw new utils_1.AcmeKitError(utils_1.AcmeKitError.Types.INVALID_DATA, `No filename provided`);
|
|
37
|
+
}
|
|
38
|
+
const parsedFilename = path_1.default.parse(file.filename);
|
|
39
|
+
const baseDir = file.access === "public" ? this.uploadDir_ : this.privateUploadDir_;
|
|
40
|
+
await this.ensureDirExists(baseDir, parsedFilename.dir);
|
|
41
|
+
const fileKey = path_1.default.join(parsedFilename.dir,
|
|
42
|
+
// We prepend "private" to the file key so deletions and presigned URLs can know which folder to look into
|
|
43
|
+
`${file.access === "public" ? "" : "private-"}${Date.now()}-${parsedFilename.base}`);
|
|
44
|
+
const filePath = this.getUploadFilePath(baseDir, fileKey);
|
|
45
|
+
const fileUrl = this.getUploadFileUrl(fileKey);
|
|
46
|
+
let content;
|
|
47
|
+
try {
|
|
48
|
+
const decoded = Buffer.from(file.content, "base64");
|
|
49
|
+
if (decoded.toString("base64") === file.content) {
|
|
50
|
+
content = decoded;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
content = Buffer.from(file.content, "utf8");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Last-resort fallback: binary
|
|
58
|
+
content = Buffer.from(file.content, "binary");
|
|
59
|
+
}
|
|
60
|
+
await promises_1.default.writeFile(filePath, content);
|
|
61
|
+
return {
|
|
62
|
+
key: fileKey,
|
|
63
|
+
url: fileUrl,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async getUploadStream(fileData) {
|
|
67
|
+
if (!fileData.filename) {
|
|
68
|
+
throw new utils_1.AcmeKitError(utils_1.AcmeKitError.Types.INVALID_DATA, `No filename provided`);
|
|
69
|
+
}
|
|
70
|
+
const parsedFilename = path_1.default.parse(fileData.filename);
|
|
71
|
+
const baseDir = fileData.access === "public" ? this.uploadDir_ : this.privateUploadDir_;
|
|
72
|
+
await this.ensureDirExists(baseDir, parsedFilename.dir);
|
|
73
|
+
const fileKey = path_1.default.join(parsedFilename.dir,
|
|
74
|
+
// We prepend "private" to the file key so deletions and presigned URLs can know which folder to look into
|
|
75
|
+
`${fileData.access === "public" ? "" : "private-"}${Date.now()}-${parsedFilename.base}`);
|
|
76
|
+
const filePath = this.getUploadFilePath(baseDir, fileKey);
|
|
77
|
+
const fileUrl = this.getUploadFileUrl(fileKey);
|
|
78
|
+
const writeStream = (0, fs_1.createWriteStream)(filePath);
|
|
79
|
+
const promise = new Promise((resolve, reject) => {
|
|
80
|
+
writeStream.on("finish", () => {
|
|
81
|
+
resolve({
|
|
82
|
+
url: fileUrl,
|
|
83
|
+
key: fileKey,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
writeStream.on("error", (err) => {
|
|
87
|
+
reject(err);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
writeStream,
|
|
92
|
+
promise,
|
|
93
|
+
url: fileUrl,
|
|
94
|
+
fileKey,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
async delete(files) {
|
|
98
|
+
files = Array.isArray(files) ? files : [files];
|
|
99
|
+
await Promise.all(files.map(async (file) => {
|
|
100
|
+
const baseDir = file.fileKey.startsWith("private-")
|
|
101
|
+
? this.privateUploadDir_
|
|
102
|
+
: this.uploadDir_;
|
|
103
|
+
const filePath = this.getUploadFilePath(baseDir, file.fileKey);
|
|
104
|
+
try {
|
|
105
|
+
await promises_1.default.access(filePath, promises_1.default.constants.W_OK);
|
|
106
|
+
await promises_1.default.unlink(filePath);
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
// The file does not exist, we don't do anything
|
|
110
|
+
if (e.code !== "ENOENT") {
|
|
111
|
+
throw e;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
async getDownloadStream(file) {
|
|
118
|
+
const baseDir = file.fileKey.startsWith("private-")
|
|
119
|
+
? this.privateUploadDir_
|
|
120
|
+
: this.uploadDir_;
|
|
121
|
+
const filePath = this.getUploadFilePath(baseDir, file.fileKey);
|
|
122
|
+
return (0, fs_1.createReadStream)(filePath);
|
|
123
|
+
}
|
|
124
|
+
async getAsBuffer(file) {
|
|
125
|
+
const baseDir = file.fileKey.startsWith("private-")
|
|
126
|
+
? this.privateUploadDir_
|
|
127
|
+
: this.uploadDir_;
|
|
128
|
+
const filePath = this.getUploadFilePath(baseDir, file.fileKey);
|
|
129
|
+
return promises_1.default.readFile(filePath);
|
|
130
|
+
}
|
|
131
|
+
// The local file provider doesn't support presigned URLs for private files (i.e files not placed in /static).
|
|
132
|
+
async getPresignedDownloadUrl(file) {
|
|
133
|
+
const isPrivate = file.fileKey.startsWith("private-");
|
|
134
|
+
const baseDir = isPrivate ? this.privateUploadDir_ : this.uploadDir_;
|
|
135
|
+
const filePath = this.getUploadFilePath(baseDir, file.fileKey);
|
|
136
|
+
try {
|
|
137
|
+
await promises_1.default.access(filePath, promises_1.default.constants.F_OK);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
throw new utils_1.AcmeKitError(utils_1.AcmeKitError.Types.NOT_FOUND, `File with key ${file.fileKey} not found`);
|
|
141
|
+
}
|
|
142
|
+
return this.getUploadFileUrl(file.fileKey);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Returns the pre-signed URL that the client (frontend) can use to trigger
|
|
146
|
+
* a file upload. In this case, the AcmeKit backend will implement the
|
|
147
|
+
* "/upload" endpoint to perform the file upload.
|
|
148
|
+
*/
|
|
149
|
+
async getPresignedUploadUrl(fileData) {
|
|
150
|
+
if (!fileData?.filename) {
|
|
151
|
+
throw new utils_1.AcmeKitError(utils_1.AcmeKitError.Types.INVALID_DATA, `No filename provided`);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
url: "/admin/uploads",
|
|
155
|
+
key: fileData.filename,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async ensureDirExists(baseDir, dirPath) {
|
|
159
|
+
const relativePath = path_1.default.join(baseDir, dirPath);
|
|
160
|
+
try {
|
|
161
|
+
await promises_1.default.access(relativePath, promises_1.default.constants.F_OK);
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
await promises_1.default.mkdir(relativePath, { recursive: true });
|
|
165
|
+
}
|
|
166
|
+
return relativePath;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.LocalFileService = LocalFileService;
|
|
170
|
+
LocalFileService.identifier = "localfs";
|
|
171
|
+
//# sourceMappingURL=local-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-file.js","sourceRoot":"","sources":["../../src/services/local-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../src/index.ts","../src/services/local-file.ts"],"version":"5.9.3"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@acmekit/file-local",
|
|
3
|
+
"version": "2.13.1",
|
|
4
|
+
"description": "Local filesystem file storage for AcmeKit",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/acmekit/acmekit",
|
|
9
|
+
"directory": "packages/modules/providers/file-local"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"!dist/**/__tests__",
|
|
14
|
+
"!dist/**/__mocks__",
|
|
15
|
+
"!dist/**/__fixtures__"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=20"
|
|
19
|
+
},
|
|
20
|
+
"author": "AcmeKit",
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "../../../../node_modules/.bin/jest --passWithNoTests src",
|
|
24
|
+
"test:integration": "../../../../node_modules/.bin/jest --passWithNoTests --forceExit --testPathPattern=\"integration-tests/__tests__/[^/]*\\.spec\\.ts\"",
|
|
25
|
+
"build": "yarn run -T rimraf dist && yarn run -T tsc --build ./tsconfig.json",
|
|
26
|
+
"watch": "yarn run -T tsc --watch"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@acmekit/framework": "2.13.1"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@acmekit/framework": "2.13.1"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"acmekit-plugin",
|
|
36
|
+
"acmekit-plugin-file"
|
|
37
|
+
]
|
|
38
|
+
}
|