@yrpri/api 9.0.220 → 9.0.222

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 (55) hide show
  1. package/agents/managers/subscriptionManager.js +2 -2
  2. package/app.js +11 -8
  3. package/controllers/communities.cjs +3 -1
  4. package/controllers/groups.cjs +1 -1
  5. package/controllers/images.cjs +12 -1
  6. package/models/domain.cjs +1 -1
  7. package/models/image.cjs +90 -24
  8. package/package.json +83 -63
  9. package/scripts/cloning/clearUsersForCommunitiesFromUrl.js +1 -1
  10. package/scripts/cloning/cloneFromUrlScript.js +1 -1
  11. package/scripts/cloning/cloneWBFromUrlScriptAndCreateLinks.js +1 -1
  12. package/scripts/cloning/cloneWBFromUrlScriptNoUsersOrPoints.js +1 -1
  13. package/scripts/cloning/cloneWBSerbianFromUrlScriptAndCreateLinks.js +1 -1
  14. package/scripts/cloning/copyCommunityConfigAndTranslationsFromURL.js +1 -1
  15. package/scripts/cloning/copyGroupConfigAndTranslationsFromURL.js +1 -1
  16. package/scripts/cloning/copyPostVideosFromURL.js +1 -1
  17. package/scripts/cloning/deepCloneSerbianWBFromUrlScriptAndCreateLinks.js +1 -1
  18. package/scripts/cloning/deepCloneWBFromUrlScriptAndCreateLinks.js +1 -1
  19. package/scripts/cloning/setAdminsFromURL.js +1 -1
  20. package/scripts/cloning/setExternalIdsFromURL.js +1 -1
  21. package/scripts/endorsementFraudDetection/bulkDeleteDuplicateEndorsmentsFromUrl.js +1 -1
  22. package/scripts/landUseGame/export3Ddata.js +1 -1
  23. package/scripts/movePostsToGroupsRecountGroupFromUrl.js +1 -1
  24. package/scripts/recountALLCommunityGroupCounts.js +1 -1
  25. package/scripts/recountCommunitesFromUrl.js +1 -1
  26. package/scripts/recountCommunity.js +1 -1
  27. package/scripts/setLanguageOnGroupCommunitesFromUrl.js +1 -1
  28. package/services/engine/allOurIdeas/aiHelper.d.ts +1 -2
  29. package/services/engine/analytics/manager.cjs +1 -1
  30. package/services/engine/analytics/plausible/manager.cjs +1 -1
  31. package/services/engine/analytics/utils.cjs +1 -1
  32. package/services/engine/notifications/emails_utils.cjs +10 -1
  33. package/services/engine/recommendations/events_manager.cjs +1 -1
  34. package/services/engine/reports/common_utils.cjs +1 -1
  35. package/services/llms/baseChatBot.d.ts +1 -2
  36. package/services/llms/imageGeneration/s3Service.js +72 -11
  37. package/services/scripts/translation_replace_text_from_url.js +1 -1
  38. package/services/utils/redisConnection.cjs +2 -3
  39. package/services/utils/translation_cloning.cjs +1 -1
  40. package/services/utils/translation_helpers.cjs +1 -1
  41. package/tests/emails_utils.test.cjs +130 -0
  42. package/tests/emails_utils.test.d.cts +1 -0
  43. package/tests/imageModel.test.cjs +373 -0
  44. package/tests/imageModel.test.d.cts +1 -0
  45. package/tests/multerSharpS3Compat.test.cjs +229 -0
  46. package/tests/multerSharpS3Compat.test.d.cts +1 -0
  47. package/tests/requestCompat.test.cjs +288 -0
  48. package/tests/requestCompat.test.d.cts +1 -0
  49. package/utils/multerSharpS3Compat.cjs +230 -0
  50. package/utils/multerSharpS3Compat.d.cts +22 -0
  51. package/utils/passportSsoCompat.cjs +15 -0
  52. package/utils/passportSsoCompat.d.cts +2 -0
  53. package/utils/recount_utils.cjs +1 -1
  54. package/utils/requestCompat.cjs +180 -0
  55. package/utils/requestCompat.d.cts +9 -0
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ const test = require("node:test");
3
+ const assert = require("node:assert/strict");
4
+ const Module = require("node:module");
5
+ const { once } = require("node:events");
6
+ const { PassThrough } = require("node:stream");
7
+ const axiosPath = require.resolve("axios");
8
+ const requestCompatPath = require.resolve("../utils/requestCompat.cjs");
9
+ const injectMockModule = (modulePath, moduleExports) => {
10
+ const mockModule = new Module(modulePath);
11
+ mockModule.filename = modulePath;
12
+ mockModule.loaded = true;
13
+ mockModule.exports = moduleExports;
14
+ require.cache[modulePath] = mockModule;
15
+ };
16
+ const loadRequestCompat = (mockAxios) => {
17
+ const originalAxiosModule = require.cache[axiosPath];
18
+ const originalRequestCompatModule = require.cache[requestCompatPath];
19
+ injectMockModule(axiosPath, mockAxios);
20
+ delete require.cache[requestCompatPath];
21
+ const request = require(requestCompatPath);
22
+ return {
23
+ request,
24
+ restore() {
25
+ delete require.cache[requestCompatPath];
26
+ if (originalAxiosModule) {
27
+ require.cache[axiosPath] = originalAxiosModule;
28
+ }
29
+ else {
30
+ delete require.cache[axiosPath];
31
+ }
32
+ if (originalRequestCompatModule) {
33
+ require.cache[requestCompatPath] = originalRequestCompatModule;
34
+ }
35
+ },
36
+ };
37
+ };
38
+ const runCallbackRequest = (requestFn, options) => {
39
+ return new Promise((resolve) => {
40
+ requestFn(options, (error, response, body) => {
41
+ resolve({ error, response, body });
42
+ });
43
+ });
44
+ };
45
+ test("request.get maps query params and returns text bodies", async (t) => {
46
+ let seenConfig;
47
+ const mockAxios = async (config) => {
48
+ seenConfig = config;
49
+ return {
50
+ status: 200,
51
+ statusText: "OK",
52
+ headers: { "x-test": "1" },
53
+ data: "hello world",
54
+ };
55
+ };
56
+ const { request, restore } = loadRequestCompat(mockAxios);
57
+ t.after(restore);
58
+ const result = await runCallbackRequest(request.get, {
59
+ url: "https://example.com/items",
60
+ qs: { page: "2", sort: "asc" },
61
+ headers: { Authorization: "Bearer token" },
62
+ });
63
+ assert.equal(result.error, null);
64
+ assert.equal(result.response.statusCode, 200);
65
+ assert.equal(result.response.headers["x-test"], "1");
66
+ assert.equal(result.body, "hello world");
67
+ assert.equal(seenConfig.method, "get");
68
+ assert.deepEqual(seenConfig.params, { page: "2", sort: "asc" });
69
+ assert.equal(seenConfig.headers.Authorization, "Bearer token");
70
+ assert.equal(seenConfig.responseType, "text");
71
+ });
72
+ test("request.post sends json payloads and preserves parsed response objects", async (t) => {
73
+ let seenConfig;
74
+ const mockAxios = async (config) => {
75
+ seenConfig = config;
76
+ return {
77
+ status: 202,
78
+ statusText: "Accepted",
79
+ headers: { "content-type": "application/json" },
80
+ data: { ok: true, id: 123 },
81
+ };
82
+ };
83
+ const { request, restore } = loadRequestCompat(mockAxios);
84
+ t.after(restore);
85
+ const result = await runCallbackRequest(request.post, {
86
+ url: "https://example.com/events",
87
+ json: { name: "test-event" },
88
+ });
89
+ assert.equal(result.error, null);
90
+ assert.equal(result.response.statusCode, 202);
91
+ assert.deepEqual(result.body, { ok: true, id: 123 });
92
+ assert.equal(seenConfig.method, "post");
93
+ assert.deepEqual(seenConfig.data, { name: "test-event" });
94
+ assert.equal(seenConfig.headers["Content-Type"], "application/json");
95
+ });
96
+ test("request(options, callback) respects explicit method overrides", async (t) => {
97
+ let seenConfig;
98
+ const mockAxios = async (config) => {
99
+ seenConfig = config;
100
+ return {
101
+ status: 200,
102
+ statusText: "OK",
103
+ headers: {},
104
+ data: "method-ok",
105
+ };
106
+ };
107
+ const { request, restore } = loadRequestCompat(mockAxios);
108
+ t.after(restore);
109
+ const result = await runCallbackRequest(request, {
110
+ url: "https://example.com/plausible",
111
+ method: "PUT",
112
+ formData: {
113
+ site_id: "yrpri",
114
+ goal_type: "event",
115
+ },
116
+ });
117
+ assert.equal(result.error, null);
118
+ assert.equal(result.body, "method-ok");
119
+ assert.equal(seenConfig.method, "put");
120
+ assert.equal(typeof seenConfig.data.getHeaders, "function");
121
+ });
122
+ test("request.defaults can force binary responses", async (t) => {
123
+ let seenConfig;
124
+ const mockAxios = async (config) => {
125
+ seenConfig = config;
126
+ return {
127
+ status: 200,
128
+ statusText: "OK",
129
+ headers: { "content-type": "application/octet-stream" },
130
+ data: Buffer.from([1, 2, 3, 4]),
131
+ };
132
+ };
133
+ const { request, restore } = loadRequestCompat(mockAxios);
134
+ t.after(restore);
135
+ const binaryRequest = request.defaults({ encoding: null });
136
+ const result = await runCallbackRequest(binaryRequest.get, {
137
+ url: "https://example.com/file.bin",
138
+ });
139
+ assert.equal(result.error, null);
140
+ assert.equal(seenConfig.responseType, "arraybuffer");
141
+ assert.equal(Buffer.isBuffer(result.body), true);
142
+ assert.deepEqual([...result.body], [1, 2, 3, 4]);
143
+ });
144
+ test("request supports error-only callbacks used by fire-and-forget call sites", async (t) => {
145
+ const mockAxios = async () => {
146
+ return {
147
+ status: 204,
148
+ statusText: "No Content",
149
+ headers: {},
150
+ data: "",
151
+ };
152
+ };
153
+ const { request, restore } = loadRequestCompat(mockAxios);
154
+ t.after(restore);
155
+ const error = await new Promise((resolve) => {
156
+ request.post({
157
+ url: "https://example.com/track",
158
+ json: { ok: true },
159
+ }, (requestError) => resolve(requestError));
160
+ });
161
+ assert.equal(error, null);
162
+ });
163
+ test("request supports two-argument callbacks used by existing get callers", async (t) => {
164
+ const mockAxios = async () => {
165
+ return {
166
+ status: 200,
167
+ statusText: "OK",
168
+ headers: {},
169
+ data: "done",
170
+ };
171
+ };
172
+ const { request, restore } = loadRequestCompat(mockAxios);
173
+ t.after(restore);
174
+ const result = await new Promise((resolve) => {
175
+ request.get({ url: "https://example.com/goal" }, (first, second) => {
176
+ resolve({ first, second });
177
+ });
178
+ });
179
+ assert.equal(result.first, null);
180
+ assert.equal(result.second.statusCode, 200);
181
+ assert.equal(result.second.body, "done");
182
+ });
183
+ test("request.put builds multipart form data payloads", async (t) => {
184
+ let seenConfig;
185
+ const mockAxios = async (config) => {
186
+ seenConfig = config;
187
+ return {
188
+ status: 200,
189
+ statusText: "OK",
190
+ headers: {},
191
+ data: "uploaded",
192
+ };
193
+ };
194
+ const { request, restore } = loadRequestCompat(mockAxios);
195
+ t.after(restore);
196
+ const result = await runCallbackRequest(request.put, {
197
+ url: "https://example.com/upload",
198
+ formData: {
199
+ file: {
200
+ value: Buffer.from("hello"),
201
+ options: { filename: "hello.txt" },
202
+ },
203
+ tag: "demo",
204
+ },
205
+ });
206
+ assert.equal(result.error, null);
207
+ assert.equal(result.response.statusCode, 200);
208
+ assert.equal(result.body, "uploaded");
209
+ assert.equal(seenConfig.method, "put");
210
+ assert.equal(typeof seenConfig.data.getHeaders, "function");
211
+ assert.match(seenConfig.headers["content-type"], /^multipart\/form-data; boundary=/);
212
+ });
213
+ test("request(url).pipe(...) streams response bodies", async (t) => {
214
+ let seenConfig;
215
+ const mockAxios = async (config) => {
216
+ seenConfig = config;
217
+ const source = new PassThrough();
218
+ process.nextTick(() => source.end("stream-ok"));
219
+ return {
220
+ status: 200,
221
+ statusText: "OK",
222
+ headers: { "content-type": "text/plain" },
223
+ data: source,
224
+ };
225
+ };
226
+ const { request, restore } = loadRequestCompat(mockAxios);
227
+ t.after(restore);
228
+ const output = request("https://example.com/report.txt");
229
+ const chunks = [];
230
+ output.on("data", (chunk) => {
231
+ chunks.push(chunk);
232
+ });
233
+ const [response] = await once(output, "response");
234
+ await once(output, "end");
235
+ assert.equal(seenConfig.method, "get");
236
+ assert.equal(seenConfig.responseType, "stream");
237
+ assert.equal(response.statusCode, 200);
238
+ assert.equal(Buffer.concat(chunks).toString("utf8"), "stream-ok");
239
+ });
240
+ test("request surfaces axios errors to callbacks", async (t) => {
241
+ const transportError = new Error("boom");
242
+ const mockAxios = async () => {
243
+ throw transportError;
244
+ };
245
+ const { request, restore } = loadRequestCompat(mockAxios);
246
+ t.after(restore);
247
+ const result = await runCallbackRequest(request.head, {
248
+ url: "https://example.com/head",
249
+ });
250
+ assert.equal(result.error, transportError);
251
+ assert.equal(result.response, null);
252
+ assert.equal(result.body, undefined);
253
+ });
254
+ test("request.head supports string urls and returns response metadata", async (t) => {
255
+ let seenConfig;
256
+ const mockAxios = async (config) => {
257
+ seenConfig = config;
258
+ return {
259
+ status: 204,
260
+ statusText: "No Content",
261
+ headers: { etag: "abc123" },
262
+ data: "",
263
+ };
264
+ };
265
+ const { request, restore } = loadRequestCompat(mockAxios);
266
+ t.after(restore);
267
+ const result = await runCallbackRequest(request.head, "https://example.com/head");
268
+ assert.equal(result.error, null);
269
+ assert.equal(seenConfig.method, "head");
270
+ assert.equal(result.response.statusCode, 204);
271
+ assert.equal(result.response.headers.etag, "abc123");
272
+ });
273
+ test("request surfaces request-style errno on transport errors", async (t) => {
274
+ const transportError = new Error("dns fail");
275
+ transportError.code = "ENOTFOUND";
276
+ const mockAxios = async () => {
277
+ throw transportError;
278
+ };
279
+ const { request, restore } = loadRequestCompat(mockAxios);
280
+ t.after(restore);
281
+ const result = await runCallbackRequest(request.get, {
282
+ url: "https://example.com/unreachable",
283
+ });
284
+ assert.equal(result.error, transportError);
285
+ assert.equal(result.error.errno, "ENOTFOUND");
286
+ assert.equal(result.response, null);
287
+ assert.equal(result.body, undefined);
288
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ const crypto = require("crypto");
3
+ const fs = require("fs");
4
+ const sharp = require("sharp");
5
+ const mime = require("mime-types");
6
+ const os = require("os");
7
+ const path = require("path");
8
+ const { PassThrough } = require("stream");
9
+ const { pipeline } = require("stream/promises");
10
+ const buildVariantKey = (baseKey, size) => {
11
+ const suffix = size?.suffix || "";
12
+ const directory = size?.directory;
13
+ const dotIndex = baseKey.lastIndexOf(".");
14
+ let variantKey;
15
+ if (suffix && dotIndex > -1) {
16
+ variantKey = `${baseKey.slice(0, dotIndex)}${suffix}${baseKey.slice(dotIndex)}`;
17
+ }
18
+ else if (suffix) {
19
+ variantKey = `${baseKey}${suffix}`;
20
+ }
21
+ else {
22
+ variantKey = baseKey;
23
+ }
24
+ return directory ? `${directory}/${variantKey}` : variantKey;
25
+ };
26
+ const createTempUploadPath = (originalName) => {
27
+ const extension = path.extname(originalName || "");
28
+ const randomSuffix = crypto.randomBytes(6).toString("hex");
29
+ return path.join(os.tmpdir(), `multer-sharp-s3-${process.pid}-${Date.now()}-${randomSuffix}${extension}`);
30
+ };
31
+ const getUploadedObjects = (file) => {
32
+ const uploads = [];
33
+ const seen = new Set();
34
+ const addUpload = (value) => {
35
+ if (!value?.Bucket || !value?.Key) {
36
+ return;
37
+ }
38
+ const key = `${value.Bucket}/${value.Key}`;
39
+ if (!seen.has(key)) {
40
+ seen.add(key);
41
+ uploads.push({ Bucket: value.Bucket, Key: value.Key });
42
+ }
43
+ };
44
+ addUpload(file);
45
+ Object.values(file || {}).forEach(addUpload);
46
+ return uploads;
47
+ };
48
+ class MulterSharpS3Compat {
49
+ constructor(options) {
50
+ if (!options?.s3) {
51
+ throw new Error("You have to specify s3 for AWS S3 to work.");
52
+ }
53
+ if (!options?.Bucket) {
54
+ throw new Error("You have to specify Bucket for AWS S3 to work.");
55
+ }
56
+ this.opts = {
57
+ ACL: process.env.AWS_ACL || "public-read",
58
+ multiple: false,
59
+ ...options,
60
+ };
61
+ }
62
+ _removeFile(req, file, cb) {
63
+ const uploads = getUploadedObjects(file);
64
+ if (!uploads.length) {
65
+ cb(null);
66
+ return;
67
+ }
68
+ Promise.allSettled(uploads.map(({ Bucket, Key }) => this.opts.s3.deleteObject({ Bucket, Key }).promise()))
69
+ .then((results) => {
70
+ const failed = results.find((result) => result.status === "rejected");
71
+ cb(failed ? failed.reason : null);
72
+ })
73
+ .catch(cb);
74
+ }
75
+ _handleFile(req, file, cb) {
76
+ const baseParams = {
77
+ Bucket: this.opts.Bucket,
78
+ ACL: this.opts.ACL,
79
+ CacheControl: this.opts.CacheControl,
80
+ ContentDisposition: this.opts.ContentDisposition,
81
+ ContentType: this.opts.ContentType,
82
+ Metadata: this.opts.Metadata,
83
+ StorageClass: this.opts.StorageClass,
84
+ ServerSideEncryption: this.opts.ServerSideEncryption,
85
+ SSEKMSKeyId: this.opts.SSEKMSKeyId,
86
+ };
87
+ const finalize = async (key) => {
88
+ try {
89
+ const params = { ...baseParams, Key: key };
90
+ const result = file.mimetype?.includes("image")
91
+ ? await this._uploadImageVariants(params, file)
92
+ : await this._uploadNonImage(params, file);
93
+ cb(null, JSON.parse(JSON.stringify(result)));
94
+ }
95
+ catch (error) {
96
+ cb(error);
97
+ }
98
+ };
99
+ if (typeof this.opts.Key === "function") {
100
+ this.opts.Key(req, file, (error, key) => {
101
+ if (error) {
102
+ cb(error);
103
+ }
104
+ else {
105
+ finalize(key);
106
+ }
107
+ });
108
+ }
109
+ else {
110
+ finalize(this.opts.Key);
111
+ }
112
+ }
113
+ async _deleteUploadedObjects(uploads) {
114
+ if (!uploads.length) {
115
+ return;
116
+ }
117
+ await Promise.allSettled(uploads.map(({ Bucket, Key }) => this.opts.s3.deleteObject({ Bucket, Key }).promise()));
118
+ }
119
+ async _uploadStreamToS3(params, readable) {
120
+ let uploadedSize = 0;
121
+ const body = new PassThrough();
122
+ const upload = this.opts.s3.upload({ ...params, Body: body });
123
+ const uploadPromise = upload.promise().catch((error) => {
124
+ if (typeof upload.abort === "function") {
125
+ try {
126
+ upload.abort();
127
+ }
128
+ catch (abortError) {
129
+ // Ignore abort cleanup failures and preserve the original error.
130
+ }
131
+ }
132
+ readable.destroy(error);
133
+ body.destroy(error);
134
+ throw error;
135
+ });
136
+ body.on("data", (chunk) => {
137
+ uploadedSize += chunk.length;
138
+ });
139
+ readable.on("error", (error) => {
140
+ body.destroy(error);
141
+ });
142
+ readable.pipe(body);
143
+ const uploadResult = await uploadPromise;
144
+ return { uploadResult, size: uploadedSize };
145
+ }
146
+ async _uploadImageVariant(tempFilePath, params, file, size) {
147
+ let transformer = sharp(tempFilePath, { animated: true, failOn: "none" });
148
+ const outputFormat = file.outputFormat || this.opts.toFormat;
149
+ if (size?.width || size?.height || size?.options) {
150
+ transformer = transformer.resize(size.width, size.height, size.options);
151
+ }
152
+ if (outputFormat) {
153
+ transformer = transformer.toFormat(outputFormat);
154
+ }
155
+ const contentType = this.opts.ContentType ||
156
+ mime.contentType(outputFormat || file.mimetype) ||
157
+ file.mimetype;
158
+ const { uploadResult, size: uploadedSize } = await this._uploadStreamToS3({
159
+ ...params,
160
+ ContentType: contentType,
161
+ }, transformer);
162
+ return { uploadResult, uploadedSize, contentType };
163
+ }
164
+ async _uploadImageVariants(params, file) {
165
+ const tempFilePath = createTempUploadPath(file.originalname || params.Key);
166
+ const sizes = this.opts.multiple &&
167
+ Array.isArray(this.opts.resize) &&
168
+ this.opts.resize.length
169
+ ? this.opts.resize
170
+ : [this.opts.resize || {}];
171
+ const uploads = {};
172
+ const uploadedObjects = [];
173
+ try {
174
+ await pipeline(file.stream, fs.createWriteStream(tempFilePath));
175
+ for (const size of sizes) {
176
+ const variantKey = buildVariantKey(params.Key, size);
177
+ const { uploadResult, uploadedSize, contentType } = await this._uploadImageVariant(tempFilePath, { ...params, Key: variantKey }, file, size);
178
+ uploadedObjects.push({
179
+ Bucket: uploadResult.Bucket || params.Bucket,
180
+ Key: uploadResult.Key || variantKey,
181
+ });
182
+ uploads[size?.suffix || "default"] = {
183
+ ACL: this.opts.ACL,
184
+ ContentDisposition: this.opts.ContentDisposition,
185
+ StorageClass: this.opts.StorageClass,
186
+ ServerSideEncryption: this.opts.ServerSideEncryption,
187
+ Metadata: this.opts.Metadata,
188
+ ...uploadResult,
189
+ Bucket: uploadResult.Bucket || params.Bucket,
190
+ Key: uploadResult.Key || variantKey,
191
+ size: uploadedSize,
192
+ ContentType: contentType,
193
+ };
194
+ }
195
+ uploads.mimetype =
196
+ this.opts.ContentType ||
197
+ mime.contentType(file.outputFormat || this.opts.toFormat || "png") ||
198
+ file.mimetype;
199
+ return uploads;
200
+ }
201
+ catch (error) {
202
+ await this._deleteUploadedObjects(uploadedObjects);
203
+ throw error;
204
+ }
205
+ finally {
206
+ await fs.promises.unlink(tempFilePath).catch(() => { });
207
+ }
208
+ }
209
+ async _uploadNonImage(params, file) {
210
+ const contentType = params.ContentType || file.mimetype;
211
+ const { uploadResult, size } = await this._uploadStreamToS3({
212
+ ...params,
213
+ ContentType: contentType,
214
+ }, file.stream);
215
+ return {
216
+ size,
217
+ ACL: this.opts.ACL,
218
+ ContentDisposition: this.opts.ContentDisposition,
219
+ StorageClass: this.opts.StorageClass,
220
+ ServerSideEncryption: this.opts.ServerSideEncryption,
221
+ Metadata: this.opts.Metadata,
222
+ ContentType: contentType,
223
+ mimetype: contentType,
224
+ ...uploadResult,
225
+ };
226
+ }
227
+ }
228
+ module.exports = function multerSharpS3Compat(options) {
229
+ return new MulterSharpS3Compat(options);
230
+ };
@@ -0,0 +1,22 @@
1
+ declare function _exports(options: any): MulterSharpS3Compat;
2
+ export = _exports;
3
+ declare class MulterSharpS3Compat {
4
+ constructor(options: any);
5
+ opts: any;
6
+ _removeFile(req: any, file: any, cb: any): void;
7
+ _handleFile(req: any, file: any, cb: any): void;
8
+ _deleteUploadedObjects(uploads: any): Promise<void>;
9
+ _uploadStreamToS3(params: any, readable: any): Promise<{
10
+ uploadResult: any;
11
+ size: number;
12
+ }>;
13
+ _uploadImageVariant(tempFilePath: any, params: any, file: any, size: any): Promise<{
14
+ uploadResult: any;
15
+ uploadedSize: number;
16
+ contentType: any;
17
+ }>;
18
+ _uploadImageVariants(params: any, file: any): Promise<{
19
+ mimetype: any;
20
+ }>;
21
+ _uploadNonImage(params: any, file: any): Promise<any>;
22
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ const path = require("path");
3
+ const rootPassportPath = require.resolve("passport");
4
+ const rootPassportModule = require.cache[rootPassportPath] || require.cache[rootPassportPath] || (() => {
5
+ require(rootPassportPath);
6
+ return require.cache[rootPassportPath];
7
+ })();
8
+ const passportSsoPath = require.resolve("passport-sso");
9
+ const nestedPassportPath = require.resolve("passport", {
10
+ paths: [path.dirname(passportSsoPath)],
11
+ });
12
+ if (nestedPassportPath !== rootPassportPath) {
13
+ require.cache[nestedPassportPath] = rootPassportModule;
14
+ }
15
+ module.exports = require("passport-sso");
@@ -0,0 +1,2 @@
1
+ declare const _exports: any;
2
+ export = _exports;
@@ -3,7 +3,7 @@ const async = require('async');
3
3
  const models = require('../models/index.cjs');
4
4
  const _ = require('lodash');
5
5
  const fs = require('fs');
6
- const request = require('request');
6
+ const request = require("./requestCompat.cjs");
7
7
  const log = require('./logger.cjs');
8
8
  const recountPosts = (postIds, done) => {
9
9
  async.forEachSeries(postIds, (postId, forEachPostCallback) => {