operand-meta-sdk 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/.eslintrc.js +25 -0
  2. package/.prettierrc +4 -0
  3. package/README.md +435 -0
  4. package/dist/jest.config.d.ts +3 -0
  5. package/dist/jest.config.js +14 -0
  6. package/dist/jest.config.js.map +1 -0
  7. package/dist/src/__test__/mocks/index.d.ts +2 -0
  8. package/dist/src/__test__/mocks/index.js +6 -0
  9. package/dist/src/__test__/mocks/index.js.map +1 -0
  10. package/dist/src/error/operand-error.d.ts +8 -0
  11. package/dist/src/error/operand-error.js +196 -0
  12. package/dist/src/error/operand-error.js.map +1 -0
  13. package/dist/src/index.d.ts +10 -0
  14. package/dist/src/index.js +22 -0
  15. package/dist/src/index.js.map +1 -0
  16. package/dist/src/interfaces/ing-publish.d.ts +53 -0
  17. package/dist/src/interfaces/ing-publish.js +3 -0
  18. package/dist/src/interfaces/ing-publish.js.map +1 -0
  19. package/dist/src/interfaces/meta-auth.d.ts +14 -0
  20. package/dist/src/interfaces/meta-auth.js +3 -0
  21. package/dist/src/interfaces/meta-auth.js.map +1 -0
  22. package/dist/src/interfaces/meta-mkt.d.ts +4 -0
  23. package/dist/src/interfaces/meta-mkt.js +3 -0
  24. package/dist/src/interfaces/meta-mkt.js.map +1 -0
  25. package/dist/src/interfaces/meta-response.d.ts +285 -0
  26. package/dist/src/interfaces/meta-response.js +3 -0
  27. package/dist/src/interfaces/meta-response.js.map +1 -0
  28. package/dist/src/interfaces/meta.d.ts +6 -0
  29. package/dist/src/interfaces/meta.js +3 -0
  30. package/dist/src/interfaces/meta.js.map +1 -0
  31. package/dist/src/interfaces/page-publish.d.ts +66 -0
  32. package/dist/src/interfaces/page-publish.js +3 -0
  33. package/dist/src/interfaces/page-publish.js.map +1 -0
  34. package/dist/src/modules/auth/meta-auth.d.ts +35 -0
  35. package/dist/src/modules/auth/meta-auth.js +131 -0
  36. package/dist/src/modules/auth/meta-auth.js.map +1 -0
  37. package/dist/src/modules/auth/meta-auth.spec.d.ts +1 -0
  38. package/dist/src/modules/auth/meta-auth.spec.js +76 -0
  39. package/dist/src/modules/auth/meta-auth.spec.js.map +1 -0
  40. package/dist/src/modules/comments/ing-comments.d.ts +7 -0
  41. package/dist/src/modules/comments/ing-comments.js +27 -0
  42. package/dist/src/modules/comments/ing-comments.js.map +1 -0
  43. package/dist/src/modules/comments/page-comments.d.ts +6 -0
  44. package/dist/src/modules/comments/page-comments.js +18 -0
  45. package/dist/src/modules/comments/page-comments.js.map +1 -0
  46. package/dist/src/modules/insights/ing-insights.d.ts +42 -0
  47. package/dist/src/modules/insights/ing-insights.js +150 -0
  48. package/dist/src/modules/insights/ing-insights.js.map +1 -0
  49. package/dist/src/modules/insights/mkt-insights.d.ts +10 -0
  50. package/dist/src/modules/insights/mkt-insights.js +46 -0
  51. package/dist/src/modules/insights/mkt-insights.js.map +1 -0
  52. package/dist/src/modules/insights/page-insights.d.ts +34 -0
  53. package/dist/src/modules/insights/page-insights.js +146 -0
  54. package/dist/src/modules/insights/page-insights.js.map +1 -0
  55. package/dist/src/modules/meta-ing.d.ts +5 -0
  56. package/dist/src/modules/meta-ing.js +11 -0
  57. package/dist/src/modules/meta-ing.js.map +1 -0
  58. package/dist/src/modules/meta-mkt.d.ts +5 -0
  59. package/dist/src/modules/meta-mkt.js +11 -0
  60. package/dist/src/modules/meta-mkt.js.map +1 -0
  61. package/dist/src/modules/meta-page.d.ts +5 -0
  62. package/dist/src/modules/meta-page.js +11 -0
  63. package/dist/src/modules/meta-page.js.map +1 -0
  64. package/dist/src/modules/meta.d.ts +10 -0
  65. package/dist/src/modules/meta.js +23 -0
  66. package/dist/src/modules/meta.js.map +1 -0
  67. package/dist/src/modules/publish/ing-publish.d.ts +39 -0
  68. package/dist/src/modules/publish/ing-publish.js +464 -0
  69. package/dist/src/modules/publish/ing-publish.js.map +1 -0
  70. package/dist/src/modules/publish/page-publish.d.ts +51 -0
  71. package/dist/src/modules/publish/page-publish.js +560 -0
  72. package/dist/src/modules/publish/page-publish.js.map +1 -0
  73. package/dist/src/modules/publish/page-publish.spec.d.ts +1 -0
  74. package/dist/src/modules/publish/page-publish.spec.js +280 -0
  75. package/dist/src/modules/publish/page-publish.spec.js.map +1 -0
  76. package/dist/src/modules/utils/meta-utils.d.ts +8 -0
  77. package/dist/src/modules/utils/meta-utils.js +28 -0
  78. package/dist/src/modules/utils/meta-utils.js.map +1 -0
  79. package/dist/src/utils/api.d.ts +8 -0
  80. package/dist/src/utils/api.js +36 -0
  81. package/dist/src/utils/api.js.map +1 -0
  82. package/dist/tsconfig.tsbuildinfo +1 -0
  83. package/jest.config.ts +198 -0
  84. package/package.json +39 -0
  85. package/src/__test__/mocks/image.jpeg +0 -0
  86. package/src/__test__/mocks/index.ts +5 -0
  87. package/src/__test__/mocks/video-to-post.mp4 +0 -0
  88. package/src/__test__/mocks/video-to-stories.mp4 +0 -0
  89. package/src/error/operand-error.ts +217 -0
  90. package/src/index.ts +21 -0
  91. package/src/interfaces/ing-publish.ts +58 -0
  92. package/src/interfaces/meta-auth.ts +52 -0
  93. package/src/interfaces/meta-mkt.ts +5 -0
  94. package/src/interfaces/meta-response.ts +319 -0
  95. package/src/interfaces/meta.ts +7 -0
  96. package/src/interfaces/page-publish.ts +72 -0
  97. package/src/modules/auth/meta-auth.spec.ts +93 -0
  98. package/src/modules/auth/meta-auth.ts +227 -0
  99. package/src/modules/comments/ing-comments.ts +38 -0
  100. package/src/modules/comments/page-comments.ts +20 -0
  101. package/src/modules/insights/ing-insights.ts +275 -0
  102. package/src/modules/insights/mkt-insights.ts +68 -0
  103. package/src/modules/insights/page-insights.ts +267 -0
  104. package/src/modules/meta-ing.ts +8 -0
  105. package/src/modules/meta-mkt.ts +8 -0
  106. package/src/modules/meta-page.ts +8 -0
  107. package/src/modules/meta.ts +31 -0
  108. package/src/modules/publish/ing-publish.ts +754 -0
  109. package/src/modules/publish/page-publish.spec.ts +386 -0
  110. package/src/modules/publish/page-publish.ts +881 -0
  111. package/src/modules/utils/meta-utils.ts +37 -0
  112. package/src/utils/api.ts +45 -0
  113. package/tsconfig.json +22 -0
@@ -0,0 +1,386 @@
1
+ import axios from "axios";
2
+ import { MetaPage } from "../meta-page";
3
+ import { CreatePost, CreateStories } from "../../interfaces/page-publish";
4
+ import * as path from "node:path";
5
+ import { PHOTO_URL_MOCK, VIDEO_URL_MOCK } from "../../__test__/mocks";
6
+
7
+ // const originalFetch = global.fetch;
8
+
9
+ jest.mock("axios");
10
+
11
+ const mockedAxios = axios as jest.Mocked<typeof axios>;
12
+ mockedAxios.create.mockReturnValue(mockedAxios);
13
+
14
+ describe("MetaPage", () => {
15
+ let metaPage: MetaPage;
16
+ const pageAccessToken = "dummyAccessToken";
17
+ const pageId = "dummyPageId";
18
+ const apiVersion = "v21.0";
19
+
20
+ beforeAll(() => {
21
+ metaPage = new MetaPage({ pageAccessToken, pageId, apiVersion });
22
+ });
23
+
24
+ describe("createPost", () => {
25
+ it("should create a text post without mediaType and without schedule", async () => {
26
+ const post = {
27
+ message: "Test message",
28
+ publishNow: true,
29
+ } as CreatePost;
30
+ const mockData = { data: { id: "12345" } };
31
+ mockedAxios.post.mockResolvedValueOnce(mockData);
32
+
33
+ const result = await metaPage.createPost(post);
34
+
35
+ expect(result).toBe("12345");
36
+ expect(mockedAxios.post).toHaveBeenCalledWith(`/dummyPageId/feed`, {
37
+ access_token: "dummyAccessToken",
38
+ message: "Test message",
39
+ });
40
+ });
41
+
42
+ it("should create a text post without mediaType and with schedule", async () => {
43
+ const datePublish = new Date(
44
+ new Date().setDate(new Date().getDate() + 1),
45
+ );
46
+
47
+ const post = {
48
+ message: "Test message",
49
+ publishNow: false,
50
+ datePublish,
51
+ } as CreatePost;
52
+
53
+ const mockData = { data: { id: "12345" } };
54
+ mockedAxios.post.mockResolvedValueOnce(mockData);
55
+
56
+ const result = await metaPage.createPost(post);
57
+
58
+ expect(result).toBe("12345");
59
+ expect(mockedAxios.post).toHaveBeenCalledWith(`/dummyPageId/feed`, {
60
+ access_token: "dummyAccessToken",
61
+ message: "Test message",
62
+ published: false,
63
+ scheduled_publish_time: Math.floor(datePublish.getTime() / 1000),
64
+ });
65
+ }, 10000);
66
+
67
+ it("should create a photo url post without schedule", async () => {
68
+ const post = {
69
+ message: "Test message",
70
+ publishNow: true,
71
+ mediaType: "photo",
72
+ photos: [
73
+ {
74
+ source: "url",
75
+ value: PHOTO_URL_MOCK,
76
+ },
77
+ ],
78
+ } as CreatePost;
79
+
80
+ const mockData = { data: { id: "12345" } };
81
+
82
+ mockedAxios.post
83
+ .mockResolvedValueOnce(mockData)
84
+ .mockResolvedValueOnce(mockData);
85
+
86
+ const result = await metaPage.createPost(post);
87
+
88
+ expect(result).toBe("12345");
89
+ expect(mockedAxios.post).toHaveBeenLastCalledWith(`/dummyPageId/feed`, {
90
+ access_token: "dummyAccessToken",
91
+ message: "Test message",
92
+ attached_media: [{ media_fbid: "12345" }],
93
+ });
94
+ }, 10000);
95
+
96
+ it("should create a photo url post with schedule", async () => {
97
+ const datePublish = new Date(
98
+ new Date().setDate(new Date().getDate() + 1),
99
+ );
100
+
101
+ const post = {
102
+ message: "Test message",
103
+ publishNow: false,
104
+ datePublish,
105
+ mediaType: "photo",
106
+ photos: [
107
+ {
108
+ source: "url",
109
+ value: PHOTO_URL_MOCK,
110
+ },
111
+ ],
112
+ } as CreatePost;
113
+
114
+ const mockData = { data: { id: "12345" } };
115
+
116
+ mockedAxios.post
117
+ .mockResolvedValueOnce(mockData)
118
+ .mockResolvedValueOnce(mockData);
119
+
120
+ const result = await metaPage.createPost(post);
121
+
122
+ expect(result).toBe("12345");
123
+ expect(mockedAxios.post).toHaveBeenLastCalledWith(`/dummyPageId/feed`, {
124
+ access_token: "dummyAccessToken",
125
+ message: "Test message",
126
+ attached_media: [{ media_fbid: "12345" }],
127
+ published: false,
128
+ scheduled_publish_time: Math.floor(datePublish.getTime() / 1000),
129
+ });
130
+ }, 10000);
131
+
132
+ it("should create a photo path post without schedule", async () => {
133
+ const post = {
134
+ message: "Test message",
135
+ publishNow: true,
136
+ photos: [
137
+ {
138
+ source: "path",
139
+ value: path.resolve(
140
+ __dirname,
141
+ "..",
142
+ "__test__",
143
+ "mocks",
144
+ "image.jpeg",
145
+ ),
146
+ },
147
+ ],
148
+ } as CreatePost;
149
+
150
+ const mockData = { data: { id: "12345" } };
151
+
152
+ mockedAxios.post.mockResolvedValueOnce(mockData);
153
+
154
+ const result = await metaPage.createPost(post);
155
+
156
+ expect(result).toBe("12345");
157
+ });
158
+
159
+ it("should create a photo path post with schedule", async () => {
160
+ const datePublish = new Date(
161
+ new Date().setDate(new Date().getDate() + 1),
162
+ );
163
+
164
+ const post = {
165
+ message: "Test message",
166
+ publishNow: false,
167
+ datePublish,
168
+ photos: [
169
+ {
170
+ source: "path",
171
+ value: path.resolve(
172
+ __dirname,
173
+ "..",
174
+ "__test__",
175
+ "mocks",
176
+ "image.jpeg",
177
+ ),
178
+ },
179
+ ],
180
+ } as CreatePost;
181
+
182
+ const mockData = { data: { id: "12345" } };
183
+
184
+ mockedAxios.post.mockResolvedValueOnce(mockData);
185
+
186
+ const result = await metaPage.createPost(post);
187
+
188
+ expect(result).toBe("12345");
189
+ expect(mockedAxios.post).toHaveBeenCalledWith(`/dummyPageId/feed`, {
190
+ access_token: "dummyAccessToken",
191
+ message: "Test message",
192
+ published: false,
193
+ scheduled_publish_time: Math.floor(datePublish.getTime() / 1000),
194
+ });
195
+ });
196
+
197
+ it("should create a video url post without schedule", async () => {
198
+ const post = {
199
+ message: "Test message",
200
+ publishNow: true,
201
+ mediaType: "video",
202
+ video: {
203
+ source: "url",
204
+ value: VIDEO_URL_MOCK,
205
+ },
206
+ } as CreatePost;
207
+
208
+ const mockData = { data: { id: "12345" } };
209
+
210
+ mockedAxios.post.mockResolvedValueOnce(mockData);
211
+
212
+ const result = await metaPage.createPost(post);
213
+
214
+ expect(result).toBe("12345");
215
+ }, 10000);
216
+
217
+ it("should create a video url post with schedule", async () => {
218
+ const datePublish = new Date(
219
+ new Date().setDate(new Date().getDate() + 1),
220
+ );
221
+
222
+ const post = {
223
+ message: "Test message",
224
+ publishNow: false,
225
+ datePublish,
226
+ mediaType: "video",
227
+ video: {
228
+ source: "url",
229
+ value: VIDEO_URL_MOCK,
230
+ },
231
+ } as CreatePost;
232
+
233
+ const mockData = { data: { id: "12345" } };
234
+
235
+ mockedAxios.post.mockResolvedValueOnce(mockData);
236
+
237
+ const result = await metaPage.createPost(post);
238
+
239
+ expect(result).toBe("12345");
240
+ }, 10000);
241
+
242
+ it("should error if publishNow is false and datePublish not provided", async () => {
243
+ const post = {
244
+ message: "Test message",
245
+ publishNow: false,
246
+ } as CreatePost;
247
+
248
+ await expect(metaPage.createPost(post)).rejects.toThrowError(
249
+ "You must provide the datePublish if you don't want to publish now.",
250
+ );
251
+ });
252
+
253
+ it("should error if publishNow is false and datePublish is bellow the current date", async () => {
254
+ const post = {
255
+ message: "Test message",
256
+ publishNow: false,
257
+ datePublish: new Date(new Date().setDate(new Date().getDate() - 1)),
258
+ } as CreatePost;
259
+
260
+ await expect(metaPage.createPost(post)).rejects.toThrowError(
261
+ "The datePublish must be between 10 minutes from now and 6 months from now.",
262
+ );
263
+ });
264
+ });
265
+
266
+ describe("deletePost", () => {
267
+ it("should delete a post", async () => {
268
+ const postId = "12345";
269
+ const mockData = { data: { success: true } };
270
+
271
+ mockedAxios.delete.mockResolvedValueOnce(mockData);
272
+
273
+ const result = await metaPage.deletePost(postId);
274
+
275
+ expect(result).toBe(true);
276
+ expect(mockedAxios.delete).toHaveBeenCalledWith(`/12345`, {
277
+ params: {
278
+ access_token: "dummyAccessToken",
279
+ },
280
+ });
281
+ });
282
+ });
283
+
284
+ describe("getAllPosts", () => {
285
+ it("should get all posts", async () => {
286
+ const mockData = { data: { data: [{ id: "12345" }] } };
287
+
288
+ mockedAxios.get.mockResolvedValueOnce(mockData);
289
+
290
+ const result = await metaPage.getAllPosts();
291
+
292
+ expect(result).toStrictEqual([{ id: "12345" }]);
293
+ expect(mockedAxios.get).toHaveBeenCalledWith(`/dummyPageId/feed`, {
294
+ params: {
295
+ access_token: "dummyAccessToken",
296
+ },
297
+ });
298
+ });
299
+ });
300
+
301
+ describe("createStories", () => {
302
+ it("should create a story with image", async () => {
303
+ const stories = {
304
+ source: "url",
305
+ mediaType: "photo",
306
+ url: PHOTO_URL_MOCK,
307
+ } as CreateStories;
308
+
309
+ const mockData = { data: { id: "12345" } };
310
+ const mockData2 = { data: { post_id: "12345" } };
311
+
312
+ mockedAxios.post
313
+ .mockResolvedValueOnce(mockData)
314
+ .mockResolvedValueOnce(mockData2);
315
+
316
+ const result = await metaPage.createStories(stories);
317
+
318
+ expect(result).toBe("12345");
319
+ expect(mockedAxios.post).toHaveBeenLastCalledWith(
320
+ `/dummyPageId/photo_stories`,
321
+ {
322
+ access_token: "dummyAccessToken",
323
+ photo_id: "12345",
324
+ },
325
+ );
326
+ }, 10000);
327
+
328
+ it.skip("should create a story with video", async () => {
329
+ const stories = {
330
+ source: "url",
331
+ mediaType: "video",
332
+ url: VIDEO_URL_MOCK,
333
+ } as CreateStories;
334
+
335
+ const mockDataUpload = {
336
+ data: { video_id: "12345", upload_url: "www.example.com" },
337
+ };
338
+
339
+ const mockData = { data: { post_id: "12345" } };
340
+
341
+ const mockedFetch = jest.spyOn(global, "fetch");
342
+
343
+ mockedFetch
344
+ // .mockResolvedValueOnce((...args) => originalFetch(...args))
345
+ .mockResolvedValueOnce(null);
346
+
347
+ mockedAxios.post
348
+ .mockResolvedValueOnce(mockDataUpload)
349
+ .mockResolvedValueOnce(mockData);
350
+
351
+ const result = await metaPage.createStories(stories);
352
+
353
+ expect(result).toBe("12345");
354
+ expect(mockedAxios.post).toHaveBeenLastCalledWith(
355
+ `/dummyPageId/video_stories`,
356
+ {
357
+ access_token: "dummyAccessToken",
358
+ video_id: "12345",
359
+ },
360
+ );
361
+ }, 10000);
362
+
363
+ it("should create a story with image from path", async () => {
364
+ const stories = {
365
+ source: "path",
366
+ mediaType: "photo",
367
+ path: path.resolve(__dirname, "..", "__test__", "mocks", "image.jpeg"),
368
+ } as CreateStories;
369
+
370
+ const mockDataUpload = {
371
+ data: {
372
+ id: "12345",
373
+ },
374
+ };
375
+ const mockData = { data: { post_id: "12345" } };
376
+
377
+ mockedAxios.post
378
+ .mockResolvedValueOnce(mockDataUpload)
379
+ .mockResolvedValueOnce(mockData);
380
+
381
+ const result = await metaPage.createStories(stories);
382
+
383
+ expect(result).toBe("12345");
384
+ });
385
+ });
386
+ });