1 | const path = require('path');
|
2 | const { default: PQueue } = require('p-queue');
|
3 |
|
4 | const { uploadFile } = require('./api/fileManager');
|
5 | const { walk } = require('./lib/walk');
|
6 | const { logger } = require('./logger');
|
7 | const { createIgnoreFilter } = require('./ignoreRules');
|
8 | const escapeRegExp = require('./lib/escapeRegExp');
|
9 | const { convertToUnixPath } = require('./path');
|
10 | const {
|
11 | ApiErrorContext,
|
12 | logApiUploadErrorInstance,
|
13 | isFatalError,
|
14 | } = require('./errorHandlers');
|
15 |
|
16 | const queue = new PQueue({
|
17 | concurrency: 10,
|
18 | });
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | async function uploadFolder(portalId, src, dest, { cwd }) {
|
28 | const regex = new RegExp(`^${escapeRegExp(src)}`);
|
29 | const files = await walk(src);
|
30 |
|
31 | const filesToUpload = files.filter(createIgnoreFilter(cwd));
|
32 |
|
33 | return queue.addAll(
|
34 | filesToUpload.map(file => {
|
35 | const relativePath = file.replace(regex, '');
|
36 | const destPath = convertToUnixPath(path.join(dest, relativePath));
|
37 | return async () => {
|
38 | logger.debug('Attempting to upload file "%s" to "%s"', file, destPath);
|
39 | try {
|
40 | await uploadFile(portalId, file, destPath);
|
41 | logger.log('Uploaded file "%s" to "%s"', file, destPath);
|
42 | } catch (error) {
|
43 | logger.error('Uploading file "%s" to "%s" failed', file, destPath);
|
44 | if (isFatalError(error)) {
|
45 | throw error;
|
46 | }
|
47 | logApiUploadErrorInstance(
|
48 | error,
|
49 | new ApiErrorContext({
|
50 | portalId,
|
51 | request: destPath,
|
52 | payload: file,
|
53 | })
|
54 | );
|
55 | }
|
56 | };
|
57 | })
|
58 | );
|
59 | }
|
60 |
|
61 | module.exports = {
|
62 | uploadFolder,
|
63 | };
|