From bbe6eacb7f837182eb7176577af2c24c2a988e92 Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 00:39:44 +0400 Subject: [PATCH 01/10] Amendments after QA feedback --- .../wordpress_com/actions/create-post/create-post.mjs | 6 ++++-- .../wordpress_com/actions/delete-post/delete-post.mjs | 5 +++-- .../wordpress_com/actions/upload-media/upload-media.mjs | 6 ++++-- .../wordpress_com/sources/new-comment/new-comment.mjs | 7 ++++++- .../wordpress_com/sources/new-follower/new-follower.mjs | 7 ++++++- components/wordpress_com/sources/new-post/new-post.mjs | 7 ++++++- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/components/wordpress_com/actions/create-post/create-post.mjs b/components/wordpress_com/actions/create-post/create-post.mjs index db81fd19ab850..5d28647394c2a 100644 --- a/components/wordpress_com/actions/create-post/create-post.mjs +++ b/components/wordpress_com/actions/create-post/create-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-create-post", name: "Create New Post", description: "Creates a new post on a WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/new/)", - version: "0.0.1", + version: "0.0.6", type: "action", props: { wordpress, @@ -80,7 +80,9 @@ export default { wordpress.throwCustomError("Could not create post", error, warnings); }; - $.export("$summary", `Post successfully created. ID = ${response?.ID}` + "\n- " + warnings.join("\n- ")); + $.export("$summary", + `Post “${this.title}” is successfully created with ID “${response?.ID}”` + + "\n- " + warnings.join("\n- ")); }, }; diff --git a/components/wordpress_com/actions/delete-post/delete-post.mjs b/components/wordpress_com/actions/delete-post/delete-post.mjs index 367d4621cd170..0eb7908e90413 100644 --- a/components/wordpress_com/actions/delete-post/delete-post.mjs +++ b/components/wordpress_com/actions/delete-post/delete-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-delete-post", name: "Delete Post", description: "Deletes a post. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/delete/)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { wordpress, @@ -48,7 +48,8 @@ export default { wordpress.throwCustomError("Could not delete post", error, warnings); }; - $.export("$summary", `Post ID = ${response?.ID} successfully deleted.` + "\n- " + warnings.join("\n- ")); + $.export("$summary", `Post ID “${response?.ID}” has been successfully deleted` + + "\n- " + warnings.join("\n- ")); }, }; diff --git a/components/wordpress_com/actions/upload-media/upload-media.mjs b/components/wordpress_com/actions/upload-media/upload-media.mjs index d368c709eaf77..2077f81ae4899 100644 --- a/components/wordpress_com/actions/upload-media/upload-media.mjs +++ b/components/wordpress_com/actions/upload-media/upload-media.mjs @@ -5,7 +5,7 @@ export default { key: "wordpress_com-upload-media", name: "Upload Media", description: "Uploads a media file from a URL to the specified WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/media/new/)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { wordpress, @@ -74,7 +74,9 @@ export default { const media = response.media[0]; - $.export("$summary", `Media "${media.title}" uploaded successfully (ID: ${media.ID})` + "\n- " + warnings.join("\n- ")); + `Media ID “${media.ID})” has been successfully uploaded`; + $.export("$summary", `Media ID “${media.ID})” has been successfully uploaded` + + "\n- " + warnings.join("\n- ")); console.log(response); return response; diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index 2cd1361d55d73..7748430cdfd0a 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-comment", name: "New Comment", description: "Emit new event for each new comment added since the last run. If no new comments, emit nothing.", - version: "0.0.1", + version: "0.0.2", type: "source", dedupe: "unique", props: { @@ -36,6 +36,11 @@ export default { min: 1, max: 100, }, + timer: { + type: "$.interface.timer", + label: "Timer", + description: "How often to poll WordPress for new comments.", + }, }, async run({ $ }) { const warnings = []; diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 841bbba2bb24d..59b4b0cfe7cfd 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-follower", name: "New Follower", description: "Emit new event for each new follower that subscribes to the site.", - version: "0.0.1", + version: "0.0.2", type: "source", dedupe: "unique", props: { @@ -16,6 +16,11 @@ export default { "siteId", ], }, + timer: { + type: "$.interface.timer", + label: "Timer", + description: "How often to poll WordPress for new followers.", + }, }, async run({ $ }) { const warnings = []; diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index 4a5de597ac794..32365620fd8df 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-post", name: "New Post", description: "Emit new event for each new post published since the last run. If no new posts, emit nothing.", - version: "0.0.1", + version: "0.0.2", type: "source", dedupe: "unique", props: { @@ -45,6 +45,11 @@ export default { min: 1, max: 100, }, + timer: { + type: "$.interface.timer", + label: "Timer", + description: "How often to poll WordPress for new posts.", + }, }, async run({ $ }) { const warnings = []; From 1b6788eff24a89299b57724dab369fd157f675ff Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 03:18:05 +0400 Subject: [PATCH 02/10] Fix sources --- .../actions/delete-post/delete-post.mjs | 4 +- components/wordpress_com/common/methods.mjs | 2 +- .../sources/new-comment/new-comment.mjs | 14 ++-- .../sources/new-follower/new-follower.mjs | 6 -- .../sources/new-post/new-post.mjs | 69 +++++++++++-------- .../wordpress_com/wordpress_com.app.mjs | 18 +++++ pnpm-lock.yaml | 5 +- 7 files changed, 71 insertions(+), 47 deletions(-) diff --git a/components/wordpress_com/actions/delete-post/delete-post.mjs b/components/wordpress_com/actions/delete-post/delete-post.mjs index 0eb7908e90413..b8f6d4570d5a3 100644 --- a/components/wordpress_com/actions/delete-post/delete-post.mjs +++ b/components/wordpress_com/actions/delete-post/delete-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-delete-post", name: "Delete Post", description: "Deletes a post. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/delete/)", - version: "0.0.2", + version: "0.0.1", type: "action", props: { wordpress, @@ -47,7 +47,7 @@ export default { } catch (error) { wordpress.throwCustomError("Could not delete post", error, warnings); }; - + $.export("$summary", `Post ID “${response?.ID}” has been successfully deleted` + "\n- " + warnings.join("\n- ")); }, diff --git a/components/wordpress_com/common/methods.mjs b/components/wordpress_com/common/methods.mjs index be0ef60b373f1..d5b023930d834 100644 --- a/components/wordpress_com/common/methods.mjs +++ b/components/wordpress_com/common/methods.mjs @@ -201,7 +201,7 @@ export default { Determines whether an error originated from your own validation code or from the API request. Useful for debugging and crafting more helpful error messages. =================================================================================================*/ - throwCustomError(mainMessage, error, warnings) { + throwCustomError(mainMessage, error, warnings = []) { const thrower = error?.response?.status ? "API response" diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index 7748430cdfd0a..de6c2b9386adc 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -42,6 +42,14 @@ export default { description: "How often to poll WordPress for new comments.", }, }, + hooks: { + async activate() { + await this.db.set("lastCommentId", null); + await this.run({ $ : this.wordpress._mock$() }); + }, + }, + + async run({ $ }) { const warnings = []; @@ -77,12 +85,6 @@ export default { console.log("No comments found on first run. Source initialized with no cursor."); return; } - - const newest = comments[0]?.ID; - if (!newest) { - throw new Error("Failed to initialize: The latest comment does not have a valid ID."); - } - await db.set("lastCommentId", newest); console.log(`Initialized lastCommentId on first run with comment ID ${newest}.`); return; diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 59b4b0cfe7cfd..9174be6d15ad7 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -54,12 +54,6 @@ export default { console.log("No followers found on first run. Source initialized with no cursor."); return; } - - const newest = followers[0]?.ID; - if (!newest) { - throw new Error("Failed to initialize: The latest follower does not have a valid ID."); - } - await db.set("lastFollowerId", newest); console.log(`Initialized lastFollowerId on first run with follower ID ${newest}.`); return; diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index 32365620fd8df..d6145e17bd37d 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -51,6 +51,41 @@ export default { description: "How often to poll WordPress for new posts.", }, }, + methods: { + getWordpressPosts($){ + + let response; + response = this.wordpress.getWordpressPosts({ + $, + site: this.site, + type: this.type, + number: this.number, + }); + + return response; + } + }, + hooks: { + async activate() { + + const { + wordpress, + db, + type, + } = this; + + await this.db.set("lastCommentId", null); + + const response = await this.getWordpressPosts(this.wordpress._mock$); + + const posts = (type === "attachment") + ? (response.media || []) + : (response.posts || []); + + await wordpress.initialize(posts, db, "lastPostId"); + }, + }, + async run({ $ }) { const warnings = []; @@ -59,46 +94,20 @@ export default { db, site, type, - number, } = this; warnings.push(...wordpress.checkDomainOrId(site)); - let response; - try { - response = await wordpress.getWordpressPosts({ - $, - site, - type, - number, - }); - - } catch (error) { - wordpress.throwCustomError("Failed to fetch posts from WordPress:", error, warnings); - } + const response = await this.getWordpressPosts($); const posts = (type === "attachment") ? (response.media || []) : (response.posts || []); const lastPostId = Number(await db.get("lastPostId")); - // First run: Initialize cursor - if (!lastPostId) { - if (!posts.length) { - console.log("No posts found on first run. Source initialized with no cursor."); - return; - } - - const newest = posts[0]?.ID; - if (!newest) { - throw new Error("Failed to initialize: The latest post does not have a valid ID."); - } - - await db.set("lastPostId", newest); - console.log(`Initialized lastPostId on first run with post ID ${newest}.`); - return; - } - + // Initialize if not already set + if (!lastPostId) await initialize(posts, db, "lastPostId"); + let maxPostIdTracker = lastPostId; const newPosts = []; diff --git a/components/wordpress_com/wordpress_com.app.mjs b/components/wordpress_com/wordpress_com.app.mjs index fbfba5a065040..2af741ae88ca8 100644 --- a/components/wordpress_com/wordpress_com.app.mjs +++ b/components/wordpress_com/wordpress_com.app.mjs @@ -45,6 +45,13 @@ export default { }, methods: { ...methods, + _mock$(){ + return new Proxy({}, { + get() { + return (...args) => console.log(...args); + }, + }); + }, _baseUrl() { return "https://public-api.wordpress.com/rest/v1.1"; }, @@ -155,5 +162,16 @@ export default { ...opts, }); }, + async initialize(subject, db, dbName){ + if (!subject.length) { + console.log("No ID found on first run. Source initialized with no cursor."); + return false; + } + const newest = subject[0]?.ID; + + await db.set(dbName, newest); + console.log(`Initialized ${dbName} on first run with ID ${newest}.`); + return true ; + } }, }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08f58741e85d2..deb3c3dd1573c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4085,8 +4085,7 @@ importers: specifier: ^1.3.0 version: 1.6.6 - components/emailverify_io: - specifiers: {} + components/emailverify_io: {} components/emelia: {} @@ -34740,6 +34739,8 @@ snapshots: '@putout/operator-filesystem': 5.0.0(putout@36.13.1(eslint@8.57.1)(typescript@5.6.3)) '@putout/operator-json': 2.2.0 putout: 36.13.1(eslint@8.57.1)(typescript@5.6.3) + transitivePeerDependencies: + - supports-color '@putout/operator-regexp@1.0.0(putout@36.13.1(eslint@8.57.1)(typescript@5.6.3))': dependencies: From e2be15abda11205f25453a5c7bac50bd24a8c3a5 Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 03:18:27 +0400 Subject: [PATCH 03/10] Fix sources --- .../actions/create-post/create-post.mjs | 2 +- .../sources/new-comment/new-comment.mjs | 56 ++++++++++++------- .../sources/new-follower/new-follower.mjs | 53 +++++++++++++----- .../sources/new-post/new-post.mjs | 47 +++++++++------- 4 files changed, 101 insertions(+), 57 deletions(-) diff --git a/components/wordpress_com/actions/create-post/create-post.mjs b/components/wordpress_com/actions/create-post/create-post.mjs index 5d28647394c2a..000f0b1164b78 100644 --- a/components/wordpress_com/actions/create-post/create-post.mjs +++ b/components/wordpress_com/actions/create-post/create-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-create-post", name: "Create New Post", description: "Creates a new post on a WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/new/)", - version: "0.0.6", + version: "0.0.8", type: "action", props: { wordpress, diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index de6c2b9386adc..c162d53001a14 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -7,6 +7,16 @@ export default { version: "0.0.2", type: "source", dedupe: "unique", + methods: { + getWordpressComments($) { + return this.wordpress.getWordpressComments({ + $, + site: this.site, + postId: this.postId, + number: this.number, + }); + }, + }, props: { wordpress, db: "$.service.db", @@ -44,12 +54,31 @@ export default { }, hooks: { async activate() { - await this.db.set("lastCommentId", null); - await this.run({ $ : this.wordpress._mock$() }); + + const warnings = []; + + const { + wordpress, + db, + site, + } = this; + + warnings.push(...wordpress.checkDomainOrId(site)); + + if (warnings.length > 0) { + console.log("Warnings:\n- " + warnings.join("\n- ")); + } + + await this.db.set("lastCommentId", null); //reset + + const response = await this.getWordpressComments(this.wordpress._mock$); + + const comments = response.comments || []; + + await wordpress.initialize(comments, db, "lastCommentId"); }, }, - async run({ $ }) { const warnings = []; @@ -57,20 +86,14 @@ export default { wordpress, db, site, - postId, - number, } = this; warnings.push(...wordpress.checkDomainOrId(site)); let response; try { - response = await wordpress.getWordpressComments({ - $, - site, - postId, - number, - }); + + response = await this.getWordpressComments($); } catch (error) { wordpress.throwCustomError("Failed to fetch comments from WordPress:", error, warnings); @@ -79,16 +102,7 @@ export default { const comments = response.comments || []; const lastCommentId = Number(await db.get("lastCommentId")); - // First run: Initialize cursor - if (!lastCommentId) { - if (!comments.length) { - console.log("No comments found on first run. Source initialized with no cursor."); - return; - } - await db.set("lastCommentId", newest); - console.log(`Initialized lastCommentId on first run with comment ID ${newest}.`); - return; - } + if (!lastCommentId) await wordpress.initialize(comments, db, "lastCommentId"); let maxCommentIdTracker = lastCommentId; const newComments = []; diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 9174be6d15ad7..939e85d730200 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -7,6 +7,16 @@ export default { version: "0.0.2", type: "source", dedupe: "unique", + methods: { + getWordpressFollowers($) { + + return this.wordpress.getWordpressFollowers({ + $, + site: this.site, + }); + + }, + }, props: { wordpress, db: "$.service.db", @@ -22,6 +32,33 @@ export default { description: "How often to poll WordPress for new followers.", }, }, + hooks: { + async activate() { + + const warnings = []; + + const { + wordpress, + db, + site, + } = this; + + warnings.push(...wordpress.checkDomainOrId(site)); + + if (warnings.length > 0) { + console.log("Warnings:\n- " + warnings.join("\n- ")); + } + + await this.db.set("lastFollowerId", null); //reset + + const response = await this.getWordpressFollowers(this.wordpress._mock$); + + const followers = response.subscribers || []; + + await wordpress.initialize(followers, db, "lastFollowerId"); + }, + }, + async run({ $ }) { const warnings = []; @@ -35,10 +72,7 @@ export default { let response; try { - response = await wordpress.getWordpressFollowers({ - $, - site, - }); + response = await this.getWordpressFollowers($); } catch (error) { wordpress.throwCustomError("Failed to fetch followers from WordPress:", error, warnings); @@ -48,16 +82,7 @@ export default { const lastFollowerId = Number(await db.get("lastFollowerId")); - // First run: Initialize cursor - if (!lastFollowerId) { - if (!followers.length) { - console.log("No followers found on first run. Source initialized with no cursor."); - return; - } - await db.set("lastFollowerId", newest); - console.log(`Initialized lastFollowerId on first run with follower ID ${newest}.`); - return; - } + if (!lastFollowerId) await wordpress.initialize(followers, db, "lastPostId"); let maxFollowerIdTracker = lastFollowerId; const newFollowers = []; diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index d6145e17bd37d..c2cce14d1edad 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-post", name: "New Post", description: "Emit new event for each new post published since the last run. If no new posts, emit nothing.", - version: "0.0.2", + version: "0.0.3", type: "source", dedupe: "unique", props: { @@ -52,32 +52,38 @@ export default { }, }, methods: { - getWordpressPosts($){ - - let response; - response = this.wordpress.getWordpressPosts({ - $, - site: this.site, - type: this.type, - number: this.number, - }); - - return response; - } + getWordpressPosts($) { + + return this.wordpress.getWordpressPosts({ + $, + site: this.site, + type: this.type, + number: this.number, + }); + + }, }, hooks: { async activate() { - const { + const warnings = [] +; const { wordpress, db, type, + site, } = this; - await this.db.set("lastCommentId", null); + warnings.push(...wordpress.checkDomainOrId(site)); + + if (warnings.length > 0) { + console.log("Warnings:\n- " + warnings.join("\n- ")); + } + + await this.db.set("lastPostId", null); // reset + + const response = await this.getWordpressPosts(this.wordpress._mock$); - const response = await this.getWordpressPosts(this.wordpress._mock$); - const posts = (type === "attachment") ? (response.media || []) : (response.posts || []); @@ -98,16 +104,15 @@ export default { warnings.push(...wordpress.checkDomainOrId(site)); - const response = await this.getWordpressPosts($); + const response = await this.getWordpressPosts($); const posts = (type === "attachment") ? (response.media || []) : (response.posts || []); const lastPostId = Number(await db.get("lastPostId")); - // Initialize if not already set - if (!lastPostId) await initialize(posts, db, "lastPostId"); - + if (!lastPostId) await wordpress.initialize(posts, db, "lastPostId"); + let maxPostIdTracker = lastPostId; const newPosts = []; From c1859ac2670509e1a06e47afae4e47c81c97973d Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 14:47:13 +0400 Subject: [PATCH 04/10] Bump --- components/wordpress_com/actions/create-post/create-post.mjs | 2 +- components/wordpress_com/actions/delete-post/delete-post.mjs | 4 ++-- components/wordpress_com/sources/new-comment/new-comment.mjs | 2 +- .../wordpress_com/sources/new-follower/new-follower.mjs | 2 +- components/wordpress_com/sources/new-post/new-post.mjs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/wordpress_com/actions/create-post/create-post.mjs b/components/wordpress_com/actions/create-post/create-post.mjs index 000f0b1164b78..c4d9426067806 100644 --- a/components/wordpress_com/actions/create-post/create-post.mjs +++ b/components/wordpress_com/actions/create-post/create-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-create-post", name: "Create New Post", description: "Creates a new post on a WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/new/)", - version: "0.0.8", + version: "0.0.9", type: "action", props: { wordpress, diff --git a/components/wordpress_com/actions/delete-post/delete-post.mjs b/components/wordpress_com/actions/delete-post/delete-post.mjs index b8f6d4570d5a3..0eb7908e90413 100644 --- a/components/wordpress_com/actions/delete-post/delete-post.mjs +++ b/components/wordpress_com/actions/delete-post/delete-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-delete-post", name: "Delete Post", description: "Deletes a post. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/delete/)", - version: "0.0.1", + version: "0.0.2", type: "action", props: { wordpress, @@ -47,7 +47,7 @@ export default { } catch (error) { wordpress.throwCustomError("Could not delete post", error, warnings); }; - + $.export("$summary", `Post ID “${response?.ID}” has been successfully deleted` + "\n- " + warnings.join("\n- ")); }, diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index c162d53001a14..17d6dab71cf9b 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-comment", name: "New Comment", description: "Emit new event for each new comment added since the last run. If no new comments, emit nothing.", - version: "0.0.2", + version: "0.0.3", type: "source", dedupe: "unique", methods: { diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 939e85d730200..e370e49b59313 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-follower", name: "New Follower", description: "Emit new event for each new follower that subscribes to the site.", - version: "0.0.2", + version: "0.0.3", type: "source", dedupe: "unique", methods: { diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index c2cce14d1edad..d97def4b2729c 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-post", name: "New Post", description: "Emit new event for each new post published since the last run. If no new posts, emit nothing.", - version: "0.0.3", + version: "0.0.4", type: "source", dedupe: "unique", props: { From 588ac454f37037494c975313c4b311ed0eb6e775 Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 21:13:07 +0400 Subject: [PATCH 05/10] Lint code fix --- components/airtable_oauth/package.json | 2 +- .../wordpress_com/actions/create-post/create-post.mjs | 2 +- .../wordpress_com/actions/delete-post/delete-post.mjs | 2 +- .../wordpress_com/actions/upload-media/upload-media.mjs | 2 +- .../wordpress_com/sources/new-comment/new-comment.mjs | 2 +- .../wordpress_com/sources/new-follower/new-follower.mjs | 2 +- components/wordpress_com/sources/new-post/new-post.mjs | 2 +- components/wordpress_com/wordpress_com.app.mjs | 6 +++--- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/airtable_oauth/package.json b/components/airtable_oauth/package.json index cf43461a91a1a..f03f7a931b12d 100644 --- a/components/airtable_oauth/package.json +++ b/components/airtable_oauth/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/airtable_oauth", - "version": "0.5.0", + "version": "0.5.1", "description": "Pipedream Airtable (OAuth) Components", "main": "airtable_oauth.app.mjs", "keywords": [ diff --git a/components/wordpress_com/actions/create-post/create-post.mjs b/components/wordpress_com/actions/create-post/create-post.mjs index c4d9426067806..3dd10a69e72d9 100644 --- a/components/wordpress_com/actions/create-post/create-post.mjs +++ b/components/wordpress_com/actions/create-post/create-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-create-post", name: "Create New Post", description: "Creates a new post on a WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/new/)", - version: "0.0.9", + version: "0.0.10", type: "action", props: { wordpress, diff --git a/components/wordpress_com/actions/delete-post/delete-post.mjs b/components/wordpress_com/actions/delete-post/delete-post.mjs index 0eb7908e90413..e9c86361ab8f0 100644 --- a/components/wordpress_com/actions/delete-post/delete-post.mjs +++ b/components/wordpress_com/actions/delete-post/delete-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-delete-post", name: "Delete Post", description: "Deletes a post. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/delete/)", - version: "0.0.2", + version: "0.0.3", type: "action", props: { wordpress, diff --git a/components/wordpress_com/actions/upload-media/upload-media.mjs b/components/wordpress_com/actions/upload-media/upload-media.mjs index 2077f81ae4899..0a7cab759023b 100644 --- a/components/wordpress_com/actions/upload-media/upload-media.mjs +++ b/components/wordpress_com/actions/upload-media/upload-media.mjs @@ -5,7 +5,7 @@ export default { key: "wordpress_com-upload-media", name: "Upload Media", description: "Uploads a media file from a URL to the specified WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/media/new/)", - version: "0.0.2", + version: "0.0.3", type: "action", props: { wordpress, diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index 17d6dab71cf9b..581ce8f630356 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-comment", name: "New Comment", description: "Emit new event for each new comment added since the last run. If no new comments, emit nothing.", - version: "0.0.3", + version: "0.0.4", type: "source", dedupe: "unique", methods: { diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index e370e49b59313..73698201f8b03 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-follower", name: "New Follower", description: "Emit new event for each new follower that subscribes to the site.", - version: "0.0.3", + version: "0.0.4", type: "source", dedupe: "unique", methods: { diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index d97def4b2729c..8534568e984e8 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-new-post", name: "New Post", description: "Emit new event for each new post published since the last run. If no new posts, emit nothing.", - version: "0.0.4", + version: "0.0.5", type: "source", dedupe: "unique", props: { diff --git a/components/wordpress_com/wordpress_com.app.mjs b/components/wordpress_com/wordpress_com.app.mjs index 2af741ae88ca8..b5cbed4c7aa63 100644 --- a/components/wordpress_com/wordpress_com.app.mjs +++ b/components/wordpress_com/wordpress_com.app.mjs @@ -45,7 +45,7 @@ export default { }, methods: { ...methods, - _mock$(){ + _mock$() { return new Proxy({}, { get() { return (...args) => console.log(...args); @@ -162,7 +162,7 @@ export default { ...opts, }); }, - async initialize(subject, db, dbName){ + async initialize(subject, db, dbName) { if (!subject.length) { console.log("No ID found on first run. Source initialized with no cursor."); return false; @@ -172,6 +172,6 @@ export default { await db.set(dbName, newest); console.log(`Initialized ${dbName} on first run with ID ${newest}.`); return true ; - } + }, }, }; From 3a5c75e649dc61c11aad11eb1c7c69616bcb957a Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 21:25:23 +0400 Subject: [PATCH 06/10] update version to 0.7.1 --- components/wordpress_com/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/wordpress_com/package.json b/components/wordpress_com/package.json index 3615ac0edb227..cbc175bfe0160 100644 --- a/components/wordpress_com/package.json +++ b/components/wordpress_com/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/wordpress_com", - "version": "0.7.0", + "version": "0.7.1", "description": "Pipedream wordpress_com Components", "main": "wordpress_com.app.mjs", "keywords": [ From 41b4d37a279ef13b1f735d0ad03ea6e75beabf85 Mon Sep 17 00:00:00 2001 From: falc1 Date: Thu, 1 May 2025 23:17:00 +0400 Subject: [PATCH 07/10] CodeRabbit Fix --- .../wordpress_com/actions/upload-media/upload-media.mjs | 4 ++-- components/wordpress_com/sources/new-comment/new-comment.mjs | 2 +- .../wordpress_com/sources/new-follower/new-follower.mjs | 4 ++-- components/wordpress_com/sources/new-post/new-post.mjs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/components/wordpress_com/actions/upload-media/upload-media.mjs b/components/wordpress_com/actions/upload-media/upload-media.mjs index 0a7cab759023b..52e8be0fcd353 100644 --- a/components/wordpress_com/actions/upload-media/upload-media.mjs +++ b/components/wordpress_com/actions/upload-media/upload-media.mjs @@ -74,8 +74,8 @@ export default { const media = response.media[0]; - `Media ID “${media.ID})” has been successfully uploaded`; - $.export("$summary", `Media ID “${media.ID})” has been successfully uploaded` + + `Media ID “${media.ID}” has been successfully uploaded`; + $.export("$summary", `Media ID “${media.ID}” has been successfully uploaded` + "\n- " + warnings.join("\n- ")); console.log(response); diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index 581ce8f630356..4beda07382657 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -71,7 +71,7 @@ export default { await this.db.set("lastCommentId", null); //reset - const response = await this.getWordpressComments(this.wordpress._mock$); + const response = await this.getWordpressComments(this.wordpress._mock$()); const comments = response.comments || []; diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 73698201f8b03..585747afb3b76 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -51,7 +51,7 @@ export default { await this.db.set("lastFollowerId", null); //reset - const response = await this.getWordpressFollowers(this.wordpress._mock$); + const response = await this.getWordpressFollowers(this.wordpress._mock$()); const followers = response.subscribers || []; @@ -82,7 +82,7 @@ export default { const lastFollowerId = Number(await db.get("lastFollowerId")); - if (!lastFollowerId) await wordpress.initialize(followers, db, "lastPostId"); + if (!lastFollowerId) await wordpress.initialize(followers, db, "lastFollowerId"); let maxFollowerIdTracker = lastFollowerId; const newFollowers = []; diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index 8534568e984e8..6c123e363b592 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -82,7 +82,7 @@ export default { await this.db.set("lastPostId", null); // reset - const response = await this.getWordpressPosts(this.wordpress._mock$); + const response = await this.getWordpressPosts(this.wordpress._mock$()); const posts = (type === "attachment") ? (response.media || []) From bbf87b2aeb83ba87affc6135474af185887a1b10 Mon Sep 17 00:00:00 2001 From: falc1 Date: Mon, 5 May 2025 21:22:07 +0400 Subject: [PATCH 08/10] Fix Leo Vu Updateds --- .../actions/create-post/create-post.mjs | 30 +-- .../actions/delete-post/delete-post.mjs | 24 +- .../actions/upload-media/upload-media.mjs | 33 +-- components/wordpress_com/common/methods.mjs | 226 ------------------ components/wordpress_com/common/utils.mjs | 26 -- .../sources/new-comment/new-comment.mjs | 36 +-- .../sources/new-follower/new-follower.mjs | 34 +-- .../sources/new-post/new-post.mjs | 27 +-- .../wordpress_com/wordpress_com.app.mjs | 17 +- 9 files changed, 59 insertions(+), 394 deletions(-) delete mode 100644 components/wordpress_com/common/methods.mjs diff --git a/components/wordpress_com/actions/create-post/create-post.mjs b/components/wordpress_com/actions/create-post/create-post.mjs index 3dd10a69e72d9..38615b7bac6d1 100644 --- a/components/wordpress_com/actions/create-post/create-post.mjs +++ b/components/wordpress_com/actions/create-post/create-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-create-post", name: "Create New Post", description: "Creates a new post on a WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/new/)", - version: "0.0.10", + version: "0.0.2", type: "action", props: { wordpress, @@ -56,7 +56,6 @@ export default { }, }, async run({ $ }) { - const warnings = []; const { site, @@ -64,25 +63,18 @@ export default { ...fields } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - let response; - - try { - response = await wordpress.createWordpressPost({ - $, - site, - data: { - ...fields, - }, - }); - } catch (error) { - wordpress.throwCustomError("Could not create post", error, warnings); - }; + const response = await wordpress.createWordpressPost({ + $, + site, + data: { + ...fields, + }, + }); $.export("$summary", - `Post “${this.title}” is successfully created with ID “${response?.ID}”` + - "\n- " + warnings.join("\n- ")); + `Post “${this.title}” is successfully created with ID “${response?.ID}”`); + + return response; }, }; diff --git a/components/wordpress_com/actions/delete-post/delete-post.mjs b/components/wordpress_com/actions/delete-post/delete-post.mjs index e9c86361ab8f0..1d9a7a381c537 100644 --- a/components/wordpress_com/actions/delete-post/delete-post.mjs +++ b/components/wordpress_com/actions/delete-post/delete-post.mjs @@ -4,7 +4,7 @@ export default { key: "wordpress_com-delete-post", name: "Delete Post", description: "Deletes a post. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/posts/%24post_ID/delete/)", - version: "0.0.3", + version: "0.0.2", type: "action", props: { wordpress, @@ -26,7 +26,6 @@ export default { }, }, async run({ $ }) { - const warnings = []; const { site, @@ -34,22 +33,15 @@ export default { postId, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - let response; + const response = await wordpress.deleteWordpressPost({ + $, + site, + postId, + }); - try { - response = await wordpress.deleteWordpressPost({ - $, - site, - postId, - }); - } catch (error) { - wordpress.throwCustomError("Could not delete post", error, warnings); - }; + $.export("$summary", `Post ID “${response?.ID}” has been successfully deleted`); - $.export("$summary", `Post ID “${response?.ID}” has been successfully deleted` + - "\n- " + warnings.join("\n- ")); + return response; }, }; diff --git a/components/wordpress_com/actions/upload-media/upload-media.mjs b/components/wordpress_com/actions/upload-media/upload-media.mjs index 52e8be0fcd353..3fd9a29d9f523 100644 --- a/components/wordpress_com/actions/upload-media/upload-media.mjs +++ b/components/wordpress_com/actions/upload-media/upload-media.mjs @@ -5,7 +5,7 @@ export default { key: "wordpress_com-upload-media", name: "Upload Media", description: "Uploads a media file from a URL to the specified WordPress.com site. [See the documentation](https://developer.wordpress.com/docs/api/1.1/post/sites/%24site/media/new/)", - version: "0.0.3", + version: "0.0.2", type: "action", props: { wordpress, @@ -40,7 +40,6 @@ export default { }, }, async run({ $ }) { - const warnings = []; const { @@ -50,8 +49,6 @@ export default { ...fields } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - let form; // If not form data @@ -62,28 +59,16 @@ export default { form = await prepareMediaUpload(media, fields, $); } - let response; - - try { - response = await wordpress.uploadWordpressMedia({ - $, - contentType: form.getHeaders()["content-type"], - site, - data: form, - }); - - const media = response.media[0]; - - `Media ID “${media.ID}” has been successfully uploaded`; - $.export("$summary", `Media ID “${media.ID}” has been successfully uploaded` + - "\n- " + warnings.join("\n- ")); + const response = await wordpress.uploadWordpressMedia({ + $, + contentType: form.getHeaders()["content-type"], + site, + data: form, + }); - console.log(response); - return response; + $.export("$summary", `Media ID “${response.media[0].ID}” has been successfully uploaded`); - } catch (error) { - wordpress.throwCustomError("Failed to upload media", error, warnings); - }; + return response; }, }; diff --git a/components/wordpress_com/common/methods.mjs b/components/wordpress_com/common/methods.mjs deleted file mode 100644 index d5b023930d834..0000000000000 --- a/components/wordpress_com/common/methods.mjs +++ /dev/null @@ -1,226 +0,0 @@ -export default { - - isString(input) { - return typeof input === "string"; - }, - - isNumber(input) { - return typeof input === "number"; - }, - - isEmptyString(input) { - if (this.isString(input)) { - if (input.trim() === "") return true; - }; - - return false; - }, - - isIdNumber(input) { - return Number.isInteger(input) && input > 0; - }, - - isObject(input) { - return ( - typeof input === "object" && - input !== null && - !Array.isArray(input) - ); - }, - - isArrayOfStrings(input) { - - if (!Array.isArray(input)) return false; - - for (let i = 0; i < input.length; i++) { - if (!this.isString(input[i])) - return false; - }; - - return true; - }, - - isFormData(input) { - return ( - typeof input === "object" && - input !== null && - typeof input.getHeaders === "function" && - typeof input.append === "function" - ); - }, - - /* ============================================================================================== - Return the trimmed string or input - as is if it's not a string -==================================================================================================*/ - trimIfString(input) { - return (typeof input === "string") - ? input.trim() - : input; - }, - - /* ============================================================================================= - Function tries to parse the input as JSON, - If it is not return the value as it was passed -//==============================================================================================*/ - parseIfJSONString(input) { - - if (typeof input === "string") { - try { - return JSON.parse(input); - } catch (error) { - // Parsing failed — return original input - return input; - } - } - - // If input is not a string, just return it as-is - return input; - }, - - /* ============================================================================================= - Validates a URL string: - - Rejects blank strings, spaces, tabs, and newlines - - Warns about suspicious or unusual characters - - Adds a warning if protocol is missing or malformed -================================================================================================ */ - checkIfUrlValid(input) { - - // Warning accumulator - let warnings = []; - - if (!this.isString(input)) { - warnings.push("URL is not a string"); - - }; - - if (this.isEmptyString(input)) { - warnings.push("URL is empty string"); - return warnings; - }; - - const trimmedInput = input.trim(); - - // Reject if spaces, tabs, or newlines are present - if ((/[ \t\n]/.test(trimmedInput))) { - warnings.push( "Url contains invalid characters like space, backslash etc., please check." + - this._reasonMsg(input)); - return warnings; - }; - - // Warn about suspicious characters - const simpleSuspiciousChars = /[\\[\]<>"^`]/g; - const invisibleChars = /\u200B|\u200C|\u200D|\u2060|\uFEFF|\u00A0/g; - - const dubiousMatches = - trimmedInput.match(simpleSuspiciousChars) || - trimmedInput.match(invisibleChars); - - if (dubiousMatches) { - warnings.push(" URL contains dubious or non-standard characters " + this._reasonMsg(input) ); - }; - - // urlObject for further use if the next check passes. - let urlObject; - // Tries to create a new URL object with the input string; - try { - urlObject = new URL(trimmedInput); // throws if invalid or has no protocol - - // Warn if user typed only one slash (e.g., https:/) - if (/^(https?):\/(?!\/)/.test(input)) { - - warnings.push(` It looks like you're missing one slash after "${urlObject.protocol}".` + - `Did you mean "${urlObject.protocol}//..."? ${this._reasonMsg(input)} `); - - }; - - } catch (err) { - // If the URL is invalid, try to create a new URL object with "http://" - // in case user forgot to add it; - try { - // If it works then there was no protocol in the input string; - urlObject = new URL("http://" + trimmedInput); - - warnings.push(" URL does not have http or https protocol \""); - - } catch (err) { - warnings.push(" URL contains potentionally unacceptable characters\"" + - this._reasonMsg(input)); - - }; - - }; - - return warnings; - - }, - - /* =========================================================================================== - Validates a Site Identifier string, which may be either: - - A numeric Site ID (e.g., "123456") - - A custom or subdomain (e.g., "mysite.example.com") -=============================================================================================== */ - - checkDomainOrId(input) { - - const warnings = []; - - // If it's an ID like number or string (e.g 12345 or "12345"); - // it's Valid. Return empty warnings array. - if (this.isIdNumber(Number(input))) return warnings; - - // If it's not a string. - if (!this.isString(input)) { - warnings.push("Provided value is not a domain or ID-like value (e.g., 1234 or '1234')."); - return warnings; - } - - const trimmed = input.trim(); - - // Now treat it as a domain and run checks: - if (/https?:\/\//.test(trimmed)) { - warnings.push("Domain contains protocol (http or https). Remove it." + - this._reasonMsg(input)); - } - - if (/[^a-zA-Z0-9.-]/.test(trimmed)) { - warnings.push("Domain. Only letters, numbers, dots, and dashes are allowed." + - this._reasonMsg(input)); - } - - if (!trimmed.includes(".")) { - warnings.push("Domain should contain at least one dot (e.g. example.com)." + - this._reasonMsg(input)); - } - - return warnings; - }, - - /* ============================================================================================= - Throws if axios request fails. - Determines whether an error originated from your own validation code or from the API request. - Useful for debugging and crafting more helpful error messages. -=================================================================================================*/ - throwCustomError(mainMessage, error, warnings = []) { - - const thrower = error?.response?.status - ? "API response" - : "Internal Code"; - - throw new Error(` ${mainMessage} ( ${thrower} error ) : ${error.message}. ` + "\n- " + - warnings.join("\n- ")); - }, - - /* ============================================================================================== - Appends a reason string to error messages for additional context. -=============================================================================================== */ - - _reasonMsg(reason) { - - return (reason && typeof reason === "string") - ? ` Reason: ${reason} ` - : ""; - }, - -}; - diff --git a/components/wordpress_com/common/utils.mjs b/components/wordpress_com/common/utils.mjs index 6bc6e199972c4..7e2f9898ac5ad 100644 --- a/components/wordpress_com/common/utils.mjs +++ b/components/wordpress_com/common/utils.mjs @@ -2,32 +2,6 @@ import { basename } from "path"; import { get } from "https"; import FormData from "form-data"; -// Returns a new object containing only standard prop fields, removing any custom keys. -// Considered using JSON deep cloning, but opted for a manual approach to safely -// preserve functions or complex types in future data structures. -export function removeCustomPropFields(input) { - const blacklist = new Set([ - "extendedType", - "postBody", - ]); - const clean = {}; - - for (const key of Object.keys(input)) { - const prop = input[key]; - const cloned = {}; - - for (const field of Object.keys(prop)) { - if (!blacklist.has(field)) { - cloned[field] = prop[field]; - } - } - - clean[key] = cloned; - } - - return clean; -}; - /** * Prepares a multipart/form-data payload for uploading media to WordPress.com. * Fetches the media file from a given URL, wraps it in a FormData object*/ diff --git a/components/wordpress_com/sources/new-comment/new-comment.mjs b/components/wordpress_com/sources/new-comment/new-comment.mjs index 4beda07382657..af140fd33f47a 100644 --- a/components/wordpress_com/sources/new-comment/new-comment.mjs +++ b/components/wordpress_com/sources/new-comment/new-comment.mjs @@ -1,10 +1,11 @@ import wordpress from "../../wordpress_com.app.mjs"; +import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform"; export default { key: "wordpress_com-new-comment", name: "New Comment", description: "Emit new event for each new comment added since the last run. If no new comments, emit nothing.", - version: "0.0.4", + version: "0.0.2", type: "source", dedupe: "unique", methods: { @@ -50,28 +51,22 @@ export default { type: "$.interface.timer", label: "Timer", description: "How often to poll WordPress for new comments.", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, }, }, hooks: { async activate() { - const warnings = []; - const { wordpress, db, - site, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - if (warnings.length > 0) { - console.log("Warnings:\n- " + warnings.join("\n- ")); - } - await this.db.set("lastCommentId", null); //reset - const response = await this.getWordpressComments(this.wordpress._mock$()); + const response = await this.getWordpressComments(); const comments = response.comments || []; @@ -80,24 +75,15 @@ export default { }, async run({ $ }) { - const warnings = []; const { wordpress, db, - site, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - let response; - try { - - response = await this.getWordpressComments($); - - } catch (error) { - wordpress.throwCustomError("Failed to fetch comments from WordPress:", error, warnings); - } + const response = await this.getWordpressComments({ + $, + }); const comments = response.comments || []; const lastCommentId = Number(await db.get("lastCommentId")); @@ -131,10 +117,6 @@ export default { } else { console.log("No new comments found."); } - - if (warnings.length > 0) { - console.log("Warnings:\n- " + warnings.join("\n- ")); - }; }, }; diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 585747afb3b76..24b2d8ae16c0b 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -1,10 +1,11 @@ import wordpress from "../../wordpress_com.app.mjs"; +import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform"; export default { key: "wordpress_com-new-follower", name: "New Follower", description: "Emit new event for each new follower that subscribes to the site.", - version: "0.0.4", + version: "0.0.2", type: "source", dedupe: "unique", methods: { @@ -30,28 +31,22 @@ export default { type: "$.interface.timer", label: "Timer", description: "How often to poll WordPress for new followers.", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, }, }, hooks: { async activate() { - const warnings = []; - const { wordpress, db, - site, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - if (warnings.length > 0) { - console.log("Warnings:\n- " + warnings.join("\n- ")); - } - await this.db.set("lastFollowerId", null); //reset - const response = await this.getWordpressFollowers(this.wordpress._mock$()); + const response = await this.getWordpressFollowers(); const followers = response.subscribers || []; @@ -60,23 +55,12 @@ export default { }, async run({ $ }) { - const warnings = []; - const { wordpress, db, - site, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - let response; - try { - response = await this.getWordpressFollowers($); - - } catch (error) { - wordpress.throwCustomError("Failed to fetch followers from WordPress:", error, warnings); - } + const response = await this.getWordpressFollowers($); const followers = response.subscribers || []; @@ -111,10 +95,6 @@ export default { } else { console.log("No new followers found."); } - - if (warnings.length > 0) { - console.log("Warnings:\n- " + warnings.join("\n- ")); - } }, }; diff --git a/components/wordpress_com/sources/new-post/new-post.mjs b/components/wordpress_com/sources/new-post/new-post.mjs index 6c123e363b592..1cd3acc9d3cb2 100644 --- a/components/wordpress_com/sources/new-post/new-post.mjs +++ b/components/wordpress_com/sources/new-post/new-post.mjs @@ -1,10 +1,11 @@ import wordpress from "../../wordpress_com.app.mjs"; +import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform"; export default { key: "wordpress_com-new-post", name: "New Post", description: "Emit new event for each new post published since the last run. If no new posts, emit nothing.", - version: "0.0.5", + version: "0.0.2", type: "source", dedupe: "unique", props: { @@ -49,6 +50,9 @@ export default { type: "$.interface.timer", label: "Timer", description: "How often to poll WordPress for new posts.", + default: { + intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, + }, }, }, methods: { @@ -66,23 +70,15 @@ export default { hooks: { async activate() { - const warnings = [] -; const { + const { wordpress, db, type, - site, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - - if (warnings.length > 0) { - console.log("Warnings:\n- " + warnings.join("\n- ")); - } - await this.db.set("lastPostId", null); // reset - const response = await this.getWordpressPosts(this.wordpress._mock$()); + const response = await this.getWordpressPosts(); const posts = (type === "attachment") ? (response.media || []) @@ -93,17 +89,12 @@ export default { }, async run({ $ }) { - const warnings = []; - const { wordpress, db, - site, type, } = this; - warnings.push(...wordpress.checkDomainOrId(site)); - const response = await this.getWordpressPosts($); const posts = (type === "attachment") @@ -141,9 +132,5 @@ export default { } else { console.log("No new posts found."); } - - if (warnings.length > 0) { - console.log("Warnings:\n- " + warnings.join("\n- ")); - }; }, }; diff --git a/components/wordpress_com/wordpress_com.app.mjs b/components/wordpress_com/wordpress_com.app.mjs index b5cbed4c7aa63..df52f61932a20 100644 --- a/components/wordpress_com/wordpress_com.app.mjs +++ b/components/wordpress_com/wordpress_com.app.mjs @@ -1,4 +1,3 @@ -import methods from "./common/methods.mjs"; import { axios } from "@pipedream/platform"; export default { @@ -44,14 +43,6 @@ export default { }, }, methods: { - ...methods, - _mock$() { - return new Proxy({}, { - get() { - return (...args) => console.log(...args); - }, - }); - }, _baseUrl() { return "https://public-api.wordpress.com/rest/v1.1"; }, @@ -162,6 +153,14 @@ export default { ...opts, }); }, + isFormData(input) { + return ( + typeof input === "object" && + input !== null && + typeof input.getHeaders === "function" && + typeof input.append === "function" + ); + }, async initialize(subject, db, dbName) { if (!subject.length) { console.log("No ID found on first run. Source initialized with no cursor."); From 0d8115e5b14a6845df4dc396f8d9dcf0ce176b9c Mon Sep 17 00:00:00 2001 From: michelle0927 Date: Tue, 6 May 2025 11:23:19 -0400 Subject: [PATCH 09/10] revert package.json version --- components/airtable_oauth/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/airtable_oauth/package.json b/components/airtable_oauth/package.json index f03f7a931b12d..cf43461a91a1a 100644 --- a/components/airtable_oauth/package.json +++ b/components/airtable_oauth/package.json @@ -1,6 +1,6 @@ { "name": "@pipedream/airtable_oauth", - "version": "0.5.1", + "version": "0.5.0", "description": "Pipedream Airtable (OAuth) Components", "main": "airtable_oauth.app.mjs", "keywords": [ From 25c3d7b3287c39c0e3fd6599400b6b92fa3d388a Mon Sep 17 00:00:00 2001 From: falc1 Date: Wed, 7 May 2025 12:43:20 +0400 Subject: [PATCH 10/10] Fix followers --- .../sources/new-follower/new-follower.mjs | 17 +++++++++++++++++ components/wordpress_com/wordpress_com.app.mjs | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/components/wordpress_com/sources/new-follower/new-follower.mjs b/components/wordpress_com/sources/new-follower/new-follower.mjs index 24b2d8ae16c0b..98b22c680fc0d 100644 --- a/components/wordpress_com/sources/new-follower/new-follower.mjs +++ b/components/wordpress_com/sources/new-follower/new-follower.mjs @@ -14,6 +14,7 @@ export default { return this.wordpress.getWordpressFollowers({ $, site: this.site, + type: this.type, }); }, @@ -27,6 +28,22 @@ export default { "siteId", ], }, + type: { + type: "string", + label: "Follower Type", + description: "Select the type of followers to fetch: those who clicked Subscribe or those manually added in the dashboard.", + options: [ + { + label: "WordPress.com Followers", + value: "wpcom", + }, + { + label: "Email-only Followers", + value: "email", + }, + ], + default: "wpcom", + }, timer: { type: "$.interface.timer", label: "Timer", diff --git a/components/wordpress_com/wordpress_com.app.mjs b/components/wordpress_com/wordpress_com.app.mjs index df52f61932a20..10b471907165f 100644 --- a/components/wordpress_com/wordpress_com.app.mjs +++ b/components/wordpress_com/wordpress_com.app.mjs @@ -139,11 +139,12 @@ export default { }, getWordpressFollowers({ site, + type, ...opts }) { return this._makeRequest({ method: "GET", - path: `/sites/${site}/followers/`, + path: `/sites/${site}/stats/followers?type=${type}`, ...opts, }); },