From 8e14293cb66b377f96401a765d38e698aa44d845 Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 11:16:22 +0800 Subject: [PATCH 1/7] GitHub Actions: Build CSS + JS Assets on Test + Deploy --- .github/workflows/deploy.yml | 12 +++++++++--- .github/workflows/tests-backward-compat.yml | 16 ++++++++++++++++ .github/workflows/tests.yml | 17 +++++++++++++++++ composer.json | 4 ++++ package.json | 2 +- 5 files changed, 47 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1174a0d93..679d2f4d3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -26,13 +26,19 @@ jobs: - name: Run Composer run: composer install --no-dev + # Build the frontend CSS and JS assets + - name: Run npm + run: | + npm install + npm run build + # Confirm that expected files exist, to prevent deployment to wordpress.org - # if e.g. composer install fails. - - name: Check ConvertKit Library Exists + # if e.g. `composer install` or `npm run build` fails + - name: Check Kit WordPress Libraries and Assets Exists id: check_files uses: andstor/file-existence-action@v1 with: - files: "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" # Deploy to wordpress.org, if expected files exist. - name: WordPress Plugin Deploy diff --git a/.github/workflows/tests-backward-compat.yml b/.github/workflows/tests-backward-compat.yml index 2f73012b6..7fdc04f06 100644 --- a/.github/workflows/tests-backward-compat.yml +++ b/.github/workflows/tests-backward-compat.yml @@ -268,6 +268,22 @@ jobs: working-directory: ${{ env.PLUGIN_DIR }} run: composer update + # Build the frontend CSS and JS assets + - name: Run npm + working-directory: ${{ env.PLUGIN_DIR }} + run: | + npm install + npm run build + + # Confirm that expected files exist + # if e.g. `composer install` or `npm run build` fails + - name: Check Kit WordPress Libraries and Assets Exists + working-directory: ${{ env.PLUGIN_DIR }} + id: check_files + uses: andstor/file-existence-action@v1 + with: + files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + - name: Build PHP Autoloader working-directory: ${{ env.PLUGIN_DIR }} run: composer dump-autoload diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c59a882fb..d8efad2c0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -290,6 +290,23 @@ jobs: working-directory: ${{ env.PLUGIN_DIR }} run: composer update + # Build the frontend CSS and JS assets + - name: Run npm + working-directory: ${{ env.PLUGIN_DIR }} + run: | + npm install + npm run build + + # Confirm that expected files exist + # if e.g. `composer install` or `npm run build` fails + - name: Check Kit WordPress Libraries and Assets Exists + working-directory: ${{ env.PLUGIN_DIR }} + id: check_files + uses: andstor/file-existence-action@v1 + with: + files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + + - name: Build PHP Autoloader working-directory: ${{ env.PLUGIN_DIR }} run: composer dump-autoload diff --git a/composer.json b/composer.json index 792daf7df..800f2ab5c 100644 --- a/composer.json +++ b/composer.json @@ -36,6 +36,10 @@ "lint-js": "npm run lint:js", "fix-js": "npm run fix:js", "build": [ + "npm run fix:css", + "npm run lint:css", + "npm run fix:js", + "npm run lint:js", "npm run build:css", "npm run build:js" ], diff --git a/package.json b/package.json index eafd3f5f8..abb3e621f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "watch:js": "wp-scripts start resources/frontend/js/frontend.js --output-path=resources/frontend/js/dist --output-filename=frontend.min.js", "lint:js": "wp-scripts lint-js 'resources/frontend/js/*.js' --max-warnings=0", "fix:js": "wp-scripts lint-js 'resources/frontend/js/*.js' --fix", - "build": "npm run build:css && npm run build:js" + "build": "npm run fix:css && npm run lint:css && npm run fix:js && npm run lint:js && npm run build:css && npm run build:js" }, "prettier": "@wordpress/prettier-config", "devDependencies": { From a0c487a1a8fbbc97c6b8c02ae3eebd4f34c2d1ea Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 11:16:27 +0800 Subject: [PATCH 2/7] Remove compiled assets --- resources/frontend/css/frontend.css | 1 - resources/frontend/js/dist/frontend.min.asset.php | 1 - resources/frontend/js/dist/frontend.min.js | 1 - 3 files changed, 3 deletions(-) delete mode 100644 resources/frontend/css/frontend.css delete mode 100644 resources/frontend/js/dist/frontend.min.asset.php delete mode 100644 resources/frontend/js/dist/frontend.min.js diff --git a/resources/frontend/css/frontend.css b/resources/frontend/css/frontend.css deleted file mode 100644 index 03c9274a7..000000000 --- a/resources/frontend/css/frontend.css +++ /dev/null @@ -1 +0,0 @@ -.convertkit-broadcasts-pagination{display:grid;grid-template-areas:"prev next";grid-template-columns:repeat(2, 1fr);grid-column-gap:20px;padding:20px 0 0 0}.convertkit-broadcasts-pagination li{list-style:none;margin:0}.convertkit-broadcasts-pagination li.convertkit-broadcasts-pagination-prev{grid-area:prev;text-align:left}.convertkit-broadcasts-pagination li.convertkit-broadcasts-pagination-next{grid-area:next;text-align:right}.convertkit-broadcasts-list,.convertkit-broadcasts-pagination{list-style:none;margin:0;padding:0}.editor-styles-wrapper .convertkit-broadcasts-list,.editor-styles-wrapper .convertkit-broadcasts-pagination{list-style:none;margin:0;padding:0}.convertkit-broadcasts-list li{list-style:none;margin:0;padding:5px 0;display:grid;grid-template-areas:"date title" "image text";grid-template-columns:150px auto;grid-column-gap:20px}.convertkit-broadcasts-list li time{display:inline-block;grid-area:date}.convertkit-broadcasts-list li .convertkit-broadcast-title{display:inline-block;grid-area:title}.convertkit-broadcasts-list li .convertkit-broadcast-image{display:inline-block;grid-area:image}.convertkit-broadcasts-list li .convertkit-broadcast-image img{max-width:100%;height:auto}.convertkit-broadcasts-list li .convertkit-broadcast-text{display:inline-block;grid-area:text;font-size:16px}.convertkit-broadcasts-list li .convertkit-broadcast-read-more{display:block;margin:10px 0 0 0}.convertkit-broadcasts{margin-bottom:20px}@media only screen and (min-width: 482px){.convertkit-broadcasts{margin-bottom:30px}}.convertkit-broadcasts.has-background,.convertkit-broadcasts[data-background-color]{padding:20px}.convertkit-broadcasts.convertkit-broadcasts-loading{background-color:#e3e3e3 !important;background-image:url(../images/spinner.gif);background-position:center;background-repeat:no-repeat}.editor-styles-wrapper .convertkit-broadcasts.has-background{padding:20px}.editor-styles-wrapper .convertkit-broadcasts.convertkit-broadcasts-loading{background-color:#e3e3e3 !important;background-image:url(../images/spinner.gif);background-position:center;background-repeat:no-repeat}.convertkit-broadcasts[data-display-order=broadcast-date] .convertkit-broadcasts-list li{grid-template-areas:"title date" "text image";grid-template-columns:auto 150px}.convertkit-broadcasts[data-display-grid="1"] .convertkit-broadcasts-list{display:grid;grid-template-columns:repeat(3, 1fr);grid-column-gap:20px;grid-row-gap:20px;align-items:start}@media screen and (max-width: 768px){.convertkit-broadcasts[data-display-grid="1"] .convertkit-broadcasts-list{grid-template-columns:repeat(2, 1fr)}}@media screen and (max-width: 478px){.convertkit-broadcasts[data-display-grid="1"] .convertkit-broadcasts-list{grid-template-columns:repeat(1, 1fr)}}.convertkit-broadcasts[data-display-grid="1"] .convertkit-broadcasts-list li{grid-template-areas:"image" "date" "title" "text";grid-template-columns:none;grid-row-gap:10px}.convertkit-broadcasts[data-display-grid="1"][data-display-order=broadcast-date] .convertkit-broadcasts-list li{grid-template-areas:"image" "title" "text" "date"}.convertkit-broadcasts[data-display-order=broadcast-date] .convertkit-broadcasts-list li time{text-align:right}.convertkit-broadcasts[data-display-grid="1"][data-display-order=broadcast-date] .convertkit-broadcasts-list li time{text-align:left}@media screen and (max-width: 478px){.convertkit-broadcasts-list li{grid-template-areas:"image image" "date date" "title title" "text text";grid-row-gap:10px}.convertkit-broadcasts[data-display-image="1"] .convertkit-broadcasts-list li{margin:0 0 20px 0}}body.convertkit-broadcast.elementor-default table,body.convertkit-broadcast.elementor-default table tbody,body.convertkit-broadcast.elementor-default table tbody td{border:none}body.convertkit-broadcast.elementor-default table tbody>tr:nth-child(odd)>td,body.convertkit-broadcast.elementor-default table tbody>tr:nth-child(odd)>th{background:none}.convertkit-product,.convertkit-button{margin-bottom:20px}@media only screen and (min-width: 482px){.convertkit-product,.convertkit-button{margin-bottom:30px}}.convertkit-product a,.convertkit-product span,.convertkit-button a,.convertkit-button span{display:block;padding:calc(.667em + 2px) calc(1.333em + 2px);cursor:pointer;text-align:center;text-decoration:none;word-break:break-word;box-sizing:border-box}.wp-block-convertkit-form-builder-field input,.wp-block-convertkit-form-builder-field textarea{width:100%;margin:0 0 20px 0;padding:10px;box-sizing:border-box;font-family:inherit}.wp-block-convertkit-form-builder-field label span.convertkit-form-builder-field-required{color:red}form .convertkit-form-builder-subscribed-message{width:100%;margin:0 0 20px 0;box-sizing:border-box}form.formkit-form[data-format=inline]{margin-left:auto;margin-right:auto;margin-bottom:20px}@media only screen and (min-width: 482px){form.formkit-form[data-format=inline]{margin-bottom:30px}}.formkit-sticky-bar{z-index:999999 !important}#convertkit-restrict-content *,#convertkit-restrict-content-modal *{box-sizing:border-box}#convertkit-restrict-content h3,#convertkit-restrict-content-modal h3{margin:0 0 20px 0;padding:0;font-size:24px;line-height:40px;font-style:normal}#convertkit-restrict-content h4,#convertkit-restrict-content-modal h4{margin:0 0 5px 0;padding:0;font-size:18px;line-height:30px;font-style:normal}#convertkit-restrict-content p,#convertkit-restrict-content-modal p{margin:0 0 20px 0;padding:0;font-size:16px;line-height:28px}#convertkit-restrict-content small,#convertkit-restrict-content-modal small{display:block;font-size:13px;line-height:22px;color:#111}#convertkit-restrict-content{width:100%;background:#f9f7f4;color:#373f45;margin:30px auto;padding:40px;text-align:center;box-sizing:border-box;border-radius:8px}#convertkit-restrict-content .convertkit-product a{display:inline-block;text-decoration:none;height:42px;line-height:42px;font-size:15px;margin:0;padding:0 20px !important;border:none;border-radius:3px}.convertkit-restrict-content-notice{display:inline-block;margin:0 0 20px 0;padding:0 0 0 30px;color:#d3434a;font-size:12px;line-height:24px;font-weight:400;background-image:url(../images/error.svg);background-repeat:no-repeat;background-size:24px 24px}form.convertkit-restrict-content-form input[type=submit]{height:42px;line-height:42px;font-size:15px;margin:0;padding:0 20px !important;border:none;border-radius:3px}form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field{display:grid;grid-template-areas:"email button";grid-template-columns:3fr 1fr;grid-column-gap:5px;text-align:left;max-width:500px;height:56px;margin:0 auto 20px auto;padding:6px 10px;background-image:url(../images/email.svg);background-repeat:no-repeat;background-color:#fff;background-size:15px 15px;background-position:18px 20px;border:1px solid #fff;border-radius:3px}form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field.convertkit-restrict-content-error{border-color:#d3434a}form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field input[type=email]{grid-area:email;text-indent:35px;height:42px;line-height:42px;margin:0;padding:0;font-size:15px;background:none;border:none}form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field input[type=submit]{grid-area:button}form.convertkit-restrict-content-form div#convertkit-subscriber-code-container{width:427px;height:100px;border:1px solid #dce1e5;border-radius:4px;margin:0 auto 20px auto;overflow:hidden;background:#dce1e5}form.convertkit-restrict-content-form div#convertkit-subscriber-code-container.convertkit-restrict-content-error{border-color:#d3434a}form.convertkit-restrict-content-form div#convertkit-subscriber-code-container input#convertkit-subscriber-code{--otp-digits: 6;--otp-height: 98px;--otp-number-width: 70px;--otp-letter-spacing: 41px;--otp-text-indent: 20px;--otp-border-color: #dce1e5;--otp-text-color: #697177;--otp-font-size: 50px;--_otp-digit: 0;all:unset;text-align:left;margin:0;padding:0;background:linear-gradient(90deg, #dce1e5 var(--otp-number-width), transparent 0),linear-gradient(90deg, #fff var(--otp-number-width), transparent 0);background-position:calc(var(--_otp-digit)*(var(--otp-number-width) + 1px)) 0,0 0;background-repeat:no-repeat,repeat-x;background-size:calc(var(--otp-number-width) + 1px) 100%;inline-size:calc(var(--otp-digits)*(var(--otp-number-width) + 1px));letter-spacing:var(--otp-letter-spacing);text-indent:var(--otp-text-indent);width:calc(var(--otp-number-width)*var(--otp-digits) + var(--otp-digits));height:var(--otp-height);color:var(--otp-text-color);font-size:var(--otp-font-size);font-family:monospace;font-weight:400}#convertkit-restrict-content-modal-background{display:none;position:fixed;width:100%;height:100%;z-index:999998;top:0;left:0;background:rgba(9,13,22,.8)}#convertkit-restrict-content-modal{box-sizing:border-box;display:none;position:fixed;z-index:999999;width:730px;height:328px;top:calc(50% - 164px);left:calc(50% - 365px);margin:0;padding:80px 115px;background:#fff;border:1px solid #fff;border-radius:8px;text-align:center}#convertkit-restrict-content-modal form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field{background-color:#f4f6f8}#convertkit-restrict-content-modal #convertkit-restrict-content-modal-close{position:absolute;top:25px;right:25px;text-indent:-9999px;background-image:url(../images/cross.svg);background-repeat:no-repeat;background-size:12px 12px;background-color:rgba(0,0,0,0);border:none;cursor:pointer}#convertkit-restrict-content-modal-loading{box-sizing:border-box;display:none;position:absolute;z-index:1000000;width:100%;height:100%;top:0;left:0;margin:0;padding:0;background:url(../images/spinner.gif) center no-repeat hsla(0,0%,100%,.8);border:none;border-radius:8px;text-align:center}@media screen and (max-width: 730px){#convertkit-restrict-content{padding:20px}#convertkit-restrict-content .convertkit-restrict-content-actions{padding:10px}#convertkit-restrict-content input[type=email],#convertkit-restrict-content input[type=text],#convertkit-restrict-content input#convertkit-subscriber-code{width:100%}form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field{grid-template-areas:"email email" "button button";max-width:100%;height:auto}form.convertkit-restrict-content-form div#convertkit-restrict-content-email-field input[type=submit]{margin-top:10px}form.convertkit-restrict-content-form div#convertkit-subscriber-code-container{width:213px;height:50px}form.convertkit-restrict-content-form div#convertkit-subscriber-code-container input#convertkit-subscriber-code{--otp-height: 49px;--otp-number-width: 35px;--otp-letter-spacing: 20px;--otp-text-indent: 10px;--otp-font-size: 25px}#convertkit-restrict-content-modal{width:90%;height:auto;left:5%;padding:40px}} diff --git a/resources/frontend/js/dist/frontend.min.asset.php b/resources/frontend/js/dist/frontend.min.asset.php deleted file mode 100644 index 4ae57eb6f..000000000 --- a/resources/frontend/js/dist/frontend.min.asset.php +++ /dev/null @@ -1 +0,0 @@ - array(), 'version' => '27c29088bdf910a921c1'); diff --git a/resources/frontend/js/dist/frontend.min.js b/resources/frontend/js/dist/frontend.min.js deleted file mode 100644 index afeeda6b8..000000000 --- a/resources/frontend/js/dist/frontend.min.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var t={184:()=>{document.addEventListener("DOMContentLoaded",function(){document.addEventListener("click",function(t){if(t.target.matches("ul.convertkit-broadcasts-pagination a")){t.preventDefault();const e=t.target.closest("div.convertkit-broadcasts");!function(t,e){convertkit_broadcasts.debug&&(console.log("convertKitBroadcastsRender()"),console.log(e)),t.classList.add("convertkit-broadcasts-loading");const n=new URLSearchParams(e),o=`${convertkit_broadcasts.ajax_url}?${n.toString()}`;fetch(o).then(function(t){return convertkit_broadcasts.debug&&console.log(t),t.json()}).then(function(e){convertkit_broadcasts.debug&&console.log(e),t.classList.remove("convertkit-broadcasts-loading"),t.innerHTML=e}).catch(function(e){convertkit.debug&&console.error(e),t.classList.remove("convertkit-broadcasts-loading")})}(e,{display_date:e.dataset.displayDate,date_format:e.dataset.dateFormat,display_image:e.dataset.displayImage,display_description:e.dataset.displayDescription,display_read_more:e.dataset.displayReadMore,read_more_label:e.dataset.readMoreLabel,limit:e.dataset.limit,paginate:e.dataset.paginate,paginate_label_prev:e.dataset.paginateLabelPrev,paginate_label_next:e.dataset.paginateLabelNext,link_color:e.dataset.linkColor,page:t.target.dataset.page})}})})},509:()=>{function t(t,e){const n=new CustomEvent(t,{detail:e});document.dispatchEvent(n)}window.convertKitRecaptchaFormSubmit=function(t){document.querySelector('[type="submit"][data-callback="convertKitRecaptchaFormSubmit"]').closest("form").submit()},document.addEventListener("DOMContentLoaded",function(){!function(e){const n=new URL(e),o=n.searchParams.get("ck_subscriber_id");if(null===o)return;n.searchParams.delete("ck_subscriber_id");const r=document.getElementsByTagName("title")[0].innerHTML;let c=n.searchParams.toString();c.length>0&&(c="?"+c),window.history.replaceState(null,r,n.pathname+c+n.hash),t("kit_subscriber_id_removed_from_url",{id:o})}(window.location.href),document.addEventListener("click",function(e){if(!(e.target.matches(".formkit-submit")||e.target.parentElement&&e.target.parentElement.matches(".formkit-submit")))return void(convertkit.debug&&console.log("not a ck form"));const n=document.querySelector('input[name="email_address"]').value;n.length?/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(n.toLowerCase())?(function(){const t=(new Date).getTime();for(let e=0;e<1e7&&!((new Date).getTime()-t>2e3);e++);}(),function(e){convertkit.debug&&(console.log("convertStoreSubscriberEmailAsIDInCookie"),console.log(e)),fetch(convertkit.ajaxurl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":convertkit.nonce},body:new URLSearchParams({email:e})}).then(function(t){return convertkit.debug&&console.log(t),t.json()}).then(function(n){convertkit.debug&&console.log(n),t("convertkit_user_subscribed",{id:n.id,email:e})}).catch(function(t){convertkit.debug&&console.error(t)})}(n)):convertkit.debug&&console.log("email not an email address"):convertkit.debug&&console.log("email empty")}),document.querySelectorAll('script[data-kit-limit-per-session="1"]').length>0&&(document.cookie="ck_non_inline_form_displayed=1; path=/",convertkit.debug&&console.log("Set `ck_non_inline_form_displayed` cookie for non-inline form limit"))})},688:()=>{function t(){const t=document.querySelector("#convertkit-subscriber-code");null!==t&&t.addEventListener("input",function(){t.style.setProperty("--_otp-digit",t.value.length),6===t.value.length&&(t.setSelectionRange(0,0),t.blur(),document.querySelector("#convertkit-restrict-content-form").requestSubmit())})}document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(".convertkit-restrict-content-modal-open").forEach(function(t){t.addEventListener("click",function(t){t.preventDefault(),document.querySelector("#convertkit-restrict-content-modal-background").style.display="block",document.querySelector("#convertkit-restrict-content-modal").style.display="block"})}),document.addEventListener("submit",function(e){e.target.matches("form#convertkit-restrict-content-form")&&(e.preventDefault(),function(e){if(document.querySelectorAll('input[type="text"], input[type="email"], input[type="submit"]').forEach(function(t){t.setAttribute("disabled","disabled")}),document.querySelector("#convertkit-restrict-content-modal-loading").style.display="block",null!==document.querySelector("input#convertkit-subscriber-code"))return n=convertkit_restrict_content.nonce,o=e.target.querySelector('input[name="subscriber_code"]').value,r=e.target.querySelector('input[name="token"]').value,c=e.target.querySelector('input[name="convertkit_post_id"]').value,fetch(convertkit_restrict_content.subscriber_verification_url,{method:"POST",headers:{"Content-Type":"application/json","X-WP-Nonce":n},body:JSON.stringify({subscriber_code:o,token:r,convertkit_post_id:c})}).then(function(t){return convertkit_restrict_content.debug&&console.log(t),t.json()}).then(function(e){if(convertkit_restrict_content.debug&&console.log(e),!e.success)return document.querySelector("#convertkit-restrict-content-modal-content").innerHTML=e.data,document.querySelector("#convertkit-restrict-content-modal-loading").style.display="none",void t();window.location=e.url}).catch(function(t){convertkit_restrict_content.debug&&console.error(t)}),!1;var n,o,r,c;!function(e,n,o,r,c){fetch(convertkit_restrict_content.subscriber_authentication_url,{method:"POST",headers:{"Content-Type":"application/json","X-WP-Nonce":e},body:JSON.stringify({convertkit_email:n,convertkit_resource_type:o,convertkit_resource_id:r,convertkit_post_id:c})}).then(function(t){return convertkit_restrict_content.debug&&console.log(t),t.json()}).then(function(e){convertkit_restrict_content.debug&&console.log(e),void 0!==e.code?document.querySelector("#convertkit-restrict-content-modal-content").innerHTML=e.message:document.querySelector("#convertkit-restrict-content-modal-content").innerHTML=e.data,document.querySelector("#convertkit-restrict-content-modal-loading").style.display="none",t()}).catch(function(t){convertkit_restrict_content.debug&&console.error(t)})}(convertkit_restrict_content.nonce,e.target.querySelector('input[name="convertkit_email"]').value,e.target.querySelector('input[name="convertkit_resource_type"]').value,e.target.querySelector('input[name="convertkit_resource_id"]').value,e.target.querySelector('input[name="convertkit_post_id"]').value)}(e))});const e=document.querySelector("#convertkit-restrict-content-modal-close");null!==e&&e.addEventListener("click",function(t){t.preventDefault(),document.querySelector("#convertkit-restrict-content-modal-background").style.display="none",document.querySelector("#convertkit-restrict-content-modal-loading").style.display="none",document.querySelector("#convertkit-restrict-content-modal").style.display="none"})})}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o](c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";n(184),n(509),n(688)})()})(); \ No newline at end of file From acf0ea8656bf4c734e631df7da5ebedfe3f1da9c Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 11:16:41 +0800 Subject: [PATCH 3/7] Update .gitignore to exclude frontend CSS and JS builds --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 28246c431..6c7bafbac 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,8 @@ log.txt package-lock.json phpstan.neon node_modules -resources/frontend/css/*.map +resources/frontend/css/ +resources/frontend/js/dist/ tests/_output tests/_wordpress tests/Support/_generated From e7a26918bedc75da409f37a8ff5077a21d2b88c5 Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 14:43:14 +0800 Subject: [PATCH 4/7] Update docs --- .github/docs/npm-run-build-errors.png | Bin 0 -> 62794 bytes DEVELOPMENT.md | 20 ++++++++++++++++---- TESTING.md | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 .github/docs/npm-run-build-errors.png diff --git a/.github/docs/npm-run-build-errors.png b/.github/docs/npm-run-build-errors.png new file mode 100644 index 0000000000000000000000000000000000000000..f1e40e0bfcf8d947d63c694ed2246aedbdd22c3b GIT binary patch literal 62794 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 literal 0 HcmV?d00001 diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 3fd608b46..ab973bbd7 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -60,10 +60,6 @@ Typically, packages listed in this section would be internal development tools f - PHPStan - Codeception -### Build - -Run `npm run build` to compile frontend CSS and JS in one step. - ### CSS Run `npm run watch:css` to compile frontend CSS to `resources/frontend/css/frontend.css` when working on SCSS in the `resources/frontend/scss` folder. @@ -72,6 +68,22 @@ Run `npm run watch:css` to compile frontend CSS to `resources/frontend/css/front Run `npm run watch:js` to compile frontend JS to `resources/frontend/js/dist/frontend-min.js` when working on JS in the `resources/frontend/js` folder. +### Build + +Run `npm run build` to: +- fix CSS to WordPress Coding Standards (`npm run fix:css`) +- lint CSS to check WordPress Coding Standards met after any fixes (`npm run lint:css`) +- fix JS to WordPress Coding Standards (`npm run fix:js`) +- lint JS to check WordPress Coding Standards met after any fixes (`npm run lint:js`) +- compile frontend CSS from `resources/frontend/scss` to `resources/frontend/css/frontend.css` (`npm run build:css`) +- compile frontend JS from `resources/frontend/js` to `resources/frontend/js/dist` (`npm run build:js`) + +If the build process fails, review the terminal and make applicable changes: + +![npm run build errors](/.github/docs/npm-run-build-errors.png?raw=true) + +GitHub actions will run this step for you on testing and deployment, but it's a useful command in development if you need a single command to cover CSS + JS. + ## Committing Work Remember to commit your changes to your branch relatively frequently, with a meaningful, short summary that explains what the change(s) do. diff --git a/TESTING.md b/TESTING.md index 2da6c131f..a473900d5 100644 --- a/TESTING.md +++ b/TESTING.md @@ -34,7 +34,7 @@ The following Composer commands can be used: | `composer fix-js-coding-standards` | `composer fix-js` | Fixes JS files to meet WordPress JS Coding Standards | | `composer build-js` | `composer build-js` | Builds the frontend JS file | | `composer watch-js` | `composer watch-js` | Builds the frontend JS file when changes are made to frontend JS files | -| `composer build` | `composer build` | Builds frontend CSS and JS | +| `composer build` | `composer build` | Fixes, lints and builds frontend CSS and JS | | `composer static-analysis` | `composer phpstan` | Runs PHPStan static analysis with increased memory limit | | `composer test` | `composer test` | Builds and runs end-to-end tests with `fail-fast` enabled | | `composer test-integration` | `composer test-integration` | Builds and runs integration tests with `fail-fast` enabled | @@ -47,7 +47,7 @@ The following npm commands can be used, if preferred: | `npm run watch:css` | Builds the frontend CSS file when changes are made to SCSS files | | `npm run build:js` | Builds the frontend JS file | | `npm run watch:js` | Builds the frontend JS file when changes are made to frontend JS files | -| `npm run build` | Builds frontend CSS and JS | +| `npm run build` | Fixes, lints and builds frontend CSS and JS | ## Write (or modify) a test From 0ab10600adcf6f2121017797e6bf8df6e58e2f68 Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 15:13:50 +0800 Subject: [PATCH 5/7] Fix GitHub actions and improve file exist checks --- .github/workflows/deploy.yml | 28 +++++++++++++---- .github/workflows/tests-backward-compat.yml | 2 +- .github/workflows/tests.yml | 33 +++++++++++++++++---- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 679d2f4d3..df88c917a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,17 +32,33 @@ jobs: npm install npm run build - # Confirm that expected files exist, to prevent deployment to wordpress.org + # Confirm that expected files exist # if e.g. `composer install` or `npm run build` fails - name: Check Kit WordPress Libraries and Assets Exists - id: check_files - uses: andstor/file-existence-action@v1 - with: - files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + working-directory: ${{ env.PLUGIN_DIR }} + run: | + set -e + + files=( + "resources/frontend/css/frontend.css" + "resources/frontend/js/dist/frontend.min.asset.php" + "resources/frontend/js/dist/frontend.min.js" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + ) + + for file in "${files[@]}"; do + echo "Checking: $file" + test -f "$file" || { echo "❌ Missing required file: $file"; exit 1; } + done + + echo "✅ All required files exist." # Deploy to wordpress.org, if expected files exist. - name: WordPress Plugin Deploy - if: steps.check_files.outputs.files_exists == 'true' id: deploy uses: 10up/action-wordpress-plugin-deploy@stable with: diff --git a/.github/workflows/tests-backward-compat.yml b/.github/workflows/tests-backward-compat.yml index 7fdc04f06..370d57c50 100644 --- a/.github/workflows/tests-backward-compat.yml +++ b/.github/workflows/tests-backward-compat.yml @@ -278,8 +278,8 @@ jobs: # Confirm that expected files exist # if e.g. `composer install` or `npm run build` fails - name: Check Kit WordPress Libraries and Assets Exists - working-directory: ${{ env.PLUGIN_DIR }} id: check_files + working-directory: ${{ env.PLUGIN_DIR }} uses: andstor/file-existence-action@v1 with: files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d8efad2c0..8a061c117 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -301,11 +301,26 @@ jobs: # if e.g. `composer install` or `npm run build` fails - name: Check Kit WordPress Libraries and Assets Exists working-directory: ${{ env.PLUGIN_DIR }} - id: check_files - uses: andstor/file-existence-action@v1 - with: - files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" - + run: | + set -e + + files=( + "resources/frontend/css/frontend.css" + "resources/frontend/js/dist/frontend.min.asset.php" + "resources/frontend/js/dist/frontend.min.js" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + ) + + for file in "${files[@]}"; do + echo "Checking: $file" + test -f "$file" || { echo "❌ Missing required file: $file"; exit 1; } + done + + echo "✅ All required files exist." - name: Build PHP Autoloader working-directory: ${{ env.PLUGIN_DIR }} @@ -411,6 +426,12 @@ jobs: - name: Run Composer run: composer install --no-dev + # Build the frontend CSS and JS assets. + - name: Run npm + run: | + npm install + npm run build + # Configure AWS Credentials - name: Configure AWS credentials id: credentials @@ -423,7 +444,7 @@ jobs: # Create ZIP file - name: Create ZIP File run: | - zip -r ${{ env.PLUGIN_SLUG }}.zip . -x ".git/*" ".github/*" ".scripts/*" ".wordpress-org/*" "log/*" "tests/*" "*.md" "*.yml" "*.json" "*.neon" "*.lock" "*.xml" "*.dist" "*.example" "*.testing" "vendor/convertkit/convertkit-wordpress-libraries/.git/*" + zip -r ${{ env.PLUGIN_SLUG }}.zip . -x ".git/*" ".github/*" ".scripts/*" ".wordpress-org/*" "log/*" "node_modules/*" "tests/*" "*.md" "*.yml" "*.json" "*.neon" "*.lock" "*.xml" "*.dist" ".eslintrc.js" "*.example" "*.testing" "vendor/convertkit/convertkit-wordpress-libraries/.git/*" # Exchange API Keys and Secrets for OAuth Tokens. - name: Exchange API Key and Secret for OAuth Tokens From 8d340b622565f7277f8840da23c07873c42e8512 Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 15:13:56 +0800 Subject: [PATCH 6/7] Update setup guide --- SETUP.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SETUP.md b/SETUP.md index 58507ae8c..2368806c5 100644 --- a/SETUP.md +++ b/SETUP.md @@ -97,6 +97,10 @@ This sets up: - JS compilation and minification - SASS compilation and minification +### Build JS and CSS + +Run `npm run build` to build the frontend CSS and JS. + ### Configure wp-config.php In the root of your WordPress installation, find the `wp-config.php` file. From 22719a4ffe0aa86abb022e71c86f30e6ca32765d Mon Sep 17 00:00:00 2001 From: Tim Carr Date: Fri, 20 Feb 2026 15:14:42 +0800 Subject: [PATCH 7/7] Fix backward compat. test GitHub action --- .github/workflows/tests-backward-compat.yml | 24 +++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/.github/workflows/tests-backward-compat.yml b/.github/workflows/tests-backward-compat.yml index 370d57c50..3bc764a87 100644 --- a/.github/workflows/tests-backward-compat.yml +++ b/.github/workflows/tests-backward-compat.yml @@ -278,11 +278,27 @@ jobs: # Confirm that expected files exist # if e.g. `composer install` or `npm run build` fails - name: Check Kit WordPress Libraries and Assets Exists - id: check_files working-directory: ${{ env.PLUGIN_DIR }} - uses: andstor/file-existence-action@v1 - with: - files: "resources/frontend/css/frontend.css, resources/frontend/js/dist/frontend.min.asset.php, resources/frontend/js/dist/frontend.min.js, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php, vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + run: | + set -e + + files=( + "resources/frontend/css/frontend.css" + "resources/frontend/js/dist/frontend.min.asset.php" + "resources/frontend/js/dist/frontend.min.js" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php" + "vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php" + ) + + for file in "${files[@]}"; do + echo "Checking: $file" + test -f "$file" || { echo "❌ Missing required file: $file"; exit 1; } + done + + echo "✅ All required files exist." - name: Build PHP Autoloader working-directory: ${{ env.PLUGIN_DIR }}