From f67a5a6a1375c4ea76b314a5e9d4f9fee81feb08 Mon Sep 17 00:00:00 2001 From: afzalansari12 Date: Sat, 25 Jul 2026 23:09:48 +0530 Subject: [PATCH 1/2] fix: add try-catch for querySelector and log fallbackCopy errors (#132) --- src/social-share-button.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/social-share-button.js b/src/social-share-button.js index 2dd6dd57..e802c1a8 100644 --- a/src/social-share-button.js +++ b/src/social-share-button.js @@ -533,7 +533,8 @@ class SocialShareButton { copyBtn.classList.remove("copied"); this.feedbackTimeout = null; }, 2000); - } catch (_err) { + } catch (error) { + this._debugWarn("fallbackCopy failed", error); copyBtn.textContent = "Failed"; // Clear any existing feedback timeout @@ -732,10 +733,19 @@ class SocialShareButton { // --------------------------------------------------------------------------- // Resolves a raw container value (string or Element) to a DOM Element, or null if absent/SSR. + static _resolveContainer(raw) { if (!raw) return null; if (typeof document === "undefined") return null; - return typeof raw === "string" ? document.querySelector(raw) : raw; + if (typeof raw !== "string") return raw; + + try { + return document.querySelector(raw); + } catch (error) { + // eslint-disable-next-line no-console + console.warn("[SocialShareButton] Invalid container selector:", raw, error); + return null; + } } // Returns the cached host container element, or null. From 0782a4c8cb7c2d569f7fc693b6c4f4285371a48b Mon Sep 17 00:00:00 2001 From: afzalansari12 Date: Sun, 26 Jul 2026 13:20:44 +0530 Subject: [PATCH 2/2] Address CodeRabbit review comments --- src/social-share-button.js | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/social-share-button.js b/src/social-share-button.js index e802c1a8..55ad1294 100644 --- a/src/social-share-button.js +++ b/src/social-share-button.js @@ -10,7 +10,10 @@ const ANALYTICS_SCHEMA_VERSION = "1.0"; class SocialShareButton { constructor(options = {}) { // Resolve container element early to prevent duplicate instances - const containerEl = SocialShareButton._resolveContainer(options.container); + const containerEl = SocialShareButton._resolveContainer( + options.container, + options.debug + ); if (containerEl && containerEl._socialShareButtonInstance) { return containerEl._socialShareButtonInstance; @@ -734,7 +737,7 @@ class SocialShareButton { // Resolves a raw container value (string or Element) to a DOM Element, or null if absent/SSR. - static _resolveContainer(raw) { + static _resolveContainer(raw, debug = false) { if (!raw) return null; if (typeof document === "undefined") return null; if (typeof raw !== "string") return raw; @@ -742,8 +745,12 @@ class SocialShareButton { try { return document.querySelector(raw); } catch (error) { - // eslint-disable-next-line no-console - console.warn("[SocialShareButton] Invalid container selector:", raw, error); + if (debug) { + // Invalid selectors are only logged when debug mode is enabled. + // eslint-disable-next-line no-console + console.warn("[SocialShareButton] Invalid container selector:", raw, error); + } + return null; } } @@ -754,16 +761,16 @@ class SocialShareButton { } /** - * Logs analytics warnings only when debug mode is enabled. - * @param {string} message - Description of the failed analytics path. - * @param {Error} err - The caught error instance. - */ - _debugWarn(message, err) { - // _debugWarn: emit analytics warnings only in debug mode for visibility. - if (!this.options.debug) return; - // eslint-disable-next-line no-console - console.warn("[SocialShareButton Analytics]", message, err); - } + * Logs debug warnings only when debug mode is enabled. + * @param {string} message - Warning message. + * @param {Error} err - The caught error instance. + */ +_debugWarn(message, err) { + if (!this.options.debug) return; + + // eslint-disable-next-line no-console + console.warn("[SocialShareButton]", message, err); +} /** * Emits an analytics event through all configured delivery paths.