@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 ADDED
File without changes
@@ -0,0 +1,5 @@
1
+ import { LocalFileService } from "./services/local-file";
2
+ export { LocalFileService };
3
+ declare const _default: import("@acmekit/types").ModuleProviderExports;
4
+ export default _default;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }