@strapi/data-transfer 5.12.0 → 5.12.2

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.
Files changed (213) hide show
  1. package/dist/engine/errors.js +39 -0
  2. package/dist/engine/errors.js.map +1 -0
  3. package/dist/engine/errors.mjs +34 -0
  4. package/dist/engine/errors.mjs.map +1 -0
  5. package/dist/engine/index.js +797 -0
  6. package/dist/engine/index.js.map +1 -0
  7. package/dist/engine/index.mjs +792 -0
  8. package/dist/engine/index.mjs.map +1 -0
  9. package/dist/engine/validation/provider.js +19 -0
  10. package/dist/engine/validation/provider.js.map +1 -0
  11. package/dist/engine/validation/provider.mjs +17 -0
  12. package/dist/engine/validation/provider.mjs.map +1 -0
  13. package/dist/engine/validation/schemas/index.js +57 -0
  14. package/dist/engine/validation/schemas/index.js.map +1 -0
  15. package/dist/engine/validation/schemas/index.mjs +55 -0
  16. package/dist/engine/validation/schemas/index.mjs.map +1 -0
  17. package/dist/errors/base.js +13 -0
  18. package/dist/errors/base.js.map +1 -0
  19. package/dist/errors/base.mjs +11 -0
  20. package/dist/errors/base.mjs.map +1 -0
  21. package/dist/errors/constants.js +10 -0
  22. package/dist/errors/constants.js.map +1 -0
  23. package/dist/errors/constants.mjs +8 -0
  24. package/dist/errors/constants.mjs.map +1 -0
  25. package/dist/errors/providers.js +41 -0
  26. package/dist/errors/providers.js.map +1 -0
  27. package/dist/errors/providers.mjs +36 -0
  28. package/dist/errors/providers.mjs.map +1 -0
  29. package/dist/file/index.js +8 -0
  30. package/dist/file/index.js.map +1 -0
  31. package/dist/file/index.mjs +3 -0
  32. package/dist/file/index.mjs.map +1 -0
  33. package/dist/file/providers/destination/index.js +248 -0
  34. package/dist/file/providers/destination/index.js.map +1 -0
  35. package/dist/file/providers/destination/index.mjs +246 -0
  36. package/dist/file/providers/destination/index.mjs.map +1 -0
  37. package/dist/file/providers/destination/utils.js +63 -0
  38. package/dist/file/providers/destination/utils.js.map +1 -0
  39. package/dist/file/providers/destination/utils.mjs +60 -0
  40. package/dist/file/providers/destination/utils.mjs.map +1 -0
  41. package/dist/file/providers/index.js +10 -0
  42. package/dist/file/providers/index.js.map +1 -0
  43. package/dist/file/providers/index.mjs +3 -0
  44. package/dist/file/providers/index.mjs.map +1 -0
  45. package/dist/file/providers/source/index.js +288 -0
  46. package/dist/file/providers/source/index.js.map +1 -0
  47. package/dist/file/providers/source/index.mjs +286 -0
  48. package/dist/file/providers/source/index.mjs.map +1 -0
  49. package/dist/file/providers/source/utils.js +56 -0
  50. package/dist/file/providers/source/utils.js.map +1 -0
  51. package/dist/file/providers/source/utils.mjs +52 -0
  52. package/dist/file/providers/source/utils.mjs.map +1 -0
  53. package/dist/index.js +8 -5692
  54. package/dist/index.js.map +1 -1
  55. package/dist/index.mjs +8 -5674
  56. package/dist/index.mjs.map +1 -1
  57. package/dist/strapi/index.js +12 -0
  58. package/dist/strapi/index.js.map +1 -0
  59. package/dist/strapi/index.mjs +7 -0
  60. package/dist/strapi/index.mjs.map +1 -0
  61. package/dist/strapi/providers/index.js +16 -0
  62. package/dist/strapi/providers/index.js.map +1 -0
  63. package/dist/strapi/providers/index.mjs +7 -0
  64. package/dist/strapi/providers/index.mjs.map +1 -0
  65. package/dist/strapi/providers/local-destination/index.js +419 -0
  66. package/dist/strapi/providers/local-destination/index.js.map +1 -0
  67. package/dist/strapi/providers/local-destination/index.mjs +396 -0
  68. package/dist/strapi/providers/local-destination/index.mjs.map +1 -0
  69. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js +52 -0
  70. package/dist/strapi/providers/local-destination/strategies/restore/configuration.js.map +1 -0
  71. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs +49 -0
  72. package/dist/strapi/providers/local-destination/strategies/restore/configuration.mjs.map +1 -0
  73. package/dist/strapi/providers/local-destination/strategies/restore/entities.js +64 -0
  74. package/dist/strapi/providers/local-destination/strategies/restore/entities.js.map +1 -0
  75. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs +62 -0
  76. package/dist/strapi/providers/local-destination/strategies/restore/entities.mjs.map +1 -0
  77. package/dist/strapi/providers/local-destination/strategies/restore/index.js +126 -0
  78. package/dist/strapi/providers/local-destination/strategies/restore/index.js.map +1 -0
  79. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs +122 -0
  80. package/dist/strapi/providers/local-destination/strategies/restore/index.mjs.map +1 -0
  81. package/dist/strapi/providers/local-destination/strategies/restore/links.js +60 -0
  82. package/dist/strapi/providers/local-destination/strategies/restore/links.js.map +1 -0
  83. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs +58 -0
  84. package/dist/strapi/providers/local-destination/strategies/restore/links.mjs.map +1 -0
  85. package/dist/strapi/providers/local-source/assets.js +123 -0
  86. package/dist/strapi/providers/local-source/assets.js.map +1 -0
  87. package/dist/strapi/providers/local-source/assets.mjs +121 -0
  88. package/dist/strapi/providers/local-source/assets.mjs.map +1 -0
  89. package/dist/strapi/providers/local-source/configuration.js +39 -0
  90. package/dist/strapi/providers/local-source/configuration.js.map +1 -0
  91. package/dist/strapi/providers/local-source/configuration.mjs +37 -0
  92. package/dist/strapi/providers/local-source/configuration.mjs.map +1 -0
  93. package/dist/strapi/providers/local-source/entities.js +62 -0
  94. package/dist/strapi/providers/local-source/entities.js.map +1 -0
  95. package/dist/strapi/providers/local-source/entities.mjs +59 -0
  96. package/dist/strapi/providers/local-source/entities.mjs.map +1 -0
  97. package/dist/strapi/providers/local-source/index.js +154 -0
  98. package/dist/strapi/providers/local-source/index.js.map +1 -0
  99. package/dist/strapi/providers/local-source/index.mjs +152 -0
  100. package/dist/strapi/providers/local-source/index.mjs.map +1 -0
  101. package/dist/strapi/providers/local-source/links.js +26 -0
  102. package/dist/strapi/providers/local-source/links.js.map +1 -0
  103. package/dist/strapi/providers/local-source/links.mjs +24 -0
  104. package/dist/strapi/providers/local-source/links.mjs.map +1 -0
  105. package/dist/strapi/providers/remote-destination/index.js +392 -0
  106. package/dist/strapi/providers/remote-destination/index.js.map +1 -0
  107. package/dist/strapi/providers/remote-destination/index.mjs +390 -0
  108. package/dist/strapi/providers/remote-destination/index.mjs.map +1 -0
  109. package/dist/strapi/providers/remote-source/index.js +405 -0
  110. package/dist/strapi/providers/remote-source/index.js.map +1 -0
  111. package/dist/strapi/providers/remote-source/index.mjs +403 -0
  112. package/dist/strapi/providers/remote-source/index.mjs.map +1 -0
  113. package/dist/strapi/providers/utils.js +173 -0
  114. package/dist/strapi/providers/utils.js.map +1 -0
  115. package/dist/strapi/providers/utils.mjs +169 -0
  116. package/dist/strapi/providers/utils.mjs.map +1 -0
  117. package/dist/strapi/queries/entity.js +125 -0
  118. package/dist/strapi/queries/entity.js.map +1 -0
  119. package/dist/strapi/queries/entity.mjs +123 -0
  120. package/dist/strapi/queries/entity.mjs.map +1 -0
  121. package/dist/strapi/queries/index.js +10 -0
  122. package/dist/strapi/queries/index.js.map +1 -0
  123. package/dist/strapi/queries/index.mjs +5 -0
  124. package/dist/strapi/queries/index.mjs.map +1 -0
  125. package/dist/strapi/queries/link.js +298 -0
  126. package/dist/strapi/queries/link.js.map +1 -0
  127. package/dist/strapi/queries/link.mjs +295 -0
  128. package/dist/strapi/queries/link.mjs.map +1 -0
  129. package/dist/strapi/remote/constants.js +11 -0
  130. package/dist/strapi/remote/constants.js.map +1 -0
  131. package/dist/strapi/remote/constants.mjs +8 -0
  132. package/dist/strapi/remote/constants.mjs.map +1 -0
  133. package/dist/strapi/remote/flows/default.js +43 -0
  134. package/dist/strapi/remote/flows/default.js.map +1 -0
  135. package/dist/strapi/remote/flows/default.mjs +41 -0
  136. package/dist/strapi/remote/flows/default.mjs.map +1 -0
  137. package/dist/strapi/remote/flows/index.js +54 -0
  138. package/dist/strapi/remote/flows/index.js.map +1 -0
  139. package/dist/strapi/remote/flows/index.mjs +52 -0
  140. package/dist/strapi/remote/flows/index.mjs.map +1 -0
  141. package/dist/strapi/remote/handlers/constants.js +10 -0
  142. package/dist/strapi/remote/handlers/constants.js.map +1 -0
  143. package/dist/strapi/remote/handlers/constants.mjs +8 -0
  144. package/dist/strapi/remote/handlers/constants.mjs.map +1 -0
  145. package/dist/strapi/remote/handlers/index.js +12 -0
  146. package/dist/strapi/remote/handlers/index.js.map +1 -0
  147. package/dist/strapi/remote/handlers/index.mjs +4 -0
  148. package/dist/strapi/remote/handlers/index.mjs.map +1 -0
  149. package/dist/strapi/remote/handlers/pull.js +348 -0
  150. package/dist/strapi/remote/handlers/pull.js.map +1 -0
  151. package/dist/strapi/remote/handlers/pull.mjs +346 -0
  152. package/dist/strapi/remote/handlers/pull.mjs.map +1 -0
  153. package/dist/strapi/remote/handlers/push.js +400 -0
  154. package/dist/strapi/remote/handlers/push.js.map +1 -0
  155. package/dist/strapi/remote/handlers/push.mjs +398 -0
  156. package/dist/strapi/remote/handlers/push.mjs.map +1 -0
  157. package/dist/strapi/remote/handlers/utils.js +316 -0
  158. package/dist/strapi/remote/handlers/utils.js.map +1 -0
  159. package/dist/strapi/remote/handlers/utils.mjs +310 -0
  160. package/dist/strapi/remote/handlers/utils.mjs.map +1 -0
  161. package/dist/strapi/remote/index.js +10 -0
  162. package/dist/strapi/remote/index.js.map +1 -0
  163. package/dist/strapi/remote/index.mjs +5 -0
  164. package/dist/strapi/remote/index.mjs.map +1 -0
  165. package/dist/utils/components.js +178 -0
  166. package/dist/utils/components.js.map +1 -0
  167. package/dist/utils/components.mjs +171 -0
  168. package/dist/utils/components.mjs.map +1 -0
  169. package/dist/utils/diagnostic.js +51 -0
  170. package/dist/utils/diagnostic.js.map +1 -0
  171. package/dist/utils/diagnostic.mjs +49 -0
  172. package/dist/utils/diagnostic.mjs.map +1 -0
  173. package/dist/utils/encryption/decrypt.js +47 -0
  174. package/dist/utils/encryption/decrypt.js.map +1 -0
  175. package/dist/utils/encryption/decrypt.mjs +45 -0
  176. package/dist/utils/encryption/decrypt.mjs.map +1 -0
  177. package/dist/utils/encryption/encrypt.js +47 -0
  178. package/dist/utils/encryption/encrypt.js.map +1 -0
  179. package/dist/utils/encryption/encrypt.mjs +45 -0
  180. package/dist/utils/encryption/encrypt.mjs.map +1 -0
  181. package/dist/utils/encryption/index.js +10 -0
  182. package/dist/utils/encryption/index.js.map +1 -0
  183. package/dist/utils/encryption/index.mjs +3 -0
  184. package/dist/utils/encryption/index.mjs.map +1 -0
  185. package/dist/utils/index.js +20 -0
  186. package/dist/utils/index.js.map +1 -0
  187. package/dist/utils/index.mjs +15 -0
  188. package/dist/utils/index.mjs.map +1 -0
  189. package/dist/utils/json.js +96 -0
  190. package/dist/utils/json.js.map +1 -0
  191. package/dist/utils/json.mjs +94 -0
  192. package/dist/utils/json.mjs.map +1 -0
  193. package/dist/utils/middleware.js +14 -0
  194. package/dist/utils/middleware.js.map +1 -0
  195. package/dist/utils/middleware.mjs +12 -0
  196. package/dist/utils/middleware.mjs.map +1 -0
  197. package/dist/utils/providers.js +12 -0
  198. package/dist/utils/providers.js.map +1 -0
  199. package/dist/utils/providers.mjs +10 -0
  200. package/dist/utils/providers.mjs.map +1 -0
  201. package/dist/utils/schema.js +32 -0
  202. package/dist/utils/schema.js.map +1 -0
  203. package/dist/utils/schema.mjs +29 -0
  204. package/dist/utils/schema.mjs.map +1 -0
  205. package/dist/utils/stream.js +59 -0
  206. package/dist/utils/stream.js.map +1 -0
  207. package/dist/utils/stream.mjs +55 -0
  208. package/dist/utils/stream.mjs.map +1 -0
  209. package/dist/utils/transaction.js +93 -0
  210. package/dist/utils/transaction.js.map +1 -0
  211. package/dist/utils/transaction.mjs +91 -0
  212. package/dist/utils/transaction.mjs.map +1 -0
  213. package/package.json +5 -5
@@ -0,0 +1,248 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var zip = require('zlib');
5
+ var stream = require('stream');
6
+ var fse = require('fs-extra');
7
+ var tar = require('tar-stream');
8
+ var Stringer = require('stream-json/jsonl/Stringer');
9
+ var streamChain = require('stream-chain');
10
+ var encrypt = require('../../../utils/encryption/encrypt.js');
11
+ require('crypto');
12
+ var utils = require('./utils.js');
13
+ var providers = require('../../../errors/providers.js');
14
+
15
+ function _class_private_field_loose_base(receiver, privateKey) {
16
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
17
+ throw new TypeError("attempted to use private field on non-instance");
18
+ }
19
+ return receiver;
20
+ }
21
+ var id = 0;
22
+ function _class_private_field_loose_key(name) {
23
+ return "__private_" + id++ + "_" + name;
24
+ }
25
+ const createLocalFileDestinationProvider = (options)=>{
26
+ return new LocalFileDestinationProvider(options);
27
+ };
28
+ var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _archive = /*#__PURE__*/ _class_private_field_loose_key("_archive"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _archivePath = /*#__PURE__*/ _class_private_field_loose_key("_archivePath"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata"), _getMetadataStream = /*#__PURE__*/ _class_private_field_loose_key("_getMetadataStream");
29
+ class LocalFileDestinationProvider {
30
+ setMetadata(target, metadata) {
31
+ _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata;
32
+ return this;
33
+ }
34
+ createGzip() {
35
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating gzip');
36
+ return zip.createGzip();
37
+ }
38
+ bootstrap(diagnostics) {
39
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
40
+ const { compression, encryption } = this.options;
41
+ if (encryption.enabled && !encryption.key) {
42
+ throw new Error("Can't encrypt without a key");
43
+ }
44
+ _class_private_field_loose_base(this, _archive)[_archive].stream = tar.pack();
45
+ const outStream = fse.createWriteStream(_class_private_field_loose_base(this, _archivePath)[_archivePath]);
46
+ outStream.on('error', (err)=>{
47
+ if (err.code === 'ENOSPC') {
48
+ throw new providers.ProviderTransferError("Your server doesn't have space to proceed with the import.");
49
+ }
50
+ throw err;
51
+ });
52
+ const archiveTransforms = [];
53
+ if (compression.enabled) {
54
+ archiveTransforms.push(this.createGzip());
55
+ }
56
+ if (encryption.enabled && encryption.key) {
57
+ archiveTransforms.push(encrypt.createEncryptionCipher(encryption.key));
58
+ }
59
+ _class_private_field_loose_base(this, _archive)[_archive].pipeline = streamChain.chain([
60
+ _class_private_field_loose_base(this, _archive)[_archive].stream,
61
+ ...archiveTransforms,
62
+ outStream
63
+ ]);
64
+ this.results.file = {
65
+ path: _class_private_field_loose_base(this, _archivePath)[_archivePath]
66
+ };
67
+ }
68
+ async close() {
69
+ const { stream, pipeline } = _class_private_field_loose_base(this, _archive)[_archive];
70
+ if (!stream) {
71
+ return;
72
+ }
73
+ await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata]();
74
+ stream.finalize();
75
+ if (pipeline && !pipeline.closed) {
76
+ await new Promise((resolve, reject)=>{
77
+ pipeline.on('close', resolve).on('error', reject);
78
+ });
79
+ }
80
+ }
81
+ async rollback() {
82
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back');
83
+ await this.close();
84
+ await fse.rm(_class_private_field_loose_base(this, _archivePath)[_archivePath], {
85
+ force: true
86
+ });
87
+ }
88
+ getMetadata() {
89
+ return null;
90
+ }
91
+ createSchemasWriteStream() {
92
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
93
+ throw new Error('Archive stream is unavailable');
94
+ }
95
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating schemas write stream');
96
+ const filePathFactory = utils.createFilePathFactory('schemas');
97
+ const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
98
+ return streamChain.chain([
99
+ Stringer.stringer(),
100
+ entryStream
101
+ ]);
102
+ }
103
+ createEntitiesWriteStream() {
104
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
105
+ throw new Error('Archive stream is unavailable');
106
+ }
107
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities write stream');
108
+ const filePathFactory = utils.createFilePathFactory('entities');
109
+ const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
110
+ return streamChain.chain([
111
+ Stringer.stringer(),
112
+ entryStream
113
+ ]);
114
+ }
115
+ createLinksWriteStream() {
116
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
117
+ throw new Error('Archive stream is unavailable');
118
+ }
119
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links write stream');
120
+ const filePathFactory = utils.createFilePathFactory('links');
121
+ const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
122
+ return streamChain.chain([
123
+ Stringer.stringer(),
124
+ entryStream
125
+ ]);
126
+ }
127
+ createConfigurationWriteStream() {
128
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
129
+ throw new Error('Archive stream is unavailable');
130
+ }
131
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating configuration write stream');
132
+ const filePathFactory = utils.createFilePathFactory('configuration');
133
+ const entryStream = utils.createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
134
+ return streamChain.chain([
135
+ Stringer.stringer(),
136
+ entryStream
137
+ ]);
138
+ }
139
+ createAssetsWriteStream() {
140
+ const { stream: archiveStream } = _class_private_field_loose_base(this, _archive)[_archive];
141
+ if (!archiveStream) {
142
+ throw new Error('Archive stream is unavailable');
143
+ }
144
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating assets write stream');
145
+ return new stream.Writable({
146
+ objectMode: true,
147
+ write (data, _encoding, callback) {
148
+ // always write tar files with posix paths so we have a standard format for paths regardless of system
149
+ const entryPath = path.posix.join('assets', 'uploads', data.filename);
150
+ const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);
151
+ const stringifiedMetadata = JSON.stringify(data.metadata);
152
+ archiveStream.entry({
153
+ name: entryMetadataPath,
154
+ size: stringifiedMetadata.length
155
+ }, stringifiedMetadata);
156
+ const entry = archiveStream.entry({
157
+ name: entryPath,
158
+ size: data.stats.size
159
+ });
160
+ if (!entry) {
161
+ callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));
162
+ return;
163
+ }
164
+ data.stream.pipe(entry);
165
+ entry.on('finish', ()=>{
166
+ callback(null);
167
+ }).on('error', (error)=>{
168
+ callback(error);
169
+ });
170
+ }
171
+ });
172
+ }
173
+ constructor(options){
174
+ Object.defineProperty(this, _reportInfo, {
175
+ value: reportInfo
176
+ });
177
+ Object.defineProperty(this, _archivePath, {
178
+ get: get_archivePath,
179
+ set: void 0
180
+ });
181
+ Object.defineProperty(this, _writeMetadata, {
182
+ value: writeMetadata
183
+ });
184
+ Object.defineProperty(this, _getMetadataStream, {
185
+ value: getMetadataStream
186
+ });
187
+ Object.defineProperty(this, _providersMetadata, {
188
+ writable: true,
189
+ value: void 0
190
+ });
191
+ Object.defineProperty(this, _archive, {
192
+ writable: true,
193
+ value: void 0
194
+ });
195
+ Object.defineProperty(this, _diagnostics, {
196
+ writable: true,
197
+ value: void 0
198
+ });
199
+ this.name = 'destination::local-file';
200
+ this.type = 'destination';
201
+ this.results = {};
202
+ _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {};
203
+ _class_private_field_loose_base(this, _archive)[_archive] = {};
204
+ this.options = options;
205
+ }
206
+ }
207
+ function reportInfo(message) {
208
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
209
+ details: {
210
+ createdAt: new Date(),
211
+ message,
212
+ origin: 'file-destination-provider'
213
+ },
214
+ kind: 'info'
215
+ });
216
+ }
217
+ function get_archivePath() {
218
+ const { encryption, compression, file } = this.options;
219
+ let filePath = `${file.path}.tar`;
220
+ if (compression.enabled) {
221
+ filePath += '.gz';
222
+ }
223
+ if (encryption.enabled) {
224
+ filePath += '.enc';
225
+ }
226
+ return filePath;
227
+ }
228
+ async function writeMetadata() {
229
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('writing metadata');
230
+ const metadata = _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata].source;
231
+ if (metadata) {
232
+ await new Promise((resolve)=>{
233
+ const outStream = _class_private_field_loose_base(this, _getMetadataStream)[_getMetadataStream]();
234
+ const data = JSON.stringify(metadata, null, 2);
235
+ stream.Readable.from(data).pipe(outStream).on('close', resolve);
236
+ });
237
+ }
238
+ }
239
+ function getMetadataStream() {
240
+ const { stream } = _class_private_field_loose_base(this, _archive)[_archive];
241
+ if (!stream) {
242
+ throw new Error('Archive stream is unavailable');
243
+ }
244
+ return utils.createTarEntryStream(stream, ()=>'metadata.json');
245
+ }
246
+
247
+ exports.createLocalFileDestinationProvider = createLocalFileDestinationProvider;
248
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../src/file/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport zlib from 'zlib';\nimport { Readable, Writable } from 'stream';\nimport { rm, createWriteStream } from 'fs-extra';\nimport tar from 'tar-stream';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport { createEncryptionCipher } from '../../../utils/encryption';\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n Stream,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createFilePathFactory, createTarEntryStream } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalFileDestinationProviderOptions {\n encryption: {\n enabled: boolean; // if the file should be encrypted\n key?: string; // the key to use when encryption.enabled is true\n };\n\n compression: {\n enabled: boolean; // if the file should be compressed with gzip\n };\n\n file: {\n path: string; // the filename to create\n maxSize?: number; // the max size of a single backup file\n maxSizeJsonl?: number; // the max lines of each jsonl file before creating the next file\n };\n}\n\nexport interface ILocalFileDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalFileDestinationProvider = (\n options: ILocalFileDestinationProviderOptions\n) => {\n return new LocalFileDestinationProvider(options);\n};\n\nclass LocalFileDestinationProvider implements IDestinationProvider {\n name = 'destination::local-file';\n\n type: ProviderType = 'destination';\n\n options: ILocalFileDestinationProviderOptions;\n\n results: ILocalFileDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #archive: { stream?: tar.Pack; pipeline?: Stream } = {};\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileDestinationProviderOptions) {\n this.options = options;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-destination-provider',\n },\n kind: 'info',\n });\n }\n\n get #archivePath() {\n const { encryption, compression, file } = this.options;\n\n let filePath = `${file.path}.tar`;\n\n if (compression.enabled) {\n filePath += '.gz';\n }\n\n if (encryption.enabled) {\n filePath += '.enc';\n }\n\n return filePath;\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n\n return this;\n }\n\n createGzip(): zlib.Gzip {\n this.#reportInfo('creating gzip');\n return zlib.createGzip();\n }\n\n bootstrap(diagnostics: IDiagnosticReporter): void | Promise<void> {\n this.#diagnostics = diagnostics;\n const { compression, encryption } = this.options;\n\n if (encryption.enabled && !encryption.key) {\n throw new Error(\"Can't encrypt without a key\");\n }\n\n this.#archive.stream = tar.pack();\n\n const outStream = createWriteStream(this.#archivePath);\n\n outStream.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOSPC') {\n throw new ProviderTransferError(\n \"Your server doesn't have space to proceed with the import.\"\n );\n }\n throw err;\n });\n\n const archiveTransforms: Stream[] = [];\n\n if (compression.enabled) {\n archiveTransforms.push(this.createGzip());\n }\n\n if (encryption.enabled && encryption.key) {\n archiveTransforms.push(createEncryptionCipher(encryption.key));\n }\n\n this.#archive.pipeline = chain([this.#archive.stream, ...archiveTransforms, outStream]);\n\n this.results.file = { path: this.#archivePath };\n }\n\n async close() {\n const { stream, pipeline } = this.#archive;\n\n if (!stream) {\n return;\n }\n\n await this.#writeMetadata();\n stream.finalize();\n\n if (pipeline && !pipeline.closed) {\n await new Promise<void>((resolve, reject) => {\n pipeline.on('close', resolve).on('error', reject);\n });\n }\n }\n\n async rollback(): Promise<void> {\n this.#reportInfo('rolling back');\n await this.close();\n await rm(this.#archivePath, { force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n\n if (metadata) {\n await new Promise((resolve) => {\n const outStream = this.#getMetadataStream();\n const data = JSON.stringify(metadata, null, 2);\n\n Readable.from(data).pipe(outStream).on('close', resolve);\n });\n }\n }\n\n #getMetadataStream() {\n const { stream } = this.#archive;\n\n if (!stream) {\n throw new Error('Archive stream is unavailable');\n }\n\n return createTarEntryStream(stream, () => 'metadata.json');\n }\n\n createSchemasWriteStream() {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n const { stream: archiveStream } = this.#archive;\n\n if (!archiveStream) {\n throw new Error('Archive stream is unavailable');\n }\n\n this.#reportInfo('creating assets write stream');\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n // always write tar files with posix paths so we have a standard format for paths regardless of system\n const entryPath = path.posix.join('assets', 'uploads', data.filename);\n\n const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);\n const stringifiedMetadata = JSON.stringify(data.metadata);\n archiveStream.entry(\n {\n name: entryMetadataPath,\n size: stringifiedMetadata.length,\n },\n stringifiedMetadata\n );\n\n const entry = archiveStream.entry({\n name: entryPath,\n size: data.stats.size,\n });\n\n if (!entry) {\n callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));\n return;\n }\n\n data.stream.pipe(entry);\n\n entry\n .on('finish', () => {\n callback(null);\n })\n .on('error', (error) => {\n callback(error);\n });\n },\n });\n }\n}\n"],"names":["createLocalFileDestinationProvider","options","LocalFileDestinationProvider","setMetadata","target","metadata","providersMetadata","createGzip","reportInfo","zlib","bootstrap","diagnostics","compression","encryption","enabled","key","Error","archive","stream","tar","pack","outStream","createWriteStream","archivePath","on","err","code","ProviderTransferError","archiveTransforms","push","createEncryptionCipher","pipeline","chain","results","file","path","close","writeMetadata","finalize","closed","Promise","resolve","reject","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createTarEntryStream","maxSizeJsonl","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","archiveStream","Writable","objectMode","write","data","_encoding","callback","entryPath","posix","join","filename","entryMetadataPath","stringifiedMetadata","JSON","stringify","entry","name","size","length","stats","pipe","error","constructor","type","message","report","details","createdAt","Date","origin","kind","filePath","source","getMetadataStream","Readable","from"],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ import path from 'path';
2
+ import zip from 'zlib';
3
+ import { Writable, Readable } from 'stream';
4
+ import { createWriteStream, rm } from 'fs-extra';
5
+ import tar from 'tar-stream';
6
+ import { stringer } from 'stream-json/jsonl/Stringer';
7
+ import { chain } from 'stream-chain';
8
+ import { createEncryptionCipher } from '../../../utils/encryption/encrypt.mjs';
9
+ import 'crypto';
10
+ import { createTarEntryStream, createFilePathFactory } from './utils.mjs';
11
+ import { ProviderTransferError } from '../../../errors/providers.mjs';
12
+
13
+ function _class_private_field_loose_base(receiver, privateKey) {
14
+ if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
15
+ throw new TypeError("attempted to use private field on non-instance");
16
+ }
17
+ return receiver;
18
+ }
19
+ var id = 0;
20
+ function _class_private_field_loose_key(name) {
21
+ return "__private_" + id++ + "_" + name;
22
+ }
23
+ const createLocalFileDestinationProvider = (options)=>{
24
+ return new LocalFileDestinationProvider(options);
25
+ };
26
+ var _providersMetadata = /*#__PURE__*/ _class_private_field_loose_key("_providersMetadata"), _archive = /*#__PURE__*/ _class_private_field_loose_key("_archive"), _diagnostics = /*#__PURE__*/ _class_private_field_loose_key("_diagnostics"), _reportInfo = /*#__PURE__*/ _class_private_field_loose_key("_reportInfo"), _archivePath = /*#__PURE__*/ _class_private_field_loose_key("_archivePath"), _writeMetadata = /*#__PURE__*/ _class_private_field_loose_key("_writeMetadata"), _getMetadataStream = /*#__PURE__*/ _class_private_field_loose_key("_getMetadataStream");
27
+ class LocalFileDestinationProvider {
28
+ setMetadata(target, metadata) {
29
+ _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata][target] = metadata;
30
+ return this;
31
+ }
32
+ createGzip() {
33
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating gzip');
34
+ return zip.createGzip();
35
+ }
36
+ bootstrap(diagnostics) {
37
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics] = diagnostics;
38
+ const { compression, encryption } = this.options;
39
+ if (encryption.enabled && !encryption.key) {
40
+ throw new Error("Can't encrypt without a key");
41
+ }
42
+ _class_private_field_loose_base(this, _archive)[_archive].stream = tar.pack();
43
+ const outStream = createWriteStream(_class_private_field_loose_base(this, _archivePath)[_archivePath]);
44
+ outStream.on('error', (err)=>{
45
+ if (err.code === 'ENOSPC') {
46
+ throw new ProviderTransferError("Your server doesn't have space to proceed with the import.");
47
+ }
48
+ throw err;
49
+ });
50
+ const archiveTransforms = [];
51
+ if (compression.enabled) {
52
+ archiveTransforms.push(this.createGzip());
53
+ }
54
+ if (encryption.enabled && encryption.key) {
55
+ archiveTransforms.push(createEncryptionCipher(encryption.key));
56
+ }
57
+ _class_private_field_loose_base(this, _archive)[_archive].pipeline = chain([
58
+ _class_private_field_loose_base(this, _archive)[_archive].stream,
59
+ ...archiveTransforms,
60
+ outStream
61
+ ]);
62
+ this.results.file = {
63
+ path: _class_private_field_loose_base(this, _archivePath)[_archivePath]
64
+ };
65
+ }
66
+ async close() {
67
+ const { stream, pipeline } = _class_private_field_loose_base(this, _archive)[_archive];
68
+ if (!stream) {
69
+ return;
70
+ }
71
+ await _class_private_field_loose_base(this, _writeMetadata)[_writeMetadata]();
72
+ stream.finalize();
73
+ if (pipeline && !pipeline.closed) {
74
+ await new Promise((resolve, reject)=>{
75
+ pipeline.on('close', resolve).on('error', reject);
76
+ });
77
+ }
78
+ }
79
+ async rollback() {
80
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('rolling back');
81
+ await this.close();
82
+ await rm(_class_private_field_loose_base(this, _archivePath)[_archivePath], {
83
+ force: true
84
+ });
85
+ }
86
+ getMetadata() {
87
+ return null;
88
+ }
89
+ createSchemasWriteStream() {
90
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
91
+ throw new Error('Archive stream is unavailable');
92
+ }
93
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating schemas write stream');
94
+ const filePathFactory = createFilePathFactory('schemas');
95
+ const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
96
+ return chain([
97
+ stringer(),
98
+ entryStream
99
+ ]);
100
+ }
101
+ createEntitiesWriteStream() {
102
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
103
+ throw new Error('Archive stream is unavailable');
104
+ }
105
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating entities write stream');
106
+ const filePathFactory = createFilePathFactory('entities');
107
+ const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
108
+ return chain([
109
+ stringer(),
110
+ entryStream
111
+ ]);
112
+ }
113
+ createLinksWriteStream() {
114
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
115
+ throw new Error('Archive stream is unavailable');
116
+ }
117
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating links write stream');
118
+ const filePathFactory = createFilePathFactory('links');
119
+ const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
120
+ return chain([
121
+ stringer(),
122
+ entryStream
123
+ ]);
124
+ }
125
+ createConfigurationWriteStream() {
126
+ if (!_class_private_field_loose_base(this, _archive)[_archive].stream) {
127
+ throw new Error('Archive stream is unavailable');
128
+ }
129
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating configuration write stream');
130
+ const filePathFactory = createFilePathFactory('configuration');
131
+ const entryStream = createTarEntryStream(_class_private_field_loose_base(this, _archive)[_archive].stream, filePathFactory, this.options.file.maxSizeJsonl);
132
+ return chain([
133
+ stringer(),
134
+ entryStream
135
+ ]);
136
+ }
137
+ createAssetsWriteStream() {
138
+ const { stream: archiveStream } = _class_private_field_loose_base(this, _archive)[_archive];
139
+ if (!archiveStream) {
140
+ throw new Error('Archive stream is unavailable');
141
+ }
142
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('creating assets write stream');
143
+ return new Writable({
144
+ objectMode: true,
145
+ write (data, _encoding, callback) {
146
+ // always write tar files with posix paths so we have a standard format for paths regardless of system
147
+ const entryPath = path.posix.join('assets', 'uploads', data.filename);
148
+ const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);
149
+ const stringifiedMetadata = JSON.stringify(data.metadata);
150
+ archiveStream.entry({
151
+ name: entryMetadataPath,
152
+ size: stringifiedMetadata.length
153
+ }, stringifiedMetadata);
154
+ const entry = archiveStream.entry({
155
+ name: entryPath,
156
+ size: data.stats.size
157
+ });
158
+ if (!entry) {
159
+ callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));
160
+ return;
161
+ }
162
+ data.stream.pipe(entry);
163
+ entry.on('finish', ()=>{
164
+ callback(null);
165
+ }).on('error', (error)=>{
166
+ callback(error);
167
+ });
168
+ }
169
+ });
170
+ }
171
+ constructor(options){
172
+ Object.defineProperty(this, _reportInfo, {
173
+ value: reportInfo
174
+ });
175
+ Object.defineProperty(this, _archivePath, {
176
+ get: get_archivePath,
177
+ set: void 0
178
+ });
179
+ Object.defineProperty(this, _writeMetadata, {
180
+ value: writeMetadata
181
+ });
182
+ Object.defineProperty(this, _getMetadataStream, {
183
+ value: getMetadataStream
184
+ });
185
+ Object.defineProperty(this, _providersMetadata, {
186
+ writable: true,
187
+ value: void 0
188
+ });
189
+ Object.defineProperty(this, _archive, {
190
+ writable: true,
191
+ value: void 0
192
+ });
193
+ Object.defineProperty(this, _diagnostics, {
194
+ writable: true,
195
+ value: void 0
196
+ });
197
+ this.name = 'destination::local-file';
198
+ this.type = 'destination';
199
+ this.results = {};
200
+ _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata] = {};
201
+ _class_private_field_loose_base(this, _archive)[_archive] = {};
202
+ this.options = options;
203
+ }
204
+ }
205
+ function reportInfo(message) {
206
+ _class_private_field_loose_base(this, _diagnostics)[_diagnostics]?.report({
207
+ details: {
208
+ createdAt: new Date(),
209
+ message,
210
+ origin: 'file-destination-provider'
211
+ },
212
+ kind: 'info'
213
+ });
214
+ }
215
+ function get_archivePath() {
216
+ const { encryption, compression, file } = this.options;
217
+ let filePath = `${file.path}.tar`;
218
+ if (compression.enabled) {
219
+ filePath += '.gz';
220
+ }
221
+ if (encryption.enabled) {
222
+ filePath += '.enc';
223
+ }
224
+ return filePath;
225
+ }
226
+ async function writeMetadata() {
227
+ _class_private_field_loose_base(this, _reportInfo)[_reportInfo]('writing metadata');
228
+ const metadata = _class_private_field_loose_base(this, _providersMetadata)[_providersMetadata].source;
229
+ if (metadata) {
230
+ await new Promise((resolve)=>{
231
+ const outStream = _class_private_field_loose_base(this, _getMetadataStream)[_getMetadataStream]();
232
+ const data = JSON.stringify(metadata, null, 2);
233
+ Readable.from(data).pipe(outStream).on('close', resolve);
234
+ });
235
+ }
236
+ }
237
+ function getMetadataStream() {
238
+ const { stream } = _class_private_field_loose_base(this, _archive)[_archive];
239
+ if (!stream) {
240
+ throw new Error('Archive stream is unavailable');
241
+ }
242
+ return createTarEntryStream(stream, ()=>'metadata.json');
243
+ }
244
+
245
+ export { createLocalFileDestinationProvider };
246
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../../../src/file/providers/destination/index.ts"],"sourcesContent":["import path from 'path';\nimport zlib from 'zlib';\nimport { Readable, Writable } from 'stream';\nimport { rm, createWriteStream } from 'fs-extra';\nimport tar from 'tar-stream';\nimport { stringer } from 'stream-json/jsonl/Stringer';\nimport { chain } from 'stream-chain';\n\nimport { createEncryptionCipher } from '../../../utils/encryption';\nimport type {\n IAsset,\n IDestinationProvider,\n IDestinationProviderTransferResults,\n IMetadata,\n ProviderType,\n Stream,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { createFilePathFactory, createTarEntryStream } from './utils';\nimport { ProviderTransferError } from '../../../errors/providers';\n\nexport interface ILocalFileDestinationProviderOptions {\n encryption: {\n enabled: boolean; // if the file should be encrypted\n key?: string; // the key to use when encryption.enabled is true\n };\n\n compression: {\n enabled: boolean; // if the file should be compressed with gzip\n };\n\n file: {\n path: string; // the filename to create\n maxSize?: number; // the max size of a single backup file\n maxSizeJsonl?: number; // the max lines of each jsonl file before creating the next file\n };\n}\n\nexport interface ILocalFileDestinationProviderTransferResults\n extends IDestinationProviderTransferResults {\n file?: {\n path?: string;\n };\n}\n\nexport const createLocalFileDestinationProvider = (\n options: ILocalFileDestinationProviderOptions\n) => {\n return new LocalFileDestinationProvider(options);\n};\n\nclass LocalFileDestinationProvider implements IDestinationProvider {\n name = 'destination::local-file';\n\n type: ProviderType = 'destination';\n\n options: ILocalFileDestinationProviderOptions;\n\n results: ILocalFileDestinationProviderTransferResults = {};\n\n #providersMetadata: { source?: IMetadata; destination?: IMetadata } = {};\n\n #archive: { stream?: tar.Pack; pipeline?: Stream } = {};\n\n #diagnostics?: IDiagnosticReporter;\n\n constructor(options: ILocalFileDestinationProviderOptions) {\n this.options = options;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'file-destination-provider',\n },\n kind: 'info',\n });\n }\n\n get #archivePath() {\n const { encryption, compression, file } = this.options;\n\n let filePath = `${file.path}.tar`;\n\n if (compression.enabled) {\n filePath += '.gz';\n }\n\n if (encryption.enabled) {\n filePath += '.enc';\n }\n\n return filePath;\n }\n\n setMetadata(target: ProviderType, metadata: IMetadata): IDestinationProvider {\n this.#providersMetadata[target] = metadata;\n\n return this;\n }\n\n createGzip(): zlib.Gzip {\n this.#reportInfo('creating gzip');\n return zlib.createGzip();\n }\n\n bootstrap(diagnostics: IDiagnosticReporter): void | Promise<void> {\n this.#diagnostics = diagnostics;\n const { compression, encryption } = this.options;\n\n if (encryption.enabled && !encryption.key) {\n throw new Error(\"Can't encrypt without a key\");\n }\n\n this.#archive.stream = tar.pack();\n\n const outStream = createWriteStream(this.#archivePath);\n\n outStream.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'ENOSPC') {\n throw new ProviderTransferError(\n \"Your server doesn't have space to proceed with the import.\"\n );\n }\n throw err;\n });\n\n const archiveTransforms: Stream[] = [];\n\n if (compression.enabled) {\n archiveTransforms.push(this.createGzip());\n }\n\n if (encryption.enabled && encryption.key) {\n archiveTransforms.push(createEncryptionCipher(encryption.key));\n }\n\n this.#archive.pipeline = chain([this.#archive.stream, ...archiveTransforms, outStream]);\n\n this.results.file = { path: this.#archivePath };\n }\n\n async close() {\n const { stream, pipeline } = this.#archive;\n\n if (!stream) {\n return;\n }\n\n await this.#writeMetadata();\n stream.finalize();\n\n if (pipeline && !pipeline.closed) {\n await new Promise<void>((resolve, reject) => {\n pipeline.on('close', resolve).on('error', reject);\n });\n }\n }\n\n async rollback(): Promise<void> {\n this.#reportInfo('rolling back');\n await this.close();\n await rm(this.#archivePath, { force: true });\n }\n\n getMetadata() {\n return null;\n }\n\n async #writeMetadata(): Promise<void> {\n this.#reportInfo('writing metadata');\n const metadata = this.#providersMetadata.source;\n\n if (metadata) {\n await new Promise((resolve) => {\n const outStream = this.#getMetadataStream();\n const data = JSON.stringify(metadata, null, 2);\n\n Readable.from(data).pipe(outStream).on('close', resolve);\n });\n }\n }\n\n #getMetadataStream() {\n const { stream } = this.#archive;\n\n if (!stream) {\n throw new Error('Archive stream is unavailable');\n }\n\n return createTarEntryStream(stream, () => 'metadata.json');\n }\n\n createSchemasWriteStream() {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating schemas write stream');\n const filePathFactory = createFilePathFactory('schemas');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createEntitiesWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating entities write stream');\n const filePathFactory = createFilePathFactory('entities');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createLinksWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating links write stream');\n const filePathFactory = createFilePathFactory('links');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createConfigurationWriteStream(): Writable {\n if (!this.#archive.stream) {\n throw new Error('Archive stream is unavailable');\n }\n this.#reportInfo('creating configuration write stream');\n const filePathFactory = createFilePathFactory('configuration');\n\n const entryStream = createTarEntryStream(\n this.#archive.stream,\n filePathFactory,\n this.options.file.maxSizeJsonl\n );\n\n return chain([stringer(), entryStream]);\n }\n\n createAssetsWriteStream(): Writable {\n const { stream: archiveStream } = this.#archive;\n\n if (!archiveStream) {\n throw new Error('Archive stream is unavailable');\n }\n\n this.#reportInfo('creating assets write stream');\n return new Writable({\n objectMode: true,\n write(data: IAsset, _encoding, callback) {\n // always write tar files with posix paths so we have a standard format for paths regardless of system\n const entryPath = path.posix.join('assets', 'uploads', data.filename);\n\n const entryMetadataPath = path.posix.join('assets', 'metadata', `${data.filename}.json`);\n const stringifiedMetadata = JSON.stringify(data.metadata);\n archiveStream.entry(\n {\n name: entryMetadataPath,\n size: stringifiedMetadata.length,\n },\n stringifiedMetadata\n );\n\n const entry = archiveStream.entry({\n name: entryPath,\n size: data.stats.size,\n });\n\n if (!entry) {\n callback(new Error(`Failed to created an asset tar entry for ${entryPath}`));\n return;\n }\n\n data.stream.pipe(entry);\n\n entry\n .on('finish', () => {\n callback(null);\n })\n .on('error', (error) => {\n callback(error);\n });\n },\n });\n }\n}\n"],"names":["createLocalFileDestinationProvider","options","LocalFileDestinationProvider","setMetadata","target","metadata","providersMetadata","createGzip","reportInfo","zlib","bootstrap","diagnostics","compression","encryption","enabled","key","Error","archive","stream","tar","pack","outStream","createWriteStream","archivePath","on","err","code","ProviderTransferError","archiveTransforms","push","createEncryptionCipher","pipeline","chain","results","file","path","close","writeMetadata","finalize","closed","Promise","resolve","reject","rollback","rm","force","getMetadata","createSchemasWriteStream","filePathFactory","createFilePathFactory","entryStream","createTarEntryStream","maxSizeJsonl","stringer","createEntitiesWriteStream","createLinksWriteStream","createConfigurationWriteStream","createAssetsWriteStream","archiveStream","Writable","objectMode","write","data","_encoding","callback","entryPath","posix","join","filename","entryMetadataPath","stringifiedMetadata","JSON","stringify","entry","name","size","length","stats","pipe","error","constructor","type","message","report","details","createdAt","Date","origin","kind","filePath","source","getMetadataStream","Readable","from"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var stream = require('stream');
4
+ var path = require('path');
5
+
6
+ /**
7
+ * Create a file path factory for a given path & prefix.
8
+ * Upon being called, the factory will return a file path for a given index
9
+ */ const createFilePathFactory = (type)=>(fileIndex = 0)=>{
10
+ // always write tar files with posix paths so we have a standard format for paths regardless of system
11
+ return path.posix.join(// "{type}" directory
12
+ type, // "${type}_XXXXX.jsonl" file
13
+ `${type}_${String(fileIndex).padStart(5, '0')}.jsonl`);
14
+ };
15
+ const createTarEntryStream = (archive, pathFactory, maxSize = 2.56e8)=>{
16
+ let fileIndex = 0;
17
+ let buffer = '';
18
+ const flush = async ()=>{
19
+ if (!buffer) {
20
+ return;
21
+ }
22
+ fileIndex += 1;
23
+ const name = pathFactory(fileIndex);
24
+ const size = buffer.length;
25
+ await new Promise((resolve, reject)=>{
26
+ archive.entry({
27
+ name,
28
+ size
29
+ }, buffer, (err)=>{
30
+ if (err) {
31
+ reject(err);
32
+ }
33
+ resolve();
34
+ });
35
+ });
36
+ buffer = '';
37
+ };
38
+ const push = (chunk)=>{
39
+ buffer += chunk;
40
+ };
41
+ return new stream.Writable({
42
+ async destroy (err, callback) {
43
+ await flush();
44
+ callback(err);
45
+ },
46
+ async write (chunk, _encoding, callback) {
47
+ const size = chunk.length;
48
+ if (chunk.length > maxSize) {
49
+ callback(new Error(`payload too large: ${chunk.length}>${maxSize}`));
50
+ return;
51
+ }
52
+ if (buffer.length + size > maxSize) {
53
+ await flush();
54
+ }
55
+ push(chunk);
56
+ callback(null);
57
+ }
58
+ });
59
+ };
60
+
61
+ exports.createFilePathFactory = createFilePathFactory;
62
+ exports.createTarEntryStream = createTarEntryStream;
63
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../../../../src/file/providers/destination/utils.ts"],"sourcesContent":["import { Writable } from 'stream';\nimport { posix } from 'path';\nimport tar from 'tar-stream';\n\n/**\n * Create a file path factory for a given path & prefix.\n * Upon being called, the factory will return a file path for a given index\n */\nexport const createFilePathFactory =\n (type: string) =>\n (fileIndex = 0): string => {\n // always write tar files with posix paths so we have a standard format for paths regardless of system\n return posix.join(\n // \"{type}\" directory\n type,\n // \"${type}_XXXXX.jsonl\" file\n `${type}_${String(fileIndex).padStart(5, '0')}.jsonl`\n );\n };\n\nexport const createTarEntryStream = (\n archive: tar.Pack,\n pathFactory: (index?: number) => string,\n maxSize = 2.56e8\n) => {\n let fileIndex = 0;\n let buffer = '';\n\n const flush = async () => {\n if (!buffer) {\n return;\n }\n\n fileIndex += 1;\n const name = pathFactory(fileIndex);\n const size = buffer.length;\n\n await new Promise<void>((resolve, reject) => {\n archive.entry({ name, size }, buffer, (err) => {\n if (err) {\n reject(err);\n }\n\n resolve();\n });\n });\n\n buffer = '';\n };\n\n const push = (chunk: string | Buffer) => {\n buffer += chunk;\n };\n\n return new Writable({\n async destroy(err, callback) {\n await flush();\n callback(err);\n },\n\n async write(chunk, _encoding, callback) {\n const size = chunk.length;\n\n if (chunk.length > maxSize) {\n callback(new Error(`payload too large: ${chunk.length}>${maxSize}`));\n return;\n }\n\n if (buffer.length + size > maxSize) {\n await flush();\n }\n\n push(chunk);\n\n callback(null);\n },\n });\n};\n"],"names":["createFilePathFactory","type","fileIndex","posix","join","String","padStart","createTarEntryStream","archive","pathFactory","maxSize","buffer","flush","name","size","length","Promise","resolve","reject","entry","err","push","chunk","Writable","destroy","callback","write","_encoding","Error"],"mappings":";;;;;AAIA;;;AAGC,IACYA,MAAAA,qBAAAA,GACX,CAACC,IACD,GAAA,CAACC,YAAY,CAAC,GAAA;;QAEZ,OAAOC,UAAAA,CAAMC,IAAI;AAEfH,QAAAA,IAAAA;QAEA,CAAC,EAAEA,IAAK,CAAA,CAAC,EAAEI,MAAAA,CAAOH,SAAWI,CAAAA,CAAAA,QAAQ,CAAC,CAAA,EAAG,GAAK,CAAA,CAAA,MAAM,CAAC,CAAA;;MAI9CC,oBAAuB,GAAA,CAClCC,OACAC,EAAAA,WAAAA,EACAC,UAAU,MAAM,GAAA;AAEhB,IAAA,IAAIR,SAAY,GAAA,CAAA;AAChB,IAAA,IAAIS,MAAS,GAAA,EAAA;AAEb,IAAA,MAAMC,KAAQ,GAAA,UAAA;AACZ,QAAA,IAAI,CAACD,MAAQ,EAAA;AACX,YAAA;AACF;QAEAT,SAAa,IAAA,CAAA;AACb,QAAA,MAAMW,OAAOJ,WAAYP,CAAAA,SAAAA,CAAAA;QACzB,MAAMY,IAAAA,GAAOH,OAAOI,MAAM;QAE1B,MAAM,IAAIC,OAAc,CAAA,CAACC,OAASC,EAAAA,MAAAA,GAAAA;AAChCV,YAAAA,OAAAA,CAAQW,KAAK,CAAC;AAAEN,gBAAAA,IAAAA;AAAMC,gBAAAA;AAAK,aAAA,EAAGH,QAAQ,CAACS,GAAAA,GAAAA;AACrC,gBAAA,IAAIA,GAAK,EAAA;oBACPF,MAAOE,CAAAA,GAAAA,CAAAA;AACT;AAEAH,gBAAAA,OAAAA,EAAAA;AACF,aAAA,CAAA;AACF,SAAA,CAAA;QAEAN,MAAS,GAAA,EAAA;AACX,KAAA;AAEA,IAAA,MAAMU,OAAO,CAACC,KAAAA,GAAAA;QACZX,MAAUW,IAAAA,KAAAA;AACZ,KAAA;AAEA,IAAA,OAAO,IAAIC,eAAS,CAAA;QAClB,MAAMC,OAAAA,CAAAA,CAAQJ,GAAG,EAAEK,QAAQ,EAAA;YACzB,MAAMb,KAAAA,EAAAA;YACNa,QAASL,CAAAA,GAAAA,CAAAA;AACX,SAAA;AAEA,QAAA,MAAMM,KAAMJ,CAAAA,CAAAA,KAAK,EAAEK,SAAS,EAAEF,QAAQ,EAAA;YACpC,MAAMX,IAAAA,GAAOQ,MAAMP,MAAM;YAEzB,IAAIO,KAAAA,CAAMP,MAAM,GAAGL,OAAS,EAAA;gBAC1Be,QAAS,CAAA,IAAIG,KAAM,CAAA,CAAC,mBAAmB,EAAEN,KAAMP,CAAAA,MAAM,CAAC,CAAC,EAAEL,OAAAA,CAAQ,CAAC,CAAA,CAAA;AAClE,gBAAA;AACF;AAEA,YAAA,IAAIC,MAAOI,CAAAA,MAAM,GAAGD,IAAAA,GAAOJ,OAAS,EAAA;gBAClC,MAAME,KAAAA,EAAAA;AACR;YAEAS,IAAKC,CAAAA,KAAAA,CAAAA;YAELG,QAAS,CAAA,IAAA,CAAA;AACX;AACF,KAAA,CAAA;AACF;;;;;"}