@crowdin/app-project-module 0.98.0-cf-5 → 0.98.0-cf-6
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/out/modules/file-processing/handlers/custom-file-format.d.ts +7 -2
- package/out/modules/file-processing/handlers/custom-file-format.js +59 -19
- package/out/modules/file-processing/handlers/file-download.js +5 -0
- package/out/modules/file-processing/handlers/pre-post-process.js +34 -14
- package/out/modules/file-processing/index.js +12 -2
- package/out/types.d.ts +10 -0
- package/package.json +1 -1
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
/// <reference types="qs" />
|
|
2
2
|
import { Response } from 'express';
|
|
3
|
-
import { CrowdinClientRequest } from '../../../types';
|
|
3
|
+
import { CrowdinClientRequest, FileStore } from '../../../types';
|
|
4
4
|
import { CustomFileFormatLogic } from '../types';
|
|
5
|
-
export default function handle(baseUrl
|
|
5
|
+
export default function handle({ baseUrl, folder, config, fileStore, }: {
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
folder: string;
|
|
8
|
+
config: CustomFileFormatLogic;
|
|
9
|
+
fileStore?: FileStore;
|
|
10
|
+
}): (req: import("express").Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>> | CrowdinClientRequest, res: Response<any, Record<string, any>>, next: Function) => void;
|
|
@@ -17,9 +17,11 @@ const path_1 = __importDefault(require("path"));
|
|
|
17
17
|
const util_1 = require("../../../util");
|
|
18
18
|
const files_1 = require("../util/files");
|
|
19
19
|
const types_1 = require("../types");
|
|
20
|
-
function handle(baseUrl, folder, config) {
|
|
21
|
-
if (!
|
|
22
|
-
fs_1.default.
|
|
20
|
+
function handle({ baseUrl, folder, config, fileStore, }) {
|
|
21
|
+
if (!fileStore) {
|
|
22
|
+
if (!fs_1.default.existsSync(path_1.default.join(folder, 'custom-file-format'))) {
|
|
23
|
+
fs_1.default.mkdirSync(path_1.default.join(folder, 'custom-file-format'), { recursive: true });
|
|
24
|
+
}
|
|
23
25
|
}
|
|
24
26
|
return (0, util_1.runAsyncWrapper)((req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
25
27
|
const baseFilesUrl = `${baseUrl}/file/download`;
|
|
@@ -43,12 +45,32 @@ function handle(baseUrl, folder, config) {
|
|
|
43
45
|
let error;
|
|
44
46
|
switch (body.jobType) {
|
|
45
47
|
case types_1.ProcessFileJobType.BUILD_FILE:
|
|
46
|
-
const buildFileResult = yield handleBuildFile(
|
|
48
|
+
const buildFileResult = yield handleBuildFile({
|
|
49
|
+
baseUrl: baseFilesUrl,
|
|
50
|
+
dataFolder: folder,
|
|
51
|
+
config,
|
|
52
|
+
req: body,
|
|
53
|
+
client: req.crowdinApiClient,
|
|
54
|
+
context: req.crowdinContext,
|
|
55
|
+
projectId: req.crowdinContext.jwtPayload.context.project_id,
|
|
56
|
+
file,
|
|
57
|
+
fileStore,
|
|
58
|
+
});
|
|
47
59
|
response = buildFileResult.response;
|
|
48
60
|
error = buildFileResult.error;
|
|
49
61
|
break;
|
|
50
62
|
case types_1.ProcessFileJobType.PARSE_FILE:
|
|
51
|
-
const parseFileResult = yield handleParseFile(
|
|
63
|
+
const parseFileResult = yield handleParseFile({
|
|
64
|
+
baseUrl: baseFilesUrl,
|
|
65
|
+
dataFolder: folder,
|
|
66
|
+
config,
|
|
67
|
+
req: body,
|
|
68
|
+
client: req.crowdinApiClient,
|
|
69
|
+
context: req.crowdinContext,
|
|
70
|
+
projectId: req.crowdinContext.jwtPayload.context.project_id,
|
|
71
|
+
file,
|
|
72
|
+
fileStore,
|
|
73
|
+
});
|
|
52
74
|
response = parseFileResult.response;
|
|
53
75
|
error = parseFileResult.error;
|
|
54
76
|
break;
|
|
@@ -59,7 +81,7 @@ function handle(baseUrl, folder, config) {
|
|
|
59
81
|
}));
|
|
60
82
|
}
|
|
61
83
|
exports.default = handle;
|
|
62
|
-
function handleBuildFile(baseUrl, dataFolder, config, req, client, context, projectId, file) {
|
|
84
|
+
function handleBuildFile({ baseUrl, dataFolder, config, req, client, context, projectId, file, fileStore, }) {
|
|
63
85
|
return __awaiter(this, void 0, void 0, function* () {
|
|
64
86
|
const response = {};
|
|
65
87
|
if (!req.strings && !req.stringsUrl) {
|
|
@@ -88,19 +110,25 @@ function handleBuildFile(baseUrl, dataFolder, config, req, client, context, proj
|
|
|
88
110
|
}
|
|
89
111
|
else {
|
|
90
112
|
let url;
|
|
91
|
-
if (
|
|
92
|
-
|
|
113
|
+
if (fileStore) {
|
|
114
|
+
const fileRef = yield fileStore.storeFile(res.contentFile);
|
|
115
|
+
url = `${baseUrl}?file=${fileRef}`;
|
|
93
116
|
}
|
|
94
117
|
else {
|
|
95
|
-
|
|
96
|
-
|
|
118
|
+
if (config.storeFile) {
|
|
119
|
+
url = yield config.storeFile(res.contentFile);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const storedFile = yield (0, files_1.storeFile)(res.contentFile, path_1.default.join(dataFolder, 'custom-file-format'));
|
|
123
|
+
url = `${baseUrl}?file=${storedFile}`;
|
|
124
|
+
}
|
|
97
125
|
}
|
|
98
126
|
response.contentUrl = url;
|
|
99
127
|
}
|
|
100
128
|
return { response, error: res.error };
|
|
101
129
|
});
|
|
102
130
|
}
|
|
103
|
-
function handleParseFile(baseUrl, dataFolder, config, req, client, context, projectId, file) {
|
|
131
|
+
function handleParseFile({ baseUrl, dataFolder, config, req, client, context, projectId, file, fileStore, }) {
|
|
104
132
|
return __awaiter(this, void 0, void 0, function* () {
|
|
105
133
|
const response = {};
|
|
106
134
|
if (!config.parseFile || !file) {
|
|
@@ -117,12 +145,18 @@ function handleParseFile(baseUrl, dataFolder, config, req, client, context, proj
|
|
|
117
145
|
}
|
|
118
146
|
else {
|
|
119
147
|
let url;
|
|
120
|
-
if (
|
|
121
|
-
|
|
148
|
+
if (fileStore) {
|
|
149
|
+
const fileRef = yield fileStore.storeFile(res.previewFile);
|
|
150
|
+
url = `${baseUrl}?file=${fileRef}`;
|
|
122
151
|
}
|
|
123
152
|
else {
|
|
124
|
-
|
|
125
|
-
|
|
153
|
+
if (config.storeFile) {
|
|
154
|
+
url = yield config.storeFile(res.previewFile);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const storedFile = yield (0, files_1.storeFile)(res.previewFile, path_1.default.join(dataFolder, 'custom-file-format'));
|
|
158
|
+
url = `${baseUrl}?file=${storedFile}`;
|
|
159
|
+
}
|
|
126
160
|
}
|
|
127
161
|
response.previewUrl = url;
|
|
128
162
|
}
|
|
@@ -145,12 +179,18 @@ function handleParseFile(baseUrl, dataFolder, config, req, client, context, proj
|
|
|
145
179
|
}
|
|
146
180
|
else {
|
|
147
181
|
let url;
|
|
148
|
-
if (
|
|
149
|
-
|
|
182
|
+
if (fileStore) {
|
|
183
|
+
const fileRef = yield fileStore.storeFile(bufferData);
|
|
184
|
+
url = `${baseUrl}?file=${fileRef}`;
|
|
150
185
|
}
|
|
151
186
|
else {
|
|
152
|
-
|
|
153
|
-
|
|
187
|
+
if (config.storeFile) {
|
|
188
|
+
url = yield config.storeFile(bufferData);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const storedFile = yield (0, files_1.storeFile)(bufferData, path_1.default.join(dataFolder, 'custom-file-format'));
|
|
192
|
+
url = `${baseUrl}?file=${storedFile}`;
|
|
193
|
+
}
|
|
154
194
|
}
|
|
155
195
|
response.stringsUrl = url;
|
|
156
196
|
}
|
|
@@ -19,6 +19,11 @@ const logger_1 = require("../../../util/logger");
|
|
|
19
19
|
function handle(config, processingConfig, folderName) {
|
|
20
20
|
const folder = processingConfig.filesFolder || config.dbFolder;
|
|
21
21
|
return (0, util_1.runAsyncWrapper)((req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
if (config.fileStore) {
|
|
23
|
+
const fileContent = yield config.fileStore.getFile(req.query.file);
|
|
24
|
+
res.send(fileContent);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
22
27
|
const filePath = path_1.default.join(folder, folderName, req.query.file);
|
|
23
28
|
(0, logger_1.log)(`Downloading file ${filePath}`);
|
|
24
29
|
res.download(filePath, function (err) {
|
|
@@ -19,8 +19,10 @@ const types_1 = require("../types");
|
|
|
19
19
|
const files_1 = require("../util/files");
|
|
20
20
|
function handle(baseConfig, config, folderName) {
|
|
21
21
|
const folderPath = config.filesFolder || baseConfig.dbFolder;
|
|
22
|
-
if (!
|
|
23
|
-
fs_1.default.
|
|
22
|
+
if (!baseConfig.fileStore) {
|
|
23
|
+
if (!fs_1.default.existsSync(path_1.default.join(folderPath, folderName))) {
|
|
24
|
+
fs_1.default.mkdirSync(path_1.default.join(folderPath, folderName), { recursive: true });
|
|
25
|
+
}
|
|
24
26
|
}
|
|
25
27
|
return (0, util_1.runAsyncWrapper)((req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
26
28
|
var _a;
|
|
@@ -72,12 +74,18 @@ function handle(baseConfig, config, folderName) {
|
|
|
72
74
|
}
|
|
73
75
|
else {
|
|
74
76
|
let url;
|
|
75
|
-
if (
|
|
76
|
-
|
|
77
|
+
if (baseConfig.fileStore) {
|
|
78
|
+
const fileRef = yield baseConfig.fileStore.storeFile(contentFile);
|
|
79
|
+
url = `${baseFilesUrl}?file=${fileRef}`;
|
|
77
80
|
}
|
|
78
81
|
else {
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
if (config.storeFile) {
|
|
83
|
+
url = yield config.storeFile(contentFile);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const storedFile = yield (0, files_1.storeFile)(contentFile, path_1.default.join(folderPath, folderName));
|
|
87
|
+
url = `${baseFilesUrl}?file=${storedFile}`;
|
|
88
|
+
}
|
|
81
89
|
}
|
|
82
90
|
response.contentUrl = url;
|
|
83
91
|
}
|
|
@@ -103,12 +111,18 @@ function handle(baseConfig, config, folderName) {
|
|
|
103
111
|
}
|
|
104
112
|
else {
|
|
105
113
|
let url;
|
|
106
|
-
if (
|
|
107
|
-
|
|
114
|
+
if (baseConfig.fileStore) {
|
|
115
|
+
const fileRef = yield baseConfig.fileStore.storeFile(previewFile);
|
|
116
|
+
url = `${baseFilesUrl}?file=${fileRef}`;
|
|
108
117
|
}
|
|
109
118
|
else {
|
|
110
|
-
|
|
111
|
-
|
|
119
|
+
if (config.storeFile) {
|
|
120
|
+
url = yield config.storeFile(previewFile);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const storedFile = yield (0, files_1.storeFile)(previewFile, path_1.default.join(folderPath, folderName));
|
|
124
|
+
url = `${baseFilesUrl}?file=${storedFile}`;
|
|
125
|
+
}
|
|
112
126
|
}
|
|
113
127
|
response.previewUrl = url;
|
|
114
128
|
}
|
|
@@ -121,12 +135,18 @@ function handle(baseConfig, config, folderName) {
|
|
|
121
135
|
}
|
|
122
136
|
else {
|
|
123
137
|
let url;
|
|
124
|
-
if (
|
|
125
|
-
|
|
138
|
+
if (baseConfig.fileStore) {
|
|
139
|
+
const fileRef = yield baseConfig.fileStore.storeFile(bufferData);
|
|
140
|
+
url = `${baseFilesUrl}?file=${fileRef}`;
|
|
126
141
|
}
|
|
127
142
|
else {
|
|
128
|
-
|
|
129
|
-
|
|
143
|
+
if (config.storeFile) {
|
|
144
|
+
url = yield config.storeFile(bufferData);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const storedFile = yield (0, files_1.storeFile)(bufferData, path_1.default.join(folderPath, folderName));
|
|
148
|
+
url = `${baseFilesUrl}?file=${storedFile}`;
|
|
149
|
+
}
|
|
130
150
|
}
|
|
131
151
|
response.stringsUrl = url;
|
|
132
152
|
}
|
|
@@ -20,13 +20,23 @@ function registerCustomFileFormat({ config, app }) {
|
|
|
20
20
|
optional: false,
|
|
21
21
|
checkSubscriptionExpiration: true,
|
|
22
22
|
moduleKey: config.customFileFormat.key,
|
|
23
|
-
}), (0, custom_file_format_1.default)(
|
|
23
|
+
}), (0, custom_file_format_1.default)({
|
|
24
|
+
baseUrl: config.baseUrl,
|
|
25
|
+
folder: config.customFileFormat.filesFolder || config.dbFolder,
|
|
26
|
+
config: config.customFileFormat,
|
|
27
|
+
fileStore: config.fileStore,
|
|
28
|
+
}));
|
|
24
29
|
// TEMPORARY CODE: it needs to support old path
|
|
25
30
|
app.post('/process', (0, crowdin_client_1.default)({
|
|
26
31
|
config,
|
|
27
32
|
optional: false,
|
|
28
33
|
checkSubscriptionExpiration: true,
|
|
29
|
-
}), (0, custom_file_format_1.default)(
|
|
34
|
+
}), (0, custom_file_format_1.default)({
|
|
35
|
+
baseUrl: config.baseUrl,
|
|
36
|
+
folder: config.customFileFormat.filesFolder || config.dbFolder,
|
|
37
|
+
config: config.customFileFormat,
|
|
38
|
+
fileStore: config.fileStore,
|
|
39
|
+
}));
|
|
30
40
|
// END TEMPORARY CODE
|
|
31
41
|
app.get('/file/download', (0, file_download_1.default)(config, config.customFileFormat, 'custom-file-format'));
|
|
32
42
|
}
|
package/out/types.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
1
3
|
import Crowdin from '@crowdin/crowdin-api-client';
|
|
2
4
|
import { JwtPayload, VerifyOptions } from '@crowdin/crowdin-apps-functions';
|
|
3
5
|
import { Request } from 'express';
|
|
@@ -272,6 +274,10 @@ export interface ClientConfig extends ImagePath {
|
|
|
272
274
|
* property that tells backend that AiProvider and AiPromptProvider modules can cooperate only with each one
|
|
273
275
|
*/
|
|
274
276
|
restrictAiToSameApp?: boolean;
|
|
277
|
+
/**
|
|
278
|
+
* custom file storage
|
|
279
|
+
*/
|
|
280
|
+
fileStore?: FileStore;
|
|
275
281
|
}
|
|
276
282
|
export interface AssetsConfig {
|
|
277
283
|
/**
|
|
@@ -518,4 +524,8 @@ export interface ModalModule extends ModuleContent, UiModule, Environments {
|
|
|
518
524
|
}
|
|
519
525
|
export interface ContextModule extends ContextContent, UiModule, Environments {
|
|
520
526
|
}
|
|
527
|
+
export interface FileStore {
|
|
528
|
+
getFile: (fileRef: string) => Promise<Buffer>;
|
|
529
|
+
storeFile: (content: Buffer) => Promise<string>;
|
|
530
|
+
}
|
|
521
531
|
export {};
|
package/package.json
CHANGED