From e0be3aa8f2ce769cfd241f73c0d603d94e63c63c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 18:14:14 +0200 Subject: [PATCH 01/43] Test commit (#508) (#509) Co-authored-by: Hein van Vlastuin <94352322+hein-obox@users.noreply.github.com> --- dev/scss/reset.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/scss/reset.scss b/dev/scss/reset.scss index dae67e8d..cb360c7c 100644 --- a/dev/scss/reset.scss +++ b/dev/scss/reset.scss @@ -3,3 +3,4 @@ @forward "reset/forms"; @forward "reset/table"; @forward "reset/list"; +// Test comment. From fc52aad85f0e0f877d2288030012b2dc28ecaf51 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:40:42 +0200 Subject: [PATCH 02/43] Test comment (#511) (#512) Co-authored-by: Hein van Vlastuin <94352322+hein-obox@users.noreply.github.com> --- dev/scss/editor.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/scss/editor.scss b/dev/scss/editor.scss index c0714db5..1c58d420 100644 --- a/dev/scss/editor.scss +++ b/dev/scss/editor.scss @@ -19,3 +19,4 @@ } } } +// Test comment. From cc21858cd3f718c789ac28090a6cf133c3fb1309 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:43:25 +0200 Subject: [PATCH 03/43] Clean up test comment. (#513) (#514) --- dev/scss/editor.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/scss/editor.scss b/dev/scss/editor.scss index 1c58d420..c0714db5 100644 --- a/dev/scss/editor.scss +++ b/dev/scss/editor.scss @@ -19,4 +19,3 @@ } } } -// Test comment. From 7f7a34861f18168839d62df6a0c36ff4ca8c3b34 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 12:59:25 +0200 Subject: [PATCH 04/43] Cherry-pick PR #520 with conflicts - manual resolution needed (#521) --- .github/workflows/playwright.yml | 77 +++++++++ .gitignore | 7 + tests/playwright/pages/settings-page.ts | 157 ++++++++++++++++++ .../settings/description-meta-tag.test.ts | 60 +++++++ .../tests/settings/header-footer.test.ts | 48 ++++++ .../tests/settings/page-title.test.ts | 49 ++++++ .../tests/settings/reset-css.test .ts | 68 ++++++++ .../tests/settings/settings-suite.test.ts | 73 ++++++++ .../tests/settings/skip-links.test.ts | 63 +++++++ .../tests/settings/theme-css.test.ts | 68 ++++++++ 10 files changed, 670 insertions(+) create mode 100644 .github/workflows/playwright.yml create mode 100644 tests/playwright/pages/settings-page.ts create mode 100644 tests/playwright/tests/settings/description-meta-tag.test.ts create mode 100644 tests/playwright/tests/settings/header-footer.test.ts create mode 100644 tests/playwright/tests/settings/page-title.test.ts create mode 100644 tests/playwright/tests/settings/reset-css.test .ts create mode 100644 tests/playwright/tests/settings/settings-suite.test.ts create mode 100644 tests/playwright/tests/settings/skip-links.test.ts create mode 100644 tests/playwright/tests/settings/theme-css.test.ts diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 00000000..9bb0bff9 --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,77 @@ +name: Playwright Tests + +on: + pull_request: + types: [opened, synchronize, reopened] + +permissions: + contents: read + actions: write + +jobs: + playwright-tests: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + registry-url: 'https://npm.pkg.github.com' + scope: '@elementor' + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + tools: composer + coverage: none + + - name: Install Composer dependencies + run: composer install --no-dev --no-scripts --optimize-autoloader + + - name: Install npm dependencies + run: npm ci + env: + NODE_AUTH_TOKEN: ${{ secrets.CLOUD_DEVOPS_TOKEN }} + + - name: Build plugin + run: npm run build:prod + + - name: Start wp-env + run: npm run wp-env:start + + - name: Setup Playwright + run: npm run test:setup:playwright + + - name: Setup Chromium + run: npm run test:setup:chromium + + - name: Run Playwright tests + id: playwright-tests + run: | + npm run test:playwright + echo "exit_code=$?" >> $GITHUB_OUTPUT + continue-on-error: false + + - uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-test-results-${{ matrix.shardIndex }} + path: ${{ inputs.path-to-results || 'test-results/' }} + if-no-files-found: ignore + retention-days: 2 + + - name: Check test results + if: steps.playwright-tests.outcome == 'failure' + run: | + echo "❌ Playwright tests failed!" + exit 1 + + - name: Stop wp-env + if: always() + run: npm run wp-env:stop diff --git a/.gitignore b/.gitignore index 3af24740..1e91616f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,10 @@ assets/js/ *.zip .npmrc .env +<<<<<<< HEAD +======= +tmp/ +.phpunit.result.cache +test-results/ +!tests/phpunit/hello-elementor +>>>>>>> dab5ced (Internal: Settings page test [TMZ-894] (#520)) diff --git a/tests/playwright/pages/settings-page.ts b/tests/playwright/pages/settings-page.ts new file mode 100644 index 00000000..7f50eb59 --- /dev/null +++ b/tests/playwright/pages/settings-page.ts @@ -0,0 +1,157 @@ +import { APIRequestContext, type Page, type TestInfo, expect } from '@playwright/test'; +import WpAdminPage from './wp-admin-page.ts'; + +export default class SettingsPage extends WpAdminPage { + async gotoSettingsPage(): Promise { + await this.page.goto( '/wp-admin/admin.php?page=hello-elementor-settings' ); + await this.page.waitForSelector( 'h4:has-text("Advanced theme settings")', { timeout: 10000 } ); + } + + getTab( tabName: string ) { + return this.page.getByRole( 'tab', { name: tabName } ); + } + + getTabPanel( tabName: string ) { + return this.page.getByRole( 'tabpanel', { name: tabName } ); + } + + async createNewBasicPost(): Promise { + const request: APIRequestContext = this.page.context().request, + postDataInitial = { + title: 'Playwright Test Page - Uninitialized', + content: 'This is a test content for the post.', + status: 'publish' as const, + excerpt: 'This is a test excerpt that should appear in meta description.', + }, + postId = await this.apiRequests.create( request, 'pages', postDataInitial ), + postDataUpdated = { + title: `Playwright Test Page #${ postId }`, + }; + + await this.apiRequests.create( request, `pages/${ postId }`, postDataUpdated ); + + return postId; + } + + async clickTab( tabName: string ): Promise { + await this.getTab( tabName ).click(); + await this.page.waitForSelector( `[role="tabpanel"]:visible`, { timeout: 5000 } ); + } + + getCheckboxByIndex( index: number ) { + return this.page.locator( 'input[type="checkbox"]' ).nth( index ); + } + + getCheckboxBySetting( settingName: string ) { + const settingMap: { [key: string]: number } = { + 'Disable description meta tag': 0, + 'Disable skip links': 1, + 'Disable theme header and footer': 0, + 'Hide page title': 1, + 'Deregister Hello reset.css': 0, + 'Deregister Hello theme.css': 1, + }; + return this.page.locator( `input[type="checkbox"]` ).nth( settingMap[ settingName ] || 0 ); + } + + async toggleSetting( settingName: string ): Promise { + const checkbox = this.getCheckboxBySetting( settingName ); + await checkbox.click(); + await this.waitForSaveNotification(); + return await checkbox.isChecked(); + } + + async toggleCheckboxByIndex( index: number ): Promise { + const checkbox = this.getCheckboxByIndex( index ); + await checkbox.click(); + await this.waitForSaveNotification(); + return await checkbox.isChecked(); + } + + async waitForSaveNotification(): Promise { + await expect( this.page.locator( '[role="alert"]:has-text("Settings Saved")' ).first() ).toBeVisible( { timeout: 5000 } ); + } + + async closeSaveNotification(): Promise { + const notification = this.page.locator( '[role="alert"]:has-text("Settings Saved")' ); + if ( await notification.isVisible() ) { + await notification.getByRole( 'button', { name: 'Close' } ).click(); + } + } + + async openChangelog(): Promise { + await this.page.getByRole( 'link', { name: 'Changelog' } ).click(); + await expect( this.page.locator( 'h4:has-text("Changelog")' ) ).toBeVisible( { timeout: 5000 } ); + } + + async closeChangelogWithEscape(): Promise { + await this.page.keyboard.press( 'Escape' ); + await expect( this.page.locator( '[role="dialog"]' ) ).not.toBeVisible( { timeout: 3000 } ); + } + + async closeChangelogByClickingOutside(): Promise { + await this.page.locator( '[role="dialog"]' ).click( { position: { x: 5, y: 5 } } ); + await expect( this.page.locator( '[role="dialog"]' ) ).not.toBeVisible( { timeout: 3000 } ); + } + + async getChangelogVersions(): Promise { + const versionElements = this.page.locator( 'h6[class*="MuiTypography"]:regex("\\d+\\.\\d+\\.\\d+ - \\d{4}-\\d{2}-\\d{2}")' ); + return await versionElements.allTextContents(); + } + + async hasWarningAlert(): Promise { + return await this.page.locator( '[role="alert"]:has-text("Be Careful")' ).isVisible(); + } + + async getSettingDescription( settingName: string ): Promise { + const descriptionElement = this.page.locator( `h6:has-text("${ settingName }") ~ * p:has-text("What it does:")` ); + return await descriptionElement.textContent() || ''; + } + + async getSettingTip( settingName: string ): Promise { + const tipElement = this.page.locator( `h6:has-text("${ settingName }") ~ * p:has-text("Tip:")` ); + return await tipElement.textContent() || ''; + } + + async getSettingCode( settingName: string ): Promise { + const codeElement = this.page.locator( `h6:has-text("${ settingName }") ~ * code` ); + return await codeElement.textContent() || ''; + } + + async waitForPageLoad(): Promise { + await this.page.waitForSelector( 'h4:has-text("Advanced theme settings")', { timeout: 10000 } ); + await this.page.waitForSelector( '[role="tablist"]', { timeout: 5000 } ); + await this.page.waitForSelector( '[role="tabpanel"]:visible', { timeout: 5000 } ); + await this.page.waitForTimeout( 1000 ); + } + + async resetToDefaults(): Promise { + const tabs = [ + 'SEO and accessibility', + 'Structure and layout', + 'CSS and styling control', + ]; + + for ( const tabName of tabs ) { + await this.clickTab( tabName ); + + const checkboxes = this.page.locator( 'input[type="checkbox"]' ); + const count = await checkboxes.count(); + + for ( let i = 0; i < count; i++ ) { + const checkbox = checkboxes.nth( i ); + const isChecked = await checkbox.isChecked(); + + let shouldBeChecked = false; + if ( 'Structure and layout' === tabName && 1 === i ) { + shouldBeChecked = true; + } + + if ( isChecked !== shouldBeChecked ) { + await checkbox.click(); + await this.waitForSaveNotification(); + } + } + } + } +} diff --git a/tests/playwright/tests/settings/description-meta-tag.test.ts b/tests/playwright/tests/settings/description-meta-tag.test.ts new file mode 100644 index 00000000..4260612c --- /dev/null +++ b/tests/playwright/tests/settings/description-meta-tag.test.ts @@ -0,0 +1,60 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Description Meta Tag Setting - Behavior Tests', () => { + let postId: string; + + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + postId = await settingsPage.createNewBasicPost(); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'SEO and accessibility' ); + } ); + + test( 'should not show meta description on page when the "Disable description meta tag" setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const metaCheckbox = settingsPage.getCheckboxBySetting( 'Disable description meta tag' ); + + const isChecked = await metaCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable description meta tag' ); + } + + await page.goto( `/?p=${ postId }` ); + + const metaDescription = page.locator( 'meta[name="description"]' ); + await expect( metaDescription ).not.toBeAttached(); + } ); + + test( 'should show meta description on page when the "Disable description meta tag" setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const metaCheckbox = settingsPage.getCheckboxBySetting( 'Disable description meta tag' ); + + const isChecked = await metaCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable description meta tag' ); + } + + await page.goto( `/?p=${ postId }` ); + + const metaDescription = page.locator( 'meta[name="description"]' ); + await expect( metaDescription ).toBeAttached(); + } ); + + test( 'should not show meta description on home page when the "Disable description meta tag" setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const metaCheckbox = settingsPage.getCheckboxBySetting( 'Disable description meta tag' ); + + const isChecked = await metaCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable description meta tag' ); + } + + await page.goto( '/' ); + + const metaDescription = page.locator( 'meta[name="description"]' ); + await expect( metaDescription ).not.toBeAttached(); + } ); +} ); diff --git a/tests/playwright/tests/settings/header-footer.test.ts b/tests/playwright/tests/settings/header-footer.test.ts new file mode 100644 index 00000000..1450bf40 --- /dev/null +++ b/tests/playwright/tests/settings/header-footer.test.ts @@ -0,0 +1,48 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Header and Footer Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'Structure and layout' ); + } ); + + test( 'should show header and footer by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const headerFooterCheckbox = settingsPage.getCheckboxBySetting( 'Disable theme header and footer' ); + + const isChecked = await headerFooterCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable theme header and footer' ); + } + + await page.goto( '/' ); + + const header = page.locator( 'header#site-header.site-header' ); + const footer = page.locator( 'footer#site-footer.site-footer' ); + + await expect( header ).toBeAttached(); + await expect( footer ).toBeAttached(); + } ); + + test( 'should hide header and footer when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const headerFooterCheckbox = settingsPage.getCheckboxBySetting( 'Disable theme header and footer' ); + const isChecked = await headerFooterCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable theme header and footer' ); + } + + await page.goto( '/' ); + + const header = page.locator( 'header#site-header.site-header' ); + const footer = page.locator( 'footer#site-footer.site-footer' ); + + await expect( header ).not.toBeAttached(); + await expect( footer ).not.toBeAttached(); + } ); +} ); diff --git a/tests/playwright/tests/settings/page-title.test.ts b/tests/playwright/tests/settings/page-title.test.ts new file mode 100644 index 00000000..b740e73d --- /dev/null +++ b/tests/playwright/tests/settings/page-title.test.ts @@ -0,0 +1,49 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Page Title Setting - Behavior Tests', () => { + let postId: string; + + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + postId = await settingsPage.createNewBasicPost(); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'Structure and layout' ); + } ); + + test( 'should hide page title when setting is checked', async ( { page, apiRequests, request }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const pageTitleCheckbox = settingsPage.getCheckboxBySetting( 'Hide page title' ); + + const isChecked = await pageTitleCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Hide page title' ); + } + + // Act - Navigate to the test post + await page.goto( `/?p=${ postId }` ); + + // Assert - Page title should be hidden + const pageHeader = page.locator( '.page-header h1.entry-title' ); + await expect( pageHeader ).not.toBeAttached(); + } ); + + test( 'should show page title when setting is unchecked', async ( { page, apiRequests, request }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const pageTitleCheckbox = settingsPage.getCheckboxBySetting( 'Hide page title' ); + const isChecked = await pageTitleCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Hide page title' ); + } + + // Act - Navigate to the test post + await page.goto( `/?p=${ postId }` ); + + // Assert - Page title should be visible + const pageHeader = page.locator( '.page-header h1.entry-title' ); + await expect( pageHeader ).toBeAttached(); + await expect( pageHeader ).toHaveText( 'Playwright Test Page #' + postId ); + } ); +} ); diff --git a/tests/playwright/tests/settings/reset-css.test .ts b/tests/playwright/tests/settings/reset-css.test .ts new file mode 100644 index 00000000..654f296a --- /dev/null +++ b/tests/playwright/tests/settings/reset-css.test .ts @@ -0,0 +1,68 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Reset CSS Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'CSS and styling control' ); + } ); + + test( 'should load reset.css by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello reset.css' ); + + const isChecked = await themeCssCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello reset.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/reset.css' ), + ); + + expect( themeCssLoaded ).toBeTruthy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="reset.css"]' ); + await expect( themeCssLink ).toBeAttached(); + } ); + + test( 'should not load reset.css when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello reset.css' ); + const isChecked = await themeCssCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello reset.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/reset.css' ), + ); + + expect( themeCssLoaded ).toBeFalsy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="reset.css"]' ); + await expect( themeCssLink ).not.toBeAttached(); + } ); +} ); diff --git a/tests/playwright/tests/settings/settings-suite.test.ts b/tests/playwright/tests/settings/settings-suite.test.ts new file mode 100644 index 00000000..0d00a831 --- /dev/null +++ b/tests/playwright/tests/settings/settings-suite.test.ts @@ -0,0 +1,73 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Hello Biz Settings - Complete Test Suite', () => { + test( 'should verify all settings tabs are accessible', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + + const tabs = [ + 'SEO and accessibility', + 'Structure and layout', + 'CSS and styling control', + ]; + + for ( const tabName of tabs ) { + const tab = settingsPage.getTab( tabName ); + await expect( tab ).toBeVisible(); + + await settingsPage.clickTab( tabName ); + const panel = settingsPage.getTabPanel( tabName ); + await expect( panel ).toBeVisible(); + } + } ); + + test( 'should toggle settings correctly', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + + await settingsPage.clickTab( 'SEO and accessibility' ); + const skipLinksCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const initialSkipLinksState = await skipLinksCheckbox.isChecked(); + + await settingsPage.toggleSetting( 'Disable skip links' ); + const newSkipLinksState = await skipLinksCheckbox.isChecked(); + expect( newSkipLinksState ).toBe( ! initialSkipLinksState ); + + await settingsPage.clickTab( 'Structure and layout' ); + const headerFooterCheckbox = settingsPage.getCheckboxBySetting( 'Disable theme header and footer' ); + const initialHeaderFooterState = await headerFooterCheckbox.isChecked(); + + await settingsPage.toggleSetting( 'Disable theme header and footer' ); + const newHeaderFooterState = await headerFooterCheckbox.isChecked(); + expect( newHeaderFooterState ).toBe( ! initialHeaderFooterState ); + } ); + + test( 'should persist settings across page reloads', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + + await settingsPage.clickTab( 'SEO and accessibility' ); + const skipLinksCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const initialState = await skipLinksCheckbox.isChecked(); + + await settingsPage.toggleSetting( 'Disable skip links' ); + const stateAfterToggle = await skipLinksCheckbox.isChecked(); + + await page.reload(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'SEO and accessibility' ); + + const stateAfterReload = await skipLinksCheckbox.isChecked(); + expect( stateAfterReload ).toBe( stateAfterToggle ); + + await settingsPage.toggleSetting( 'Disable skip links' ); + const finalState = await skipLinksCheckbox.isChecked(); + expect( finalState ).toBe( initialState ); + } ); +} ); diff --git a/tests/playwright/tests/settings/skip-links.test.ts b/tests/playwright/tests/settings/skip-links.test.ts new file mode 100644 index 00000000..c863c468 --- /dev/null +++ b/tests/playwright/tests/settings/skip-links.test.ts @@ -0,0 +1,63 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Skip Links Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'SEO and accessibility' ); + } ); + + test( 'should show skip link by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const skipLinkCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + + const isChecked = await skipLinkCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable skip links' ); + } + + await page.goto( '/' ); + + const skipLink = page.locator( 'a.skip-link.screen-reader-text[href="#content"]' ); + await expect( skipLink ).toBeAttached(); + await expect( skipLink ).toHaveText( 'Skip to content' ); + } ); + + test( 'should hide skip link when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const skipLinkCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const isChecked = await skipLinkCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Disable skip links' ); + } + + await page.goto( '/' ); + + const skipLink = page.locator( 'a.skip-link.screen-reader-text[href="#content"]' ); + await expect( skipLink ).not.toBeAttached(); + } ); + + test( 'should verify skip link functionality when visible', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const skipLinkCheckbox = settingsPage.getCheckboxBySetting( 'Disable skip links' ); + const isChecked = await skipLinkCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Disable skip links' ); + } + + await page.goto( '/' ); + + const skipLink = page.locator( 'a.skip-link.screen-reader-text[href="#content"]' ); + await expect( skipLink ).toBeAttached(); + + await skipLink.focus(); + await skipLink.click(); + + await expect( page ).toHaveURL( /#content$/ ); + } ); +} ); diff --git a/tests/playwright/tests/settings/theme-css.test.ts b/tests/playwright/tests/settings/theme-css.test.ts new file mode 100644 index 00000000..0ea08b6d --- /dev/null +++ b/tests/playwright/tests/settings/theme-css.test.ts @@ -0,0 +1,68 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; +import SettingsPage from '../../pages/settings-page.ts'; + +test.describe.serial( 'Theme CSS Setting - Behavior Tests', () => { + test.beforeEach( async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + await settingsPage.gotoSettingsPage(); + await settingsPage.waitForPageLoad(); + await settingsPage.clickTab( 'CSS and styling control' ); + } ); + + test( 'should load theme.css by default when setting is disabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello theme.css' ); + + const isChecked = await themeCssCheckbox.isChecked(); + if ( isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello theme.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/theme.css' ), + ); + + expect( themeCssLoaded ).toBeTruthy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="theme.css"]' ); + await expect( themeCssLink ).toBeAttached(); + } ); + + test( 'should not load theme.css when setting is enabled', async ( { page, apiRequests }, testInfo ) => { + const settingsPage = new SettingsPage( page, testInfo, apiRequests ); + + const themeCssCheckbox = settingsPage.getCheckboxBySetting( 'Deregister Hello theme.css' ); + const isChecked = await themeCssCheckbox.isChecked(); + if ( ! isChecked ) { + await settingsPage.toggleSetting( 'Deregister Hello theme.css' ); + } + + const cssRequests: string[] = []; + page.on( 'request', ( request ) => { + if ( request.url().includes( '.css' ) ) { + cssRequests.push( request.url() ); + } + } ); + + await page.goto( '/' ); + + const themeCssLoaded = cssRequests.some( ( url ) => + url.includes( '/hello-theme/assets/css/theme.css' ), + ); + + expect( themeCssLoaded ).toBeFalsy(); + + const themeCssLink = page.locator( 'link[rel="stylesheet"][href*="hello-theme"][href*="theme.css"]' ); + await expect( themeCssLink ).not.toBeAttached(); + } ); +} ); From 21449861be9069e24a0d19e6f7b4be821ff2797b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 27 Aug 2025 12:33:40 +0300 Subject: [PATCH 05/43] Cherry-pick PR #524 with conflicts - manual resolution needed (#525) --- modules/admin-home/rest/admin-config.php | 92 +++++++++++++++--- .../admin/hello-theme-admin-home.test.ts | 77 +++++++++++++++ .../welcome-section-linux.png | Bin 0 -> 15182 bytes tests/wp-env/config/setup.sh | 72 ++++++++++++++ 4 files changed, 225 insertions(+), 16 deletions(-) create mode 100644 tests/playwright/tests/admin/hello-theme-admin-home.test.ts create mode 100644 tests/playwright/tests/admin/hello-theme-admin-home.test.ts-snapshots/welcome-section-linux.png create mode 100644 tests/wp-env/config/setup.sh diff --git a/modules/admin-home/rest/admin-config.php b/modules/admin-home/rest/admin-config.php index 71990873..c9d87d7c 100644 --- a/modules/admin-home/rest/admin-config.php +++ b/modules/admin-home/rest/admin-config.php @@ -6,6 +6,7 @@ exit; // Exit if accessed directly. } +use Elementor\Core\DocumentTypes\Page; use HelloTheme\Includes\Utils; use WP_REST_Server; @@ -24,9 +25,11 @@ public function register_routes() { } public function get_admin_config() { + $elementor_page_id = Utils::is_elementor_active() ? $this->ensure_elementor_page_exists() : null; + $config = $this->get_welcome_box_config( [] ); - $config = $this->get_site_parts( $config ); + $config = $this->get_site_parts( $config, $elementor_page_id ); $config = $this->get_resources( $config ); @@ -40,6 +43,57 @@ public function get_admin_config() { return rest_ensure_response( [ 'config' => $config ] ); } + private function ensure_elementor_page_exists(): int { + $existing_page = \Elementor\Core\DocumentTypes\Page::get_elementor_page(); + + if ( $existing_page ) { + return $existing_page->ID; + } + + $page_data = [ + 'post_title' => 'Hello Theme page', + 'post_content' => '', + 'post_status' => 'draft', + 'post_type' => 'page', + 'meta_input' => [ + '_elementor_edit_mode' => 'builder', + '_elementor_template_type' => 'wp-page', + ], + ]; + + $page_id = wp_insert_post( $page_data ); + + if ( is_wp_error( $page_id ) ) { + throw new \RuntimeException( 'Failed to create Elementor page: ' . esc_html( $page_id->get_error_message() ) ); + } + + if ( ! $page_id ) { + throw new \RuntimeException( 'Page creation returned invalid ID' ); + } + + wp_update_post([ + 'ID' => $page_id, + 'post_title' => 'Hello Theme #' . $page_id, + ]); + return $page_id; + } + + private function get_elementor_editor_url( ?int $page_id, string $active_tab ): string { + $active_kit_id = Utils::elementor()->kits_manager->get_active_id(); + + $url = add_query_arg( + [ + 'post' => $page_id, + 'action' => 'elementor', + 'active-tab' => $active_tab, + 'active-document' => $active_kit_id, + ], + admin_url( 'post.php' ) + ); + + return $url . '#e:run:panel/global/open'; + } + public function get_resources( array $config ) { $config['resourcesData'] = [ 'community' => [ @@ -92,7 +146,7 @@ public function get_resources( array $config ) { return $config; } - public function get_site_parts( array $config ): array { + public function get_site_parts( array $config, ?int $elementor_page_id = null ): array { $last_five_pages_query = new \WP_Query( [ 'posts_per_page' => 5, @@ -136,7 +190,7 @@ public function get_site_parts( array $config ): array { $common_parts = []; - $customizer_header_footer_url = $this->get_open_homepage_with_tab( '', [ 'autofocus[section]' => 'hello-options' ] ); + $customizer_header_footer_url = $this->get_open_homepage_with_tab( $elementor_page_id, '', null, [ 'autofocus[section]' => 'hello-options' ] ); $header_part = [ 'id' => 'header', @@ -161,8 +215,8 @@ public function get_site_parts( array $config ): array { 'icon' => 'ThemeBuilderIcon', ], ]; - $header_part['link'] = $this->get_open_homepage_with_tab( 'hello-settings-header' ); - $footer_part['link'] = $this->get_open_homepage_with_tab( 'hello-settings-footer' ); + $header_part['link'] = $this->get_open_homepage_with_tab( $elementor_page_id, 'hello-settings-header' ); + $footer_part['link'] = $this->get_open_homepage_with_tab( $elementor_page_id, 'hello-settings-footer' ); if ( Utils::has_pro() ) { $header_part = $this->update_pro_part( $header_part, 'header' ); @@ -184,7 +238,7 @@ public function get_site_parts( array $config ): array { $config['siteParts'] = apply_filters( 'hello-plus-theme/template-parts', $site_parts ); - return $this->get_quicklinks( $config ); + return $this->get_quicklinks( $config, $elementor_page_id ); } private function update_pro_part( array $part, string $location ): array { @@ -197,7 +251,7 @@ private function update_pro_part( array $part, string $location ): array { $edit_link = get_edit_post_link( $first_document_id, 'admin' ) . '&action=elementor'; } else { - $edit_link = $this->get_open_homepage_with_tab( 'hello-settings-' . $location ); + $edit_link = $this->get_open_homepage_with_tab( null, 'hello-settings-' . $location ); } $part['sublinks'] = [ [ @@ -213,30 +267,36 @@ private function update_pro_part( array $part, string $location ): array { return $part; } - public function get_open_homepage_with_tab( $action, $customizer_fallback_args = [] ): string { - if ( Utils::is_elementor_active() && method_exists( \Elementor\Core\DocumentTypes\Page::class, 'get_site_settings_url_config' ) ) { - return \Elementor\Core\DocumentTypes\Page::get_site_settings_url_config( $action )['url']; + public function get_open_homepage_with_tab( ?int $page_id, $action, $section = null, $customizer_fallback_args = [] ): string { + if ( Utils::is_elementor_active() ) { + $url = $page_id ? $this->get_elementor_editor_url( $page_id, $action ) : Page::get_site_settings_url_config( $action )['url']; + + if ( $section ) { + $url = add_query_arg( 'active-section', $section, $url ); + } + + return $url; } return add_query_arg( $customizer_fallback_args, self_admin_url( 'customize.php' ) ); } - public function get_quicklinks( $config ): array { + public function get_quicklinks( $config, ?int $elementor_page_id = null ): array { $config['quickLinks'] = [ 'site_name' => [ 'title' => __( 'Site Name', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( 'settings-site-identity', [ 'autofocus[section]' => 'title_tagline' ] ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity', null, [ 'autofocus[section]' => 'title_tagline' ] ), 'icon' => 'TextIcon', ], 'site_logo' => [ 'title' => __( 'Site Logo', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( 'settings-site-identity', [ 'autofocus[section]' => 'title_tagline' ] ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity', null, [ 'autofocus[section]' => 'title_tagline' ] ), 'icon' => 'PhotoIcon', ], 'site_favicon' => [ 'title' => __( 'Site Favicon', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( 'settings-site-identity', [ 'autofocus[section]' => 'title_tagline' ] ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity', null, [ 'autofocus[section]' => 'title_tagline' ] ), 'icon' => 'AppsIcon', ], ]; @@ -244,13 +304,13 @@ public function get_quicklinks( $config ): array { if ( Utils::is_elementor_active() ) { $config['quickLinks']['site_colors'] = [ 'title' => __( 'Site Colors', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( 'global-colors' ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'global-colors' ), 'icon' => 'BrushIcon', ]; $config['quickLinks']['site_fonts'] = [ 'title' => __( 'Site Fonts', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( 'global-typography' ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'global-typography' ), 'icon' => 'UnderlineIcon', ]; } diff --git a/tests/playwright/tests/admin/hello-theme-admin-home.test.ts b/tests/playwright/tests/admin/hello-theme-admin-home.test.ts new file mode 100644 index 00000000..7b31a422 --- /dev/null +++ b/tests/playwright/tests/admin/hello-theme-admin-home.test.ts @@ -0,0 +1,77 @@ +import { parallelTest as test } from '../../parallelTest.ts'; +import { expect } from '@playwright/test'; + +test.describe( 'Hello Theme Admin Home Page', () => { + test.beforeEach( async ( { page } ) => { + await page.goto( '/wp-admin/admin.php?page=hello-elementor' ); + } ); + + test( 'should display Welcome to Hello Theme message and take screenshot', async ( { page } ) => { + const welcomeSection = page.locator( 'text=Go Pro, Go Limitless' ).locator( '..' ).locator( '..' ); + await expect.soft( welcomeSection ).toHaveScreenshot( 'welcome-section.png' ); + } ); + + test( 'should display Quick Links section', async ( { page } ) => { + const quickLinksHeading = page.locator( 'h6:has-text("Quick Links")' ); + await expect( quickLinksHeading ).toBeVisible(); + await expect( quickLinksHeading ).toContainText( 'Quick Links' ); + const quickLinksSection = page.locator( 'text=Quick Links' ).locator( '..' ).locator( '..' ); + await expect( quickLinksSection ).toContainText( 'These quick actions will get your site airborne in a flash.' ); + const expectedQuickLinks = [ + 'Site Name', + 'Site Logo', + 'Site Favicon', + 'Site Colors', + 'Site Fonts', + ]; + for ( const linkText of expectedQuickLinks ) { + const linkElement = page.locator( `h6:has-text("${ linkText }")` ); + await expect( linkElement ).toBeVisible(); + } + } ); + + test( 'should navigate to correct pages from Quick Links', async ( { page } ) => { + const quickLinksTests = [ + { + linkText: 'Site Name', + expectedUrlPattern: /post\.php\?post=\d+&action=elementor.*active-tab=settings-site-identity/, + expectedPageSection: '.elementor-control-section_settings-site-identity', + }, + { + linkText: 'Site Logo', + expectedUrlPattern: /post\.php\?post=\d+&action=elementor.*active-tab=settings-site-identity/, + expectedPageSection: '.elementor-control-section_settings-site-identity', + }, + { + linkText: 'Site Favicon', + expectedUrlPattern: /post\.php\?post=\d+&action=elementor.*active-tab=settings-site-identity/, + expectedPageSection: '.elementor-control-section_settings-site-identity', + }, + { + linkText: 'Site Colors', + expectedUrlPattern: /post\.php\?post=\d+&action=elementor.*active-tab=global-colors/, + expectedPageSection: '.elementor-control-section_global_colors', + }, + { + linkText: 'Site Fonts', + expectedUrlPattern: /post\.php\?post=\d+&action=elementor.*active-tab=global-typography/, + expectedPageSection: '.elementor-control-section_text_style', + }, + ]; + for ( const linkTest of quickLinksTests ) { + await page.goto( '/wp-admin/admin.php?page=hello-elementor' ); + const linkElement = page.locator( `h6:has-text("${ linkTest.linkText }") a` ); + await expect( linkElement ).toBeVisible(); + + await Promise.all( [ + page.waitForURL( linkTest.expectedUrlPattern ), + linkElement.click(), + ] ); + + expect( page.url() ).toMatch( linkTest.expectedUrlPattern ); + await page.waitForSelector( '#elementor-kit-panel' ); + const location = page.locator( linkTest.expectedPageSection ); + await expect( location ).toBeVisible(); + } + } ); +} ); diff --git a/tests/playwright/tests/admin/hello-theme-admin-home.test.ts-snapshots/welcome-section-linux.png b/tests/playwright/tests/admin/hello-theme-admin-home.test.ts-snapshots/welcome-section-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa5aae52645e3eb9fd1db3bddb5dfdb7a85a052 GIT binary patch literal 15182 zcmd73XEiOEub{e{mg_tk523kwT3 z3%3JwKOxP>7caogz_EK&GgtrT#^Ate+{yj-?*8Wwf2Mcs+KZR}XQ#T;4M|8y`jf?| z&l&jmIC@7$Dt#`FZE0vzQbab^*L@a^x%BI3$mzJ?xj6+kR#x-#^WO^#In0_8Pjgaz27fgxQvG|5acSS!FxLrXl`!5#F2;yYv^Sq8^Sz zORS?#Ynz*MbsiZW2P<>s@xd|7X~HgY3y<;fLqjS0lj7sO<+_)- zBVEgfd8)#~!gv(Ei|ye?Eizi#2yc=HPo7B{7^FHdl5%nu^@cgOk4f| zq2v(frOv_5&Q94F=ES5V(!uj1B(}z!Gj zXV0Fck}{u9Hy!nD?%yV5QK<7i!z1R@sVucmYm$}@G%}jMx_;$#vh8*H3yJ+ezdd(w zxd|`M&ld1Jv{ayj&Xaf^ZH!J%>YP^YqQFMj&1_6nbL0Orgx@GSdqqq0X z&71!A9EO1(KFDw+*3EBiEiCks%uMTn7cK$Kc$NOemoHx^zJGVEs`695?M_8i@49^o zCn4w3Q*s);{^v1$p!&g-&Z%2XMn=YOHDr2>);5l@8O?7aX%j}bwY7!Q?@Z()5Ffus z$&A_6yY3X{<|@72+nPj}&_~C_1b6mqPR5s+`1||s%pfI9*Gj<#mgb$EorRKfy1KeP zd&*}$)^wRJ6?(A0-(>wVl!BW%-C@y}Tw3)Nr*0KyuY*1qCZ+dETwGi-kdT+x-q?KB z^!JaK;4@y~w|mG;)9w)~d0%(Q4hQ*ARr)}^3|(XfduqMMpjl}9zQsU5=pd~7#NGDRbTl-WZQ=isvRGMdg2myK9VRE!2zYsWH@tYL zRc+S@uTsQb-TZ8Zck5GYYwHR*IY(PND#FL|ojLH&hZX^$p`jCc4h{~E{pGG(!tcIFZ%W)!^Gxu3MRAoqc^~x?w*0b!bgaTiSUP=@kL3fF1`E4^MR8P+11= zMPgzibK=L?E`ga@pNr209MfUV=OWLmWEEwNC;^guuE4L}XbuQnO8AFEcjI8`85zO3 zz?=4Oz4aDP3)e5RUhY1u9D&8nbGNjFh28c4^r^}o8^UFai6)Ui1|cy#sW5O_3O8%F z(XB+4CC0BvM zc6Rpu5)qMKt?P_1L*2@9Z2Y~nd)V`#tWZd$%O;8in%aqsF#P)UE1yYwSp3>r5YZ(E z2gmqta@CwS9%OqwkFF3I8H`g@#!me2EY-BW%w@o={9x?|>N%v`-4}t3!-m zdCNJfXc9%n$H$)?NE}h?A+OvRCTkodr9E}Pkq00eL6ea~AqD5G;6Tu(j#hgNca=g+#stejDbv9;S2vH#_5H{^6UPUPc8PB?3?R zjQx%_1=ohFxkJgTY-iX69M8`VR)H^4Q&P*w$QUAhQ()kH^YE{S3;@?!f(S_lFL8+g zCNU1kHF?BzHVXhZG+F>~7FzVpgqlUbYO|^c!spO@OHfdgVd4FAeKFCM-UJ0mM+7al zo0CI6N0G}$qlAZtr?LV843da=LQA(q{~{?kShmsgs6Ff|3T7bHa6V~_kB{%CTMvi9 zFY5}GGo&GzIXNBa!_%^~}GAm+Nt|5YZ+5@!IUnM4Q>#mq*RX<^OxTGYSg| z3bL}))zrSGrVdtGslq2mTO`M$3iI>x;oI1&GHx$LCYm>&@^q`YE_SzPL@2M1mh`~; zk_1meUCPVLNqiOMJS8E;#VM`(e72K(%*-qL8gNneE*$cK{{EG?uXiL7S@LiW{qoN~ zgar6b4ri6H?(Xi>Q+EdI;dbT9d!(eQ405sxu@=FOJWo&OULSHq452hIen$T_o=vwo z04yBMDgVwYU^{tQwy@Y18rRTJ?BSu$$iQ9z=QZzrAmF_AKc<`U26BAtN<@D?=l34z zIsFQ~o*vcv`oqKTgHUBGpNq^WZ(vKTXM@;+@a{CV z)^2ODAVs%c>Kg_*oR=*A{{8z?F#!QMjEa()y^=1Pm6dh$t<@{h*|c-%kTL{eTs;tm-a>1+t12nIKgu5)EilMpDESzyjr64@zKw(9>8bcTw1EyD7bob1LYMBo zAMDkycVS8gVKFu~w(M(ia&m!zX0YY%m!JGi5p$mgxQkOQ&CT1}c@OJc72?+x7kRz< zlNFK#H`ms3^Ye@K5Z29~gU`|of2k-d8(j+UBlygqm-VQ-f1kMFiv-xn$Vip_6skhA zM6-lJx2n?7b$h%{eX{|B>4>CfVPc}Bq@<#v3i$lFlyX|cZF^yR+iS-lD55`gvEzWx zr7RhBO4kihRVPbq@gEyrE=G1{fr^#EWCnh@j zd~t0Ma-V|Qct3g!Ux{QdAG9)S;2yWRK9YTB;nJoPY=+ zEcc>+us}76^jL*u)zw`V10`?>=y>dBF}b-<3g8;g%AVm8(mV#-Mu452-Nwe|WOHn+ zXEU)tcU6{@#oBuR(uFyxXCzM+@~Jau^c*5@Ss{xs zJPCMrnDdU;{EeoHhEBQZdPItdb_g7fT35{(k6+nO;A7idQ5R=v|lIA)D!0}!5?;LY))-0@iIREDQ#Wg#5f@aA(# zs0H73c6(CXzt3l}t!ETSJ5{Z#TYa_gkL$dBZoG4Ud3m|5y&dE=y4utf+&sIkuCB5!77lN3ZO_im1bM{N z_;_wXL8v0xom*vPWrKsy^ti@;{rWL9q;g31d_wgvdwuch#gV<5n%YQ)4D_aC%fV{D z?@rwx>%aB`%gB#09&iH?kX`(}%%x{#N1yobe@?N>$lcHXV%zWfQ*P1k|3d#M*FB}b z7rpl6&ULcCLqB}_e|@S3^7U(Sbj*PPAEGq($)jiMCQ<=mLNTf;P6zueJl zOTEcSaTL@i=Qb33W3dN_XjPSpS+kxr305H{ZizG)7{bFdr!nv)>P&!BEJJ$p)aOZq znO09>>LUr{!)+JuaMYd%X>ob{=T^bmT0@`d%f2hJSd0vR5>-iXCF8RF0W)iDY3`bc z#y4}HQC9X%eb<$#LS&8f0tiAGCdTqT-B&BizRFTkQm>3v2sGZ5&Cy-E=EurK+?QB? z+PdzPp7-+SqebR7eQ=M<`1zMAT2Xh;O*Q}+=7O#!Tf&&q62wlv^lgA`Jn@b0q~M5=zl6Tp5ZSTJFJz?nI^G#${RJopUn{*$fOQJoUM_bzd-_9?iaS846g|L}a7 z{SvV64PCm0->;2VrFgY*N$#IcV$wMuZ_d=q4zFZpXLm{1_eE=*p_5O*vK8KVtE%Fw zpsR7O{V?31A6w=IY@@SG6=ZE~WXs%~t2>n@J@j-b`bamL>FqX z&9`n`m+$TN6twuM!WCCVt(=*BJCNTyQd!EmGb`gZW$HFy(^p!#nj-C zh|7Yw1?*bzjt>&ag~bX=MAGux0B|>uUy@(m}|iB zvltOUfnmukx5TBT$&4JwK)9}WT#3PechYE~73qM3iH?>|=^^`A1K1G*H8u3YwC{_# z+3f7_&lPI_-NGfL^`T9xdE0;2=dzCD*{1%n{iYzv;0|@Q;vr23iT&JOqvuxp1yL=4 zh!kO~hUjP#Vlz|IZ83K~VP@2LXRcvdYKopP47Ez#BjmdO#>1l)aHkzHBo4s_md_Ic zF|9lapOTZ418jF=WiWy4!M^C>NWwu^S02DO8eZ%8TJ6ORU2f#J_ggzj^tZ*WEKQ#~ zj^ER``ozTU>3Z-s&1BJFXVPo8TD_+dQK^_JzJtok2t7zcElXLRt~*gwl+Oww9DX0j ze_kiCp#vB19^LfuI(hDmUOII!q201A&|KdZLuy7TXETR4*w1pYvTn^(OqD*mS*yoI z+!zuz>$hg<{VM&XKi~z&J1g`3^Y1g4CA`t5>Sm+d5|Pa5k@OP%+NI9ZPzjyt@=3Q{ zSZeWXJsKT!J@UxeCY)BR+-FL_(T>u}Om3P7`1SF&1j&i;Y;$^okw4B{lNqdY$LNKr zbD@^Sn68_5u;o?qI`BSJQPB;$+Xl6+8AUM}mCo~Ff_7(?R@TA%iss9Sb4ddH^v|5{ z5f^D!N43mzXg?2v6?@Eil2JCg|9m&7-sIRfwc0Pnu(7bstkcQAqdO~TUyz^gva@j| zEdDdg#LG*BI+*i7_Sf*R1^2zd!wGy14*lH1bnmvFsgqPgfWf*fG6RO~`2~5wqr2Vw zJ0Cu<*hfciZN2k6TC=tpPNb#M^GP0(UQg`CN_Dr*fTL@;YQNJ*r>R6TiqZfP-_pBD}$P;+0kX3!STlg$3SKF0uc7bquZs`%#{2zv=H1 zTvc*ONwxXCn=LNRu6nzDmx+mKBByT`rU@QVyqFJOz1HKLOuNatVW(-W0yvzcglDM# zLC%0a2RHYak|xr9c{1vMt+e#~`_d{lx3IF%BCa!d0uzgW*-Ki9kE2D8=P-V-UM zhRh0pwLK6%#bsplUoIG%Il;eIG$aU*Nlf(J=)H~o(4jxAzqm-s0!{Neo@P4fPqE%y zFS;<{^%7bFDAN$oQ$w>2HIXJKBM(n{s<1GnP`z`?%)}B&^{g^C*Zpk6rO;k_ci4j7 z(MdZnJ$)gLI0_{4koz?I9K4$;Yv})i?ac=aqm!dIwo$CRvb+94X&S0JeLxhu;h)N- zSEnK)lVg`MN#bT{zM@;QDadWuIGdwMlp{cRK}1`RURHp}%Cf3j^cQ4h@cQ+Kp^6Go z_T$}lujKpEk`t4oySobu^F1kvwUv}Q>GsjHZcl}nTzYfo5!RzR4ew%G<0K#dfhUbQ zo-8x7VRO#i1HYw>p}m%%=@^TCzYF-IbXn5&t?BcQNXEbr=Iku9N;|WxLd^QMzifuI zgTo%rP{0lUSIq{}ul2qJ2A-$XpG*+(%w71p?TEeQPClJIS={4;Xr3jW6xoU#v#}S9 zPiWDLd%ilwTR5Vw7PO!G6NiB9Q&*#R>wFLNT_Y;tR+g4;jRwPDqSG@YqodFi@g1LG zixJp&un)kt#JsMewT`wgZoiu<8*6QK-)}YC$Hzlml_j`*c%z^o;k?x9BY~yIIm|08 zoUSt2Ny;>(jJ?k^V1zI_h;X7P38N8kZ$2%1_ROJTh12|}t*LYGIf3rZtk+wcDV>M+ zIJC+!@Bw{6O$$NII7u1BcXJ5nJ8h7H$;Xv=P!bDyEkBtQ)UV{NU6 zpxvC=fwWZHt=mEI35jy-nS~7)GsqIAt*5V#%FV%z0FQ72aq`eB*leTljFmMnMzjMY zSAQ08awTbnh(&#na&feSLg3_mx>^F<+}vq=K8h-i-G%F_IG4Y6MiTI++_uaf<+eIM z`uL*s_(UPkYCVSKYN&b07KBEkHFkD+lw=ffW(1Nz zwMmGwT3a*6$M%flzH?XUmSGI1D~vfmXT6)M)kNB**y+#Q^iSQMaMMcdVIp2$SvfzG z&_O!bSd1yIn1`1b)H`e*>suWF6}G-sc&_o}_ezn7w{KUSM3tJl`ozSf8gfO$4Kp&a zRezkoZzpQ{>jTTrN2=KaMTLd$MoNuZbK=O!3{F` zLLHs*>SV(XmV1M-1+!oQc_z4r&Mv`gmls5Ue*t{e^IzU|rxK~Q8~LR)HZn2|V5`?E zM!44bwRg;6#p+1r(tRFmYCd#yB zWv$*~n`S(*zkP;fPEQr-D7ZX`2fG+AMn}|ei8kg6=I+6{yzqOI#ELW{?aJk^T)HsX z3cbNk1O;~hANI#N6!V(riOeYju?55@VB6Z-JBlf_zxU3pB#$sWcw@t(`i9_A^YRQ#2Fr6qMINIakZQIalF2??i3RpV`JK*78jj3**g8^6k#OUQh!1R zXynk)gpbAq4SLINwn=>hFQUcI84S{TBm0Dz$+F2Ox>(mS_gB2pZkOQ%Zh$cQH< zbp~{6!W4wP4^2;sx1B5$7#TJ-I4L-Fk688PdMYc*ny^2R(2{MmTRvcj#ro6FX%tDF zDv0PE+wwK_^hAxv-?}O#@$nodi!Qo&-i zRr=VdjhnUBYv(6;`sXKGQjlzBX40H~JUl{&?OzcAVk{A8RZUf|D+V-hX!`=Vi{&Z= zVx6B~e@q8#MjDt{%|l;VfQ9W6k(6e3=H01YqIcb=>n#MW`m$w!GDt+r&c%fq8S%dV zATy_6sykomSsHiQy{bEaeM{e^?iH^XTcr~{1d^aorF~9qf>oNq%rGxci=p%gYB*MF z>O%+gF$$tK#+6dNJw7~{AK+rco>qTSQQ?Hznd)L|dDOq{gX?$ZaX9>if@C-#U}>o# z(kta@*MS9*nCkVy*aItdE z01F(Fa?tZHi=+1yL!snFRk_WRy{}A*N+k7n zeadD+mgA~ACK8G~@nvNdNNwQ&VGFf=_Z(RdJ0{gNI5~svZb%%*b%E$;+PgWw?Yi?3 z3)b1v%;5{}bN)w%@U?{J&6fo*8EZx1s!h-91(KVFr z;p_Xdvw{MDrT;5DLF_Z`wbPul`%1xL&c-!zX{m-2zT1nMC8^?@XAke@;^E@61E#*%!R95xAw6B79xzYMXzcyq9#Fo7%Sk8^f* z8*-oYB(Y<-=KUU<{6G(P?v?Hmbx)Zk>W!pi3hdC?hBzuEg`apGmEY#e2e1qz7d(Qz zKtfx~A=6YRoqa+!it37T*-%ndb+KODMVK5)NlR7RPX)Rh{94-6skZJKGPA!9+|!UF zK}rU_8kL64*x%nD+uO6HK?mq76&C8;!Vx2zB`!=gl%5CalbWU`3xf+kKlP>th!&#< z-iz>HuaqB)R$4lICWa}K;}x8{Te{hG(a}R8A=nwpWyf02x;i~V868ih_jjll*_oL5 zC6K>E;sl8k5)wdmLt<_oB<=hLU6A_#OvB^sjJPBnEF`$I?g(2qva+(Wys|7LG+9wn z1i+67eM)jwWodSlXVf{t6GT8+<1tk{C;@fe1{G#qnZdN4H^9zY7!7E}e1*jr4<-(j z7=RS(9Aar?_0#tTDnCmSa{Kn}AvWz4bW6ynY7Lh{FEwdY>7Ki@tJx*VA}Ps)e@$nn zrNAN6CYKrN)bDz16&%&gi}5&s~WOq zP%vJgrh{hetu{}P1|J^2v087YJUZH}b8(yn1bmU@=hjr!`uMEub7O|hNpi{(b< z9?{JkC$yr`se35w0Atj<*{V<&&f#XC@b&JA=QH~H@DhW#s3=()#aG5d& z#QZkaT;vMG%Ahv(MuDo)lPoJe9k|+ET1-pKx121q76WNW1dV`}D*;n#d6WB-|GI|l zq-3Wm(yyz#a7xho935_!o3mnqyM+9LPwSq%LK`vNrj(A9HUKE}zQDUkndS zxa~N?Uc0XXo0go!fZPV6CX-2|ZYGr#U9MteL`*z7go=7T_WR={w_cs+WxK5_y_x`- z*PE z=clWvs4&1^9(Oi_8>QrC*pJFTK99b+X{)8Id^RtcS`?0Ws$c08(26lW zx__CkyXkk)h*^{g9vq{n4%12)&DlWZGu_1kfnYqyewv45G*4C6`ToVHPtD8OJQ# z#>$XBiIAW*1d2wXiOZiLt5!x zg_FFL)NPyex;g|1P)x27Y%2#r5tv{pImL)$^|Z9E*ERxyfjFEToOEJ@`GzG1b_S{S z1)*WD9?Va1Bo7ch#>c~Rwi#W(oSkJ>PRbPo^94vr9UUG85J>=C00u(9Yk7(kx2t4I z*D4hBQ|h+Zd()kdj7fqRa~8+U9wh!_9n9v&Zy>viRNA0M8We5CTrWNh4v)Gxm)0*V z&wx|B<{^H#Z=VV!k|STvQKsF}~65=nH<%oQt=#;ZzrcJ)TUmeN%ZlUEEJR^!-PkeS)K zXtjIBWIbwt{FzT&m1h(J3hvE*+^L%5}Mam!et>Bv4fu&W5IR_Fn)6G(kHAGfWiFGx$qs zb&oIXE`fz&Qmaa_-hn`_A<|RPRWn*YEG;O|#nr`#HtlnZ{9~q^POUFdQAVddnrJ6= zb#+TEcWT@V`?(vG3HCsA9lyL<{XTzw?&2Xz0Gd#gqT<-oGfcv%seGvFBvpKwxT?Pl zSR|;bV4bVAYE(ej{BAUFm-5(|JF3Ra^eb!ouWvtT=Pm#|qtB!*$K~M$sQPngbztDs?3fD`Qe6}ao=tvb_DJi?)xNKFOp1Gy%fl?l+P9`zy?YSxo@^9RVn7N?YvTc** zifWKPI-KxtYHIWqphCk6Jy-K}9!&CqdocMr&EZr(d3 zIu{-F)>xi`?Cz*+pzjjV;Y{!E^>ur?p_dYDMOqCh%$u7Tf%*4$dHBsoQ=}OVH5Q0~ zpfef}pj4a9t%c9l9;2YETgKh*nzh#pLY1CzoA?Q@#-(<<}y*;Vbr;+db! z`cF&X-EY!)1LD*qK&%pNz=-}5Q(?&+%dBp(SftjUV z2F;n9rPRAKJ$lyFHTY7xE*ZV`Zd{ipTtOjG&_)gd+`{iwg_Us4gIJ^i8>W8%jx+%+*Le53Pjf<#$KG#sI=VB@NIse$Scs!wpqH*{3PW zL2_`lnubtDUOr}Eb#;}ZAp$yH=9RYl>?>r5?F_-enYg|=Cgyad(tkk&s3p+^vtzSvAg2Q*FCN1R&%nOpiqkbADMEN@%|ut1gJ zp+D8BTKvyvF3y#~Yb`+yKXF|-!h!X|+GiXwZeu|+q zq$vz$dZL}FZ`QOC_GqL$fN2wBHQKDApfK9sF1+pXYDyptr7TTQkX8iFPh;`0R8N_bC`atm>;FhX!&j8 z%jd>x$+zW!LYxlLOQd~C!I<406HTKXs;WFM*ArMs#F_0S^YK%q2ML|32cSX<lzWd|?%8J9S{mM<~*3VAm!rb}(Z71!fC-qzX{9O3v=!=pQM z545MmWcL}(qyd$qj3-Com}5$%y-FP^E@onESn)+xr>D|-;#0?P{8Ka3L`;w`6|dvg zxk83tYNsozvWv8JL%@7w7gPmC?0?;rBet?yA%3+nOt9oI<+T;PhLhDT|iIV(}P z333H7f^34SG~Ph0E>+YiwPhX%Gd}&jc}Z2uE_rL8R|r;{PQ&=UO$jsmiOi5&hI{OeLEm9KmLeB*IZlML)(K=J});H z=0#hQlVkDg#ePXtNJz-n5k4S5vUPU@N(dzBa<8M;g_$?RHPk@inw6cMnv$yXIWhQO zPG)v~ZZ4m-DaY2sZqK+Pz^jGHK(hxpSqf(^n($VCq_T&;&1D{PcSPihyS9ep7W0 zjpKK&H(!(OcWe@nz|Z~6{RneYc8Ukf1#sy<{K$B5mrr&@IxLDQ_=Fy=N6oAg68YDz z&eGFOfIL7a58Ad@YAOH5-U|&v` zzZQ)@w~1xJV{-JzS>Z zcGwCab8*=)^L~xo>n$jbxI+8li@vL?kbPMeS*EAlMA+Zv*#V^DWBv~fY~7Pgt_ zj97o9m;U16bI+Y0XB`&%XJ;uob({}s)HGG0g&J-xc7~pg#r8?`t~1l;T-*f(wxB-l ztE#NQlwMt%z~0Yw99ol8^qsf#@>hb-N?t+!PHiJ2rZ2QHCgR?pZ`zFbcR@l$vF|zR zB7A#ii3do!MA!0jhQF))jZI4QdqsA>(w6TeZ)nlpzafIGa!pCAigZu7FAaHSrR?v! zlhL|->_p|xx;wq$)MLOLM5?^rG4#8J#iWW*-u+^-JJUrh1F<8%BatbffY(e^&GX8+89}?yVayk04x{!9JG5m7LIU83t4Bs>9DW6gygiNY9p}M(1I!#6Wu|N3lV}P#~O&5ysF#5fJkGifjI4ZhDW^p z5J|(ka^a8DBhp$j3E}-5-;4uTkn%cS4ot)V81D@x72XQI9$STmGM|(f>*{pRobV%!m4c#-R#|?L%+zg$3{^UoZrcz zaXwEtSe+Bc5@DVq$4)lO%G&B}L-?n+A!>%z*Dvy03XWJCGe5xcZ>hIsNpYCHS#@AO zqLMGH9a{Yo*>W~A_AD*ULTd_kab{zt&O}^RqW`WAw@q9_Q`yaSd3H8^F}q;%W;zDe znWyb_`+uf*0;Z@%OqD|B`z1&QGaDs>n8p1P?$_<3qj8Cw7VF;pe*c_9 z^8IwoFi~XAN@k%@bwh4tZhXWgRM}cl&TcTs z-|a*+;&?TVOjAw$IiEv*K?ZWb!s7g*Qbw8R#BAdQkFWnlmdbF&m)z&yt5Y zy04<>@ZLT9Ya6Ffm8JjGJIGV2BIiIO<8-}IwRZPsJ5|UWM>(He?Z)&_`Va%B3+H_4 zdW*jAn{K&jXVCsrusNmeT*>REq^WGN_yR`0J=xtDqrO@;6-XN8Vls7Gg5&aXKan7A zjEm}U^CN4A-!xCW%NMff~lc%#rv6e7zpIPl>GQ!(A?ZxZKqiC)!;yH)R1@niMPPO@5RaBKLtVilReVK}* zJ^YzRhnF+6ibp3$G$O+OZrC-f>H#(=pB$RsZ|N4~ZS>HW5K;ew-0hc~p%5NX9AALVlvtJ=IH>=hm%G3(-R-#s304 z=JxX&A3wm@B<`@4%PO&+&K{jX=l7rIx6?pW|6UHOp7uZVsm*~ Date: Thu, 4 Sep 2025 15:05:16 +0200 Subject: [PATCH 06/43] Clone release preparation --- .../actions/build-theme-release/action.yml | 72 ++++ .../bump-theme-version-release/action.yml | 164 ++++++++ .../action.yml | 40 ++ .../create-theme-release-release/action.yml | 68 ++++ .../action.yml | 33 ++ .../install-dependencies-release/action.yml | 49 +++ .../action.yml | 144 +++++++ .../action.yml | 249 +++++++++++++ .github/config/release.json | 37 ++ .../generate-upload-instructions-release.sh | 69 ++++ .../get-changelog-from-readme-release.js | 88 +++++ .github/scripts/validate-versions-release.sh | 70 ++++ .github/workflows/release-preparation.yml | 350 ++++++++++++++++++ 13 files changed, 1433 insertions(+) create mode 100644 .github/actions/build-theme-release/action.yml create mode 100644 .github/actions/bump-theme-version-release/action.yml create mode 100644 .github/actions/create-pr-with-bumped-theme-version-release/action.yml create mode 100644 .github/actions/create-theme-release-release/action.yml create mode 100644 .github/actions/get-changelog-from-readme-release/action.yml create mode 100644 .github/actions/install-dependencies-release/action.yml create mode 100644 .github/actions/theme-slack-notification-release/action.yml create mode 100644 .github/actions/update-main-branch-version-release/action.yml create mode 100644 .github/config/release.json create mode 100755 .github/scripts/generate-upload-instructions-release.sh create mode 100644 .github/scripts/get-changelog-from-readme-release.js create mode 100755 .github/scripts/validate-versions-release.sh create mode 100644 .github/workflows/release-preparation.yml diff --git a/.github/actions/build-theme-release/action.yml b/.github/actions/build-theme-release/action.yml new file mode 100644 index 00000000..3329bb5c --- /dev/null +++ b/.github/actions/build-theme-release/action.yml @@ -0,0 +1,72 @@ +name: 'Build Theme (Release)' +description: 'Build Hello Elementor theme with specified version using Hello Commerce approach' + +inputs: + PACKAGE_VERSION: + description: 'The package version to build (e.g. 3.4.4)' + required: true + BUILD_SCRIPT_PATH: + description: 'Path to build script' + required: false + default: "npm run package:zip" + +runs: + using: "composite" + steps: + - name: Install npm dependencies + shell: bash + run: | + export PUPPETEER_SKIP_DOWNLOAD=true + export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 + npm ci + + - name: Install composer dependencies + shell: bash + run: | + composer install --no-dev --no-scripts --optimize-autoloader + + - name: Set package version + shell: bash + env: + PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} + run: | + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $GITHUB_ENV + echo "Building Hello Elementor theme version: ${PACKAGE_VERSION}" + + - name: Build theme + shell: bash + run: | + if [[ "${{ inputs.BUILD_SCRIPT_PATH }}" == npm* ]]; then + ${{ inputs.BUILD_SCRIPT_PATH }} + else + bash "${{ inputs.BUILD_SCRIPT_PATH }}" + fi + + - name: Create theme build directory + shell: bash + run: | + mkdir -p /tmp/hello-elementor-builds + + - name: Package theme + shell: bash + env: + PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} + run: | + # Create zip file with proper naming (hello-elementor instead of hello-theme) + zip -r "/tmp/hello-elementor-builds/hello-elementor-${PACKAGE_VERSION}.zip" . \ + -x "node_modules/*" "test-results/*" "tests/*" ".git/*" "*.zip" \ + "playwright-report/*" ".wp-env.json.*" ".wp-env" + + - name: Move build to workspace + shell: bash + env: + PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} + run: | + mv "/tmp/hello-elementor-builds/hello-elementor-${PACKAGE_VERSION}.zip" \ + "./hello-elementor-${PACKAGE_VERSION}.zip" + + echo "✅ Hello Elementor theme build complete: hello-elementor-${PACKAGE_VERSION}.zip" + ls -la hello-elementor-*.zip + + # Set build path for downstream actions + echo "BUILD_ZIP_PATH=hello-elementor-${PACKAGE_VERSION}.zip" >> $GITHUB_ENV diff --git a/.github/actions/bump-theme-version-release/action.yml b/.github/actions/bump-theme-version-release/action.yml new file mode 100644 index 00000000..a39f70ea --- /dev/null +++ b/.github/actions/bump-theme-version-release/action.yml @@ -0,0 +1,164 @@ +name: 'Bump Theme Version (Release)' +description: 'Updates version across all Hello Elementor theme files including SCSS' + +inputs: + CLEAN_PACKAGE_VERSION: + required: true + description: 'Current clean version (without v prefix)' + VERSION_TYPE: + required: true + description: 'Version bump type (current|patch|minor|major)' + +runs: + using: 'composite' + steps: + - name: Calculate new version + shell: bash + run: | + CURRENT_VERSION="${{ inputs.CLEAN_PACKAGE_VERSION }}" + IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" + + case "${{ inputs.VERSION_TYPE }}" in + "current") + # Keep version as-is for first release + NEW_VERSION="$CURRENT_VERSION" + ;; + "major") + NEW_MAJOR=$((MAJOR + 1)) + NEW_VERSION="$NEW_MAJOR.0.0" + ;; + "minor") + NEW_MINOR=$((MINOR + 1)) + NEW_VERSION="$MAJOR.$NEW_MINOR.0" + ;; + "patch") + NEW_PATCH=$((PATCH + 1)) + NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" + ;; + esac + + echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV + echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV + echo "Version will be: $CURRENT_VERSION → $NEW_VERSION" + + - name: Update functions.php version + shell: bash + run: | + sed -i.bak "s/define( 'HELLO_ELEMENTOR_VERSION', '[^']*' );/define( 'HELLO_ELEMENTOR_VERSION', '$NEW_VERSION' );/" functions.php + rm functions.php.bak + # Verify functions.php was actually updated + if ! grep -q "HELLO_ELEMENTOR_VERSION.*$NEW_VERSION" functions.php; then + echo "Error: Failed to update version in functions.php" + exit 1 + fi + echo "✅ Updated functions.php HELLO_ELEMENTOR_VERSION to $NEW_VERSION" + + - name: Update package.json version + shell: bash + run: | + if [ "$NEW_VERSION" = "$CURRENT_VERSION" ]; then + echo "Version unchanged ($CURRENT_VERSION), skipping npm version bump." + else + npm version --no-git-tag-version $NEW_VERSION + fi + + - name: Update style.css version + shell: bash + run: | + sed -i.bak "s/Version: .*/Version: $NEW_VERSION/" style.css + rm style.css.bak + # Verify style.css was actually updated + if ! grep -q "Version: $NEW_VERSION" style.css; then + echo "Error: Failed to update version in style.css" + echo "Current content:" + grep -A2 -B2 "Version:" style.css || echo "No Version: field found" + exit 1 + fi + echo "✅ Updated style.css Version to $NEW_VERSION" + + - name: Update assets/scss/style.scss version (Hello Theme specific) + shell: bash + run: | + if [ -f "assets/scss/style.scss" ]; then + sed -i.bak -e "s/Version: .*/Version: $NEW_VERSION/" -e "s/Stable tag: .*/Stable tag: $NEW_VERSION/" assets/scss/style.scss + rm assets/scss/style.scss.bak + + # Verify that SCSS file was updated + VALIDATION_PASSED=true + + # Check Version field + if grep -q "Version:" assets/scss/style.scss; then + if ! grep -q "Version: $NEW_VERSION" assets/scss/style.scss; then + echo "Error: Failed to update Version in assets/scss/style.scss" + VALIDATION_PASSED=false + else + echo "✅ Updated assets/scss/style.scss Version to $NEW_VERSION" + fi + else + echo "ℹ️ No 'Version:' field found in assets/scss/style.scss" + fi + + # Check Stable tag field + if grep -q "Stable tag:" assets/scss/style.scss; then + if ! grep -q "Stable tag: $NEW_VERSION" assets/scss/style.scss; then + echo "Error: Failed to update Stable tag in assets/scss/style.scss" + VALIDATION_PASSED=false + else + echo "✅ Updated assets/scss/style.scss Stable tag to $NEW_VERSION" + fi + else + echo "ℹ️ No 'Stable tag:' field found in assets/scss/style.scss" + fi + + if [ "$VALIDATION_PASSED" = "false" ]; then + echo "❌ assets/scss/style.scss version update failed" + exit 1 + fi + else + echo "ℹ️ No assets/scss/style.scss file found, skipping SCSS version update" + fi + + - name: Update readme.txt stable tag and version + shell: bash + run: | + # Update fields that exist in the file + sed -i.bak -e "s/^Stable tag: .*/Stable tag: $NEW_VERSION/" -e "s/^Version: .*/Version: $NEW_VERSION/" readme.txt + rm readme.txt.bak + + # Verify that fields were updated (check each field independently) + VALIDATION_PASSED=true + + # Check if Stable tag field exists and was updated + if grep -q "^Stable tag:" readme.txt; then + if ! grep -q "^Stable tag: $NEW_VERSION" readme.txt; then + echo "Error: Found 'Stable tag:' field but failed to update it to $NEW_VERSION" + VALIDATION_PASSED=false + else + echo "✅ Updated readme.txt Stable tag to $NEW_VERSION" + fi + else + echo "ℹ️ No 'Stable tag:' field found in readme.txt" + fi + + # Check if Version field exists and was updated + if grep -q "^Version:" readme.txt; then + if ! grep -q "^Version: $NEW_VERSION" readme.txt; then + echo "Error: Found 'Version:' field but failed to update it to $NEW_VERSION" + VALIDATION_PASSED=false + else + echo "✅ Updated readme.txt Version to $NEW_VERSION" + fi + else + echo "ℹ️ No 'Version:' field found in readme.txt" + fi + + if [ "$VALIDATION_PASSED" = "false" ]; then + echo "❌ readme.txt version update failed" + exit 1 + fi + + echo "✅ readme.txt version update completed successfully" + + - name: Set PACKAGE_VERSION from NEW_VERSION + shell: bash + run: echo "PACKAGE_VERSION=$NEW_VERSION" >> $GITHUB_ENV diff --git a/.github/actions/create-pr-with-bumped-theme-version-release/action.yml b/.github/actions/create-pr-with-bumped-theme-version-release/action.yml new file mode 100644 index 00000000..6d69ebfb --- /dev/null +++ b/.github/actions/create-pr-with-bumped-theme-version-release/action.yml @@ -0,0 +1,40 @@ +name: 'Create PR With Bumped Theme Version (Release)' +description: 'Creates a pull request with the bumped Hello Elementor theme version' + +inputs: + base_branch: + required: true + description: 'The base branch for the PR' + package_version: + required: true + description: 'The new package version' + token: + required: true + description: 'GitHub token for authentication' + +runs: + using: 'composite' + steps: + - name: Configure Git + shell: bash + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ inputs.token }} + commit-message: "chore: bump Hello Elementor version to v${{ inputs.package_version }}" + branch: release/v${{ inputs.package_version }} + title: "Release Hello Elementor v${{ inputs.package_version }}" + body: "Automated PR to bump Hello Elementor version for release." + base: ${{ inputs.base_branch }} + add-paths: | + package.json + package-lock.json + functions.php + style.css + theme.json + readme.txt + assets/scss/style.scss diff --git a/.github/actions/create-theme-release-release/action.yml b/.github/actions/create-theme-release-release/action.yml new file mode 100644 index 00000000..dd70aae7 --- /dev/null +++ b/.github/actions/create-theme-release-release/action.yml @@ -0,0 +1,68 @@ +name: 'Create Theme Release (Release)' +description: 'Create GitHub release for Hello Elementor theme' +inputs: + PACKAGE_VERSION: + required: true + description: 'Release version' + BUILD_ZIP_PATH: + required: true + description: 'Path to theme zip file' + CHANGELOG_FILE: + required: true + description: 'Path to changelog file' + PRE_RELEASE: + required: false + default: 'false' + description: 'Is this a pre-release?' + GITHUB_TOKEN: + required: true + description: 'GitHub token for creating releases' + +outputs: + RELEASE_URL: + description: 'URL of the created GitHub release' + value: ${{ steps.create-release.outputs.html_url }} + +runs: + using: 'composite' + steps: + - name: Verify files exist + shell: bash + run: | + if [ ! -f "${{ inputs.BUILD_ZIP_PATH }}" ]; then + echo "Error: Build zip file not found: ${{ inputs.BUILD_ZIP_PATH }}" + exit 1 + fi + + if [ ! -f "${{ inputs.CHANGELOG_FILE }}" ]; then + echo "Error: Changelog file not found: ${{ inputs.CHANGELOG_FILE }}" + exit 1 + fi + + echo "✅ Build zip: ${{ inputs.BUILD_ZIP_PATH }}" + echo "✅ Changelog: ${{ inputs.CHANGELOG_FILE }}" + + - name: Create GitHub release + id: create-release + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{ inputs.PACKAGE_VERSION }} + name: Hello Elementor v${{ inputs.PACKAGE_VERSION }} + files: | + ${{ inputs.BUILD_ZIP_PATH }} + ${{ inputs.CHANGELOG_FILE }} + body_path: ${{ inputs.CHANGELOG_FILE }} + prerelease: ${{ inputs.PRE_RELEASE }} + token: ${{ inputs.GITHUB_TOKEN }} + generate_release_notes: false + + - name: Release summary + shell: bash + run: | + echo "🚀 **Release Created Successfully!**" + echo "📋 **Release Details:**" + echo " - Version: v${{ inputs.PACKAGE_VERSION }}" + echo " - Pre-release: ${{ inputs.PRE_RELEASE }}" + echo " - Build file: ${{ inputs.BUILD_ZIP_PATH }}" + echo " - Release URL: ${{ steps.create-release.outputs.html_url }}" + echo "RELEASE_URL=${{ steps.create-release.outputs.html_url }}" >> $GITHUB_ENV diff --git a/.github/actions/get-changelog-from-readme-release/action.yml b/.github/actions/get-changelog-from-readme-release/action.yml new file mode 100644 index 00000000..fd912cc4 --- /dev/null +++ b/.github/actions/get-changelog-from-readme-release/action.yml @@ -0,0 +1,33 @@ +name: 'Get changelog from readme.txt (Release)' +description: 'Get changelog from readme.txt file - Hello Elementor release validation' + +inputs: + VERSION: + description: 'Theme Version' + required: true + +outputs: + CHANGELOG_FILE: + description: 'Path to the extracted changelog file' + value: temp-changelog-from-readme.txt + +runs: + using: "composite" + steps: + - name: Extract changelog from readme.txt + shell: bash + env: + VERSION: ${{ inputs.VERSION }} + run: | + node ./.github/scripts/get-changelog-from-readme-release.js + + - name: Verify changelog file + shell: bash + run: | + if [ ! -f "temp-changelog-from-readme.txt" ]; then + echo "Error: Failed to create changelog file" + exit 1 + fi + + echo "✅ Changelog extracted successfully for version ${{ inputs.VERSION }}" + echo "CHANGELOG_FILE=temp-changelog-from-readme.txt" >> $GITHUB_ENV diff --git a/.github/actions/install-dependencies-release/action.yml b/.github/actions/install-dependencies-release/action.yml new file mode 100644 index 00000000..b92df46b --- /dev/null +++ b/.github/actions/install-dependencies-release/action.yml @@ -0,0 +1,49 @@ +name: 'Install Dependencies for Hello Elementor (Release)' +description: 'Install PHP, Composer, and npm dependencies for release workflow' +inputs: + DEVOPS_TOKEN: + description: 'GitHub token for Composer authentication' + required: true + CLOUD_DEVOPS_TOKEN: + description: 'npm registry access token' + required: true +runs: + using: 'composite' + steps: + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + + - name: OAuth Composer Authentication + shell: bash + run: composer config -g github-oauth.github.com ${{ inputs.DEVOPS_TOKEN }} + + - name: Install Composer dependencies (cache) + uses: ramsey/composer-install@v2 + with: + custom-cache-key: cache-${{ hashFiles('composer.lock') }} + + - name: Install Composer dependencies (production) + shell: bash + run: composer install --no-dev + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.x' + registry-url: 'https://npm.pkg.github.com' + scope: '@elementor' + cache: 'npm' + + - name: Install npm dependencies + shell: bash + run: | + if npm ci; then + echo "✅ npm ci succeeded" + else + echo "⚠️ npm ci failed, falling back to npm install --legacy-peer-deps" + npm install --legacy-peer-deps + fi + env: + NODE_AUTH_TOKEN: ${{ inputs.CLOUD_DEVOPS_TOKEN }} diff --git a/.github/actions/theme-slack-notification-release/action.yml b/.github/actions/theme-slack-notification-release/action.yml new file mode 100644 index 00000000..a599ccbf --- /dev/null +++ b/.github/actions/theme-slack-notification-release/action.yml @@ -0,0 +1,144 @@ +name: 'Theme Slack Notification (Release)' +description: 'Send Slack notification for Hello Elementor release' +inputs: + SLACK_BOT_TOKEN: + required: true + description: 'Slack bot token' + PACKAGE_VERSION: + required: true + description: 'Release version' + BUILD_ZIP_PATH: + required: true + description: 'Path to theme zip file' + GITHUB_RELEASE_URL: + required: true + description: 'GitHub release URL' + SLACK_CHANNEL: + required: false + default: '#general' + description: 'Slack channel to send notification to' + WPORG_DEPLOYMENT_STATUS: + required: false + default: 'skipped' + description: 'WordPress.org deployment status (deployed|skipped|disabled)' + +runs: + using: 'composite' + steps: + - name: Prepare deployment message + id: deployment-message + shell: bash + run: | + case "${{ inputs.WPORG_DEPLOYMENT_STATUS }}" in + "deployed") + MESSAGE="📦 *WordPress.org Deployment*\\n• ✅ Automatically deployed to WordPress.org\\n• Theme available at: https://wordpress.org/themes/hello-elementor/\\n• No manual upload required! 🎉" + ;; + "disabled") + MESSAGE="📦 *WordPress.org Deployment*\\n• ⚠️ Disabled in configuration\\n• Manual upload required to WordPress.org\\n• Download zip from GitHub release below" + ;; + *) + MESSAGE="📦 *WordPress.org Deployment*\\n• ⚠️ Skipped (deploy_to_wporg: false)\\n• Manual upload required to WordPress.org\\n• Download zip from GitHub release below" + ;; + esac + echo "DEPLOYMENT_MESSAGE=$MESSAGE" >> $GITHUB_ENV + + - name: Get file info + id: file-info + shell: bash + run: | + if [ -f "${{ inputs.BUILD_ZIP_PATH }}" ]; then + FILE_SIZE=$(stat -c%s "${{ inputs.BUILD_ZIP_PATH }}" 2>/dev/null || stat -f%z "${{ inputs.BUILD_ZIP_PATH }}") + FILE_SIZE_MB=$(echo "scale=2; $FILE_SIZE / 1024 / 1024" | bc -l 2>/dev/null || echo "$((FILE_SIZE / 1024 / 1024)).0") + echo "FILE_SIZE=$FILE_SIZE" >> $GITHUB_ENV + echo "FILE_SIZE_MB=${FILE_SIZE_MB}MB" >> $GITHUB_ENV + else + echo "FILE_SIZE_MB=Unknown" >> $GITHUB_ENV + fi + + - name: Post to Slack + uses: slackapi/slack-github-action@v1.23.0 + with: + channel-id: ${{ inputs.SLACK_CHANNEL }} + payload: | + { + "blocks": [ + { + "type": "header", + "text": { + "type": "plain_text", + "text": "🚀 Hello Elementor v${{ inputs.PACKAGE_VERSION }} Released!" + } + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Hello Elementor theme* has been successfully released and is ready for distribution." + } + }, + { + "type": "section", + "fields": [ + { + "type": "mrkdwn", + "text": "*Version:*\nv${{ inputs.PACKAGE_VERSION }}" + }, + { + "type": "mrkdwn", + "text": "*Package Size:*\n${{ env.FILE_SIZE_MB }}" + } + ] + }, + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "${{ env.DEPLOYMENT_MESSAGE }}" + } + }, + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "📥 Download Release" + }, + "url": "${{ inputs.GITHUB_RELEASE_URL }}", + "style": "primary" + } + ] + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": "Build: ${{ inputs.BUILD_ZIP_PATH }}" + } + ] + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ inputs.SLACK_BOT_TOKEN }} + + - name: Notification summary + shell: bash + run: | + echo "📢 Slack notification sent!" + echo " - Channel: ${{ inputs.SLACK_CHANNEL }}" + echo " - Version: v${{ inputs.PACKAGE_VERSION }}" + echo " - Release: ${{ inputs.GITHUB_RELEASE_URL }}" + case "${{ inputs.WPORG_DEPLOYMENT_STATUS }}" in + "deployed") + echo " - WordPress.org: ✅ Automatically deployed" + ;; + "disabled") + echo " - WordPress.org: ⚠️ Disabled in configuration" + ;; + *) + echo " - WordPress.org: ⚠️ Skipped (deploy_to_wporg: false)" + ;; + esac diff --git a/.github/actions/update-main-branch-version-release/action.yml b/.github/actions/update-main-branch-version-release/action.yml new file mode 100644 index 00000000..2d5558cb --- /dev/null +++ b/.github/actions/update-main-branch-version-release/action.yml @@ -0,0 +1,249 @@ +name: 'Update Main Branch Version (Release)' +description: 'Updates main branch version only if new version is greater than current main version (Hello Elementor)' + +inputs: + new_version: + required: true + description: 'The new version to potentially update to' + token: + required: true + description: 'GitHub token for authentication' + +runs: + using: 'composite' + steps: + - name: Auto-detect default branch + shell: bash + run: | + # Auto-detect the default branch (supports both 'master' and 'main') + DEFAULT_BRANCH="" + + # Check if main exists, then master, then fallback + if git ls-remote --heads origin main | grep -q "refs/heads/main"; then + DEFAULT_BRANCH="main" + elif git ls-remote --heads origin master | grep -q "refs/heads/master"; then + DEFAULT_BRANCH="main" + else + # Use git symbolic-ref to get the actual default branch + DEFAULT_BRANCH=$(git ls-remote --symref origin HEAD | head -n1 | cut -d$'\t' -f2 | sed 's|refs/heads/||') + if [ -z "$DEFAULT_BRANCH" ]; then + echo "Error: Could not determine default branch" + exit 1 + fi + fi + + echo "DEFAULT_BRANCH=$DEFAULT_BRANCH" >> $GITHUB_ENV + echo "Detected default branch: $DEFAULT_BRANCH" + + - name: Get current default branch version + shell: bash + run: | + DEFAULT_BRANCH="${{ env.DEFAULT_BRANCH }}" + + # Extract package.json first, then parse it with proper error checking + git show "origin/$DEFAULT_BRANCH:package.json" > /tmp/package_temp.json 2>/dev/null || { + echo "Error: Could not extract package.json from $DEFAULT_BRANCH branch" + echo "This is expected if the branch doesn't exist or package.json is missing" + exit 1 + } + + # Parse the JSON file with proper error handling + if ! DEFAULT_BRANCH_VERSION=$(node -p "JSON.parse(require('fs').readFileSync('/tmp/package_temp.json', 'utf8')).version" 2>/dev/null); then + echo "Error: Could not parse version from $DEFAULT_BRANCH branch package.json" + echo "The file exists but JSON parsing failed" + rm -f /tmp/package_temp.json + exit 1 + fi + + # Clean up temporary file + rm -f /tmp/package_temp.json + + echo "DEFAULT_BRANCH_VERSION=$DEFAULT_BRANCH_VERSION" >> $GITHUB_ENV + echo "Current $DEFAULT_BRANCH version: $DEFAULT_BRANCH_VERSION" + + - name: Compare versions (simple numeric comparison) + shell: bash + run: | + NEW_VERSION="${{ inputs.new_version }}" + DEFAULT_BRANCH_VERSION="${{ env.DEFAULT_BRANCH_VERSION }}" + + # Simple version comparison for numeric versions (e.g., 1.2.3) + # Note: This project only uses numeric releases, so we keep this simple + # If comparison fails, we exit early (fail-safe approach) + version_compare() { + local v1="$1" + local v2="$2" + + # Parse version numbers (assumes X.Y.Z format) + IFS='.' read -r v1_major v1_minor v1_patch <<< "$v1" + IFS='.' read -r v2_major v2_minor v2_patch <<< "$v2" + + # Set defaults and validate numeric + v1_major=${v1_major:-0} + v1_minor=${v1_minor:-0} + v1_patch=${v1_patch:-0} + v2_major=${v2_major:-0} + v2_minor=${v2_minor:-0} + v2_patch=${v2_patch:-0} + + # Simple numeric comparison + if [ "$v1_major" -gt "$v2_major" ]; then return 0; fi + if [ "$v1_major" -lt "$v2_major" ]; then return 1; fi + if [ "$v1_minor" -gt "$v2_minor" ]; then return 0; fi + if [ "$v1_minor" -lt "$v2_minor" ]; then return 1; fi + if [ "$v1_patch" -gt "$v2_patch" ]; then return 0; fi + return 1 + } + + if version_compare "$NEW_VERSION" "$DEFAULT_BRANCH_VERSION"; then + echo "✅ New version ($NEW_VERSION) > Default branch version ($DEFAULT_BRANCH_VERSION)" + echo "SHOULD_UPDATE=true" >> $GITHUB_ENV + else + echo "⏭️ New version ($NEW_VERSION) <= Default branch version ($DEFAULT_BRANCH_VERSION)" + echo "Skipping default branch update to preserve higher version" + echo "SHOULD_UPDATE=false" >> $GITHUB_ENV + fi + + - name: Create safe branch name + if: env.SHOULD_UPDATE == 'true' + shell: bash + run: | + NEW_VERSION="${{ inputs.new_version }}" + DEFAULT_BRANCH="${{ env.DEFAULT_BRANCH }}" + + # Sanitize version for branch name + # Note: This project only uses numeric versions (e.g., 1.2.3) so minimal sanitization needed + SAFE_VERSION=$(echo "$NEW_VERSION" | sed 's/[^a-zA-Z0-9.-]/-/g') + echo "BRANCH_NAME=update-$DEFAULT_BRANCH-to-v$SAFE_VERSION" >> $GITHUB_ENV + + - name: Extract and update files from default branch + if: env.SHOULD_UPDATE == 'true' + shell: bash + run: | + NEW_VERSION="${{ inputs.new_version }}" + DEFAULT_BRANCH="${{ env.DEFAULT_BRANCH }}" + + # Simple approach: Extract files directly, fail if any step fails + # Since PRs are manually reviewed, we don't need complex error handling + + # Extract package.json and update version + git show "origin/$DEFAULT_BRANCH:package.json" > package.json || exit 1 + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); + pkg.version = '$NEW_VERSION'; + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); + " || exit 1 + + # Extract and update functions.php (Hello Elementor specific) + git show "origin/$DEFAULT_BRANCH:functions.php" > functions.php || exit 1 + sed -i.bak "s/define( 'HELLO_ELEMENTOR_VERSION', '[^']*'/define( 'HELLO_ELEMENTOR_VERSION', '$NEW_VERSION' /" functions.php || exit 1 + rm -f functions.php.bak + # Verify functions.php was actually updated + if ! grep -q "HELLO_ELEMENTOR_VERSION.*$NEW_VERSION" functions.php; then + echo "Error: Failed to update version in functions.php" + exit 1 + fi + + # Extract and update style.css + git show "origin/$DEFAULT_BRANCH:style.css" > style.css || exit 1 + sed -i.bak "s/Version: .*/Version: $NEW_VERSION/" style.css || exit 1 + rm -f style.css.bak + # Verify style.css was actually updated + if ! grep -q "Version: $NEW_VERSION" style.css; then + echo "Error: Failed to update version in style.css" + exit 1 + fi + + # Extract and update assets/scss/style.scss if it exists (Hello Theme specific) + if git show "origin/$DEFAULT_BRANCH:assets/scss/style.scss" > assets/scss/style.scss 2>/dev/null; then + mkdir -p assets/scss + sed -i.bak -e "s/Version: .*/Version: $NEW_VERSION/" -e "s/Stable tag: .*/Stable tag: $NEW_VERSION/" assets/scss/style.scss || exit 1 + rm -f assets/scss/style.scss.bak + echo "✅ Updated assets/scss/style.scss" + else + echo "ℹ️ No assets/scss/style.scss found in $DEFAULT_BRANCH branch" + fi + + # Extract and update readme.txt + git show "origin/$DEFAULT_BRANCH:readme.txt" > readme.txt || exit 1 + # Update fields that exist in the file + sed -i.bak -e "s/^Stable tag: .*/Stable tag: $NEW_VERSION/" -e "s/^Version: .*/Version: $NEW_VERSION/" readme.txt || exit 1 + rm -f readme.txt.bak + + # Verify that fields were updated (check each field independently) + VALIDATION_PASSED=true + + # Check if Stable tag field exists and was updated + if grep -q "^Stable tag:" readme.txt; then + if ! grep -q "^Stable tag: $NEW_VERSION" readme.txt; then + echo "Error: Found 'Stable tag:' field but failed to update it to $NEW_VERSION" + VALIDATION_PASSED=false + else + echo "✅ Updated Stable tag to $NEW_VERSION" + fi + else + echo "ℹ️ No 'Stable tag:' field found in readme.txt" + fi + + # Check if Version field exists and was updated + if grep -q "^Version:" readme.txt; then + if ! grep -q "^Version: $NEW_VERSION" readme.txt; then + echo "Error: Found 'Version:' field but failed to update it to $NEW_VERSION" + VALIDATION_PASSED=false + else + echo "✅ Updated Version to $NEW_VERSION" + fi + else + echo "ℹ️ No 'Version:' field found in readme.txt" + fi + + if [ "$VALIDATION_PASSED" = "false" ]; then + echo "❌ readme.txt version update failed" + exit 1 + fi + + echo "✅ readme.txt version update completed successfully" + + # Generate package-lock.json + npm install --package-lock-only || { + echo "Warning: npm install failed, continuing without package-lock.json update" + echo "This may be due to network issues, registry timeouts, or dependency conflicts" + echo "The version update will proceed without regenerating package-lock.json" + } + + echo "Successfully updated all files" + + - name: Create pull request + if: env.SHOULD_UPDATE == 'true' + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ inputs.token }} + commit-message: "chore: update ${{ env.DEFAULT_BRANCH }} version to v${{ inputs.new_version }}" + branch: ${{ env.BRANCH_NAME }} + title: "Update ${{ env.DEFAULT_BRANCH }} version to v${{ inputs.new_version }}" + body: | + Update ${{ env.DEFAULT_BRANCH }} branch version to v${{ inputs.new_version }} + + **Version Update:** + - New version: v${{ inputs.new_version }} + - Previous ${{ env.DEFAULT_BRANCH }} version: v${{ env.DEFAULT_BRANCH_VERSION }} + + **Files updated:** + - package.json + - functions.php (HELLO_ELEMENTOR_VERSION) + - style.css + - readme.txt + - assets/scss/style.scss (if exists) + - package-lock.json + + Auto-generated by Hello Elementor release preparation workflow. + **Please review manually before merging.** + base: ${{ env.DEFAULT_BRANCH }} + add-paths: | + package.json + package-lock.json + functions.php + style.css + readme.txt + assets/scss/style.scss diff --git a/.github/config/release.json b/.github/config/release.json new file mode 100644 index 00000000..f15804ba --- /dev/null +++ b/.github/config/release.json @@ -0,0 +1,37 @@ +{ + "repository": { + "name": "hello-elementor", + "owner": "elementor", + "main_branch": "main", + "release_branches": ["3.4"] + }, + "versioning": { + "default_type": "patch", + "allowed_types": ["current", "patch", "minor", "major"] + }, + "release": { + "changelog_file": "readme.txt", + "changelog_section": "## Changelog", + "build_artifacts": ["hello-elementor.zip"], + "wordpress_org": { + "manual_upload": true, + "theme_slug": "hello-elementor" + } + }, + "notifications": { + "slack": { + "default_channel": "#release", + "enabled": true + } + }, + "security": { + "allowed_repositories": ["elementor/hello-theme"], + "blocked_actors": ["dependabot[bot]"] + }, + "environment": { + "node_version": "18", + "php_version": "7.4", + "composer_version": "2", + "ubuntu_version": "ubuntu-22.04" + } +} diff --git a/.github/scripts/generate-upload-instructions-release.sh b/.github/scripts/generate-upload-instructions-release.sh new file mode 100755 index 00000000..55291da2 --- /dev/null +++ b/.github/scripts/generate-upload-instructions-release.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# generate-upload-instructions-release.sh - Generate manual upload instructions for Hello Elementor theme + +set -e + +# Get current version +PACKAGE_VERSION=$(node -p "require('./package.json').version") +THEME_SLUG=$(node -p "require('./package.json').name") +BUILD_ZIP="${THEME_SLUG}-${PACKAGE_VERSION}.zip" + +echo "📋 **Hello Elementor v${PACKAGE_VERSION} - Manual Upload Instructions**" +echo "" +echo "===================================================================" +echo "🚀 RELEASE PREPARATION COMPLETE!" +echo "===================================================================" +echo "" +echo "📦 **Package Details:**" +echo " - Theme: Hello Elementor" +echo " - Version: v${PACKAGE_VERSION}" +echo " - Build File: ${BUILD_ZIP}" +echo " - Theme Slug: ${THEME_SLUG}" +echo "" +echo "📋 **Manual Upload Steps:**" +echo "" +echo "1. **Download Release Package:**" +echo " - Go to GitHub Releases page" +echo " - Download: ${BUILD_ZIP}" +echo " - Verify file integrity and size" +echo "" +echo "2. **WordPress.org Upload:**" +echo " - Log into WordPress.org developer account" +echo " - Navigate to Hello Elementor theme page" +echo " - Upload the ${BUILD_ZIP} file" +echo " - Update theme description and changelog" +echo "" +echo "3. **Update Theme Repository:**" +echo " - Update theme directory README" +echo " - Verify theme screenshots and assets" +echo " - Update theme tags and compatibility" +echo "" +echo "4. **Post-Release Tasks:**" +echo " - Test theme installation from WordPress.org" +echo " - Update documentation and support materials" +echo " - Announce release on social media and forums" +echo " - Monitor for user feedback and issues" +echo "" +echo "⚠️ **Important Notes:**" +echo " - WordPress.org themes cannot be auto-published" +echo " - Manual review may be required by WordPress.org team" +echo " - Allow 24-48 hours for theme directory updates" +echo " - Keep GitHub release as backup distribution method" +echo "" +echo "✅ **Verification Checklist:**" +echo " □ Package downloaded successfully" +echo " □ Theme uploaded to WordPress.org" +echo " □ Theme description updated" +echo " □ Changelog entries correct" +echo " □ Theme tags and compatibility updated" +echo " □ Installation tested from WordPress.org" +echo " □ Release announced on appropriate channels" +echo "" +echo "🔗 **Quick Links:**" +echo " - GitHub Release: https://github.com/elementor/hello-theme/releases/tag/v${PACKAGE_VERSION}" +echo " - WordPress.org: https://wordpress.org/themes/hello-elementor/" +echo "" +echo "===================================================================" +echo "For questions or issues, contact the development team." +echo "===================================================================" diff --git a/.github/scripts/get-changelog-from-readme-release.js b/.github/scripts/get-changelog-from-readme-release.js new file mode 100644 index 00000000..4771dc4e --- /dev/null +++ b/.github/scripts/get-changelog-from-readme-release.js @@ -0,0 +1,88 @@ +/* eslint-disable no-console */ +'use strict'; + +// get-changelog-from-readme-release.js - Extract changelog from readme.txt for Hello Elementor releases + +const fs = require( 'fs' ); +const { VERSION } = process.env; + +if ( ! VERSION ) { + console.error( 'missing VERSION env var' ); + process.exit( 1 ); +} + +// Try to load marked, fallback to simple parsing if not available +let marked; +try { + marked = require( 'marked' ); +} catch ( error ) { + console.log( 'marked not available, using simple parsing' ); + marked = null; +} + +// Simple changelog parser fallback +function simpleParseChangelog( content, version ) { + const lines = content.split( '\n' ); + let inChangelog = false; + let foundVersion = false; + const changelog = []; + + for ( const line of lines ) { + if ( line.includes( '== Changelog ==' ) ) { + inChangelog = true; + continue; + } + + if ( inChangelog ) { + if ( line.includes( `= ${ version } -` ) ) { + foundVersion = true; + changelog.push( line ); + continue; + } + + if ( foundVersion ) { + if ( line.startsWith( '=' ) && line.includes( '-' ) ) { + // Found next version, stop + break; + } + if ( line.trim() ) { + changelog.push( line ); + } + } + } + } + + return foundVersion ? changelog.join( '\n' ) : null; +} + +// Main execution +const readmeContent = fs.readFileSync( 'readme.txt', 'utf8' ); + +let changelog; +if ( marked ) { + // Use marked parser (original logic would go here) + console.log( 'Using marked parser' ); + // For now, fallback to simple parser even with marked + changelog = simpleParseChangelog( readmeContent, VERSION ); +} else { + // Use simple parser + changelog = simpleParseChangelog( readmeContent, VERSION ); +} + +if ( ! changelog ) { + console.error( `❌ Changelog for version ${ VERSION } is missing` ); + process.exit( 1 ); // Always fail if version is missing +} + +// Write changelog to temp file only if it exists +const changelogFile = 'temp-changelog-from-readme.txt'; +if ( changelog ) { + fs.writeFileSync( changelogFile, changelog ); +} else { + fs.writeFileSync( changelogFile, '' ); +} + +if ( changelog ) { + console.log( `✅ Successfully extracted Hello Elementor changelog for version ${ VERSION }` ); + console.log( `Changelog saved to: ${ changelogFile }` ); +} diff --git a/.github/scripts/validate-versions-release.sh b/.github/scripts/validate-versions-release.sh new file mode 100755 index 00000000..65f4bdbd --- /dev/null +++ b/.github/scripts/validate-versions-release.sh @@ -0,0 +1,70 @@ +#!/bin/bash +set -eo pipefail + +# validate-versions-release.sh - Validate version consistency across Hello Elementor theme files + +echo "🔍 Validating Hello Elementor theme version consistency..." + +# Get expected version from package.json +EXPECTED_VERSION=$(node -p "require('./package.json').version") +echo "Expected version: $EXPECTED_VERSION" + +# Validate functions.php (Hello Theme uses HELLO_ELEMENTOR_VERSION) +FUNC_VERSION=$(grep -E "define\( 'HELLO_ELEMENTOR_VERSION'" functions.php | awk -F"'" '{print $4}') +if [ "$FUNC_VERSION" != "$EXPECTED_VERSION" ]; then + echo "❌ Version mismatch: functions.php ($FUNC_VERSION) != package.json ($EXPECTED_VERSION)" + exit 1 +fi +echo "✅ functions.php HELLO_ELEMENTOR_VERSION: $FUNC_VERSION" + +# Validate style.css +CSS_VERSION=$(grep -E "Version:" style.css | awk '{print $2}') +if [ "$CSS_VERSION" != "$EXPECTED_VERSION" ]; then + echo "❌ Version mismatch: style.css ($CSS_VERSION) != package.json ($EXPECTED_VERSION)" + exit 1 +fi +echo "✅ style.css Version: $CSS_VERSION" + +# Validate assets/scss/style.scss if it exists (Hello Theme specific) +if [ -f "assets/scss/style.scss" ]; then + SCSS_VERSION=$(grep -E "Version:" assets/scss/style.scss | awk '{print $2}') + if [ "$SCSS_VERSION" != "$EXPECTED_VERSION" ]; then + echo "❌ Version mismatch: assets/scss/style.scss ($SCSS_VERSION) != package.json ($EXPECTED_VERSION)" + exit 1 + fi + echo "✅ assets/scss/style.scss Version: $SCSS_VERSION" + + # Also check Stable tag in SCSS file + SCSS_STABLE_TAG=$(grep -E "Stable tag:" assets/scss/style.scss | awk '{print $3}') + if [ "$SCSS_STABLE_TAG" != "$EXPECTED_VERSION" ]; then + echo "❌ Version mismatch: assets/scss/style.scss Stable tag ($SCSS_STABLE_TAG) != package.json ($EXPECTED_VERSION)" + exit 1 + fi + echo "✅ assets/scss/style.scss Stable tag: $SCSS_STABLE_TAG" +else + echo "ℹ️ No assets/scss/style.scss found, skipping SCSS validation" +fi + +# Validate readme.txt stable tag +README_VERSION=$(grep -E "Stable tag:" readme.txt | awk '{print $3}') +if [ "$README_VERSION" != "$EXPECTED_VERSION" ]; then + echo "❌ Version mismatch: readme.txt Stable tag ($README_VERSION) != package.json ($EXPECTED_VERSION)" + exit 1 +fi +echo "✅ readme.txt Stable tag: $README_VERSION" + +# Validate readme.txt version field if it exists +if grep -q "^Version:" readme.txt; then + README_VERSION_FIELD=$(grep -E "^Version:" readme.txt | awk '{print $2}') + if [ "$README_VERSION_FIELD" != "$EXPECTED_VERSION" ]; then + echo "❌ Version mismatch: readme.txt Version field ($README_VERSION_FIELD) != package.json ($EXPECTED_VERSION)" + exit 1 + fi + echo "✅ readme.txt Version field: $README_VERSION_FIELD" +else + echo "ℹ️ No Version field found in readme.txt" +fi + +echo "" +echo "🎉 All versions match: $EXPECTED_VERSION" +echo "✅ Hello Elementor theme version validation passed!" diff --git a/.github/workflows/release-preparation.yml b/.github/workflows/release-preparation.yml new file mode 100644 index 00000000..31373fb4 --- /dev/null +++ b/.github/workflows/release-preparation.yml @@ -0,0 +1,350 @@ +name: 'Release Preparation (Hello Elementor)' + +on: + workflow_dispatch: + inputs: + release_branch: + type: string + description: 'Branch to create release from (e.g., main, 3.4, feature/xyz)' + required: true + version_type: + required: true + type: choice + description: 'Version increment type' + options: + - current # For first release - keeps version as-is (3.4.4) + - patch # 3.4.4 → 3.4.5 + - minor # 3.4.4 → 3.5.0 + - major # 3.4.4 → 4.0.0 + dry_run: + type: boolean + description: 'Dry run (test without creating actual release)?' + required: false + default: false + slack_channel: + type: string + description: 'Slack channel for notifications' + required: false + default: '#release' + +permissions: + contents: write + pull-requests: write + issues: write + +env: + NODE_VERSION: '18' + PHP_VERSION: '7.4' + COMPOSER_VERSION: '2' + +jobs: + release: + runs-on: ubuntu-22.04 + # Workflow design: version files are bumped early, used for build/release, then automatically restored + # by peter-evans/create-pull-request action. Error cleanup ensures consistent state on any failure. + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ inputs.release_branch }} + fetch-depth: 0 + + - name: Load Release Configuration + id: config + run: | + echo "📋 Loading Hello Elementor release configuration..." + CONFIG_FILE=".github/config/release.json" + + if [ ! -f "$CONFIG_FILE" ]; then + echo "❌ Error: Release configuration file not found: $CONFIG_FILE" + exit 1 + fi + + # Validate JSON syntax + if ! jq empty "$CONFIG_FILE" 2>/dev/null; then + echo "❌ Error: Invalid JSON in release configuration" + exit 1 + fi + + # Load configuration values + ALLOWED_REPOS=$(jq -r '.security.allowed_repositories[]' "$CONFIG_FILE" | tr '\n' ' ') + BLOCKED_ACTORS=$(jq -r '.security.blocked_actors[]' "$CONFIG_FILE" | tr '\n' ' ') + RELEASE_BRANCHES=$(jq -r '.repository.release_branches[]' "$CONFIG_FILE" | tr '\n' ' ') + CONFIG_THEME_SLUG=$(jq -r '.release.wordpress_org.theme_slug' "$CONFIG_FILE") + + echo "ALLOWED_REPOS=$ALLOWED_REPOS" >> $GITHUB_ENV + echo "BLOCKED_ACTORS=$BLOCKED_ACTORS" >> $GITHUB_ENV + echo "RELEASE_BRANCHES=$RELEASE_BRANCHES" >> $GITHUB_ENV + echo "CONFIG_THEME_SLUG=$CONFIG_THEME_SLUG" >> $GITHUB_ENV + + echo "✅ Hello Elementor release configuration loaded successfully" + + - name: Pre-flight checks + run: | + echo "🔍 Pre-flight checks..." + echo "Release Branch: ${{ inputs.release_branch }}" + echo "Current Branch: ${{ github.ref_name }}" + echo "Version Type: ${{ inputs.version_type }}" + echo "Dry Run: ${{ inputs.dry_run }}" + echo "Repository: ${{ github.repository }}" + echo "Actor: ${{ github.actor }}" + + if [ "${{ inputs.dry_run }}" == "true" ]; then + echo "🧪 **DRY RUN MODE** - No actual release will be created" + fi + + # Repository permissions validation + REPO_ALLOWED=false + for allowed_repo in ${{ env.ALLOWED_REPOS }}; do + if [ "${{ github.repository }}" == "$allowed_repo" ]; then + REPO_ALLOWED=true + break + fi + done + + if [ "$REPO_ALLOWED" != "true" ]; then + echo "⚠️ Warning: Running on unauthorized repository: ${{ github.repository }}" + fi + + # Check actor permissions (basic validation) + for blocked_actor in ${{ env.BLOCKED_ACTORS }}; do + if [ "${{ github.actor }}" == "$blocked_actor" ]; then + echo "❌ Error: Blocked actor cannot create releases: ${{ github.actor }}" + exit 1 + fi + done + + # Check if the specified branch exists + if ! git show-ref --verify --quiet refs/remotes/origin/${{ inputs.release_branch }}; then + echo "❌ Error: Branch '${{ inputs.release_branch }}' does not exist" + echo "💡 Available branches:" + git branch -r --format='%(refname:short)' | sed 's/origin\///' | head -10 + exit 1 + fi + + # Check if selected release branch is allowed (if configured) + if [ -n "${{ env.RELEASE_BRANCHES }}" ]; then + BRANCH_ALLOWED=false + for release_branch in ${{ env.RELEASE_BRANCHES }}; do + if [ "${{ inputs.release_branch }}" == "$release_branch" ]; then + BRANCH_ALLOWED=true + break + fi + done + + if [ "$BRANCH_ALLOWED" != "true" ]; then + echo "⚠️ Warning: Branch '${{ inputs.release_branch }}' is not in configured release branches" + echo "📋 Configured release branches: ${{ env.RELEASE_BRANCHES }}" + echo "🔄 Continuing anyway - remove this branch from release.json if releases should be blocked" + fi + fi + + # Check for uncommitted changes + if ! git diff --quiet; then + echo "❌ Error: Uncommitted changes found" + exit 1 + fi + + echo "✅ Pre-flight checks passed" + + - name: Install Dependencies + uses: ./.github/actions/install-dependencies-release + with: + DEVOPS_TOKEN: ${{ secrets.DEVOPS_TOKEN }} + CLOUD_DEVOPS_TOKEN: ${{ secrets.CLOUD_DEVOPS_TOKEN }} + + - name: Get current version + id: current-version + run: | + PACKAGE_VERSION=$(node -p "require('./package.json').version") + echo "CLEAN_PACKAGE_VERSION=$PACKAGE_VERSION" >> $GITHUB_ENV + echo "Current Hello Elementor version: $PACKAGE_VERSION" + + - name: Bump Theme Version (Dry Run) + if: ${{ inputs.dry_run == true }} + run: | + echo "🧪 DRY RUN: Would bump Hello Elementor version from ${{ env.CLEAN_PACKAGE_VERSION }}" + + CURRENT_VERSION="${{ env.CLEAN_PACKAGE_VERSION }}" + IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" + + case "${{ inputs.version_type }}" in + "current") + NEW_VERSION="$CURRENT_VERSION" + ;; + "major") + NEW_MAJOR=$((MAJOR + 1)) + NEW_VERSION="$NEW_MAJOR.0.0" + ;; + "minor") + NEW_MINOR=$((MINOR + 1)) + NEW_VERSION="$MAJOR.$NEW_MINOR.0" + ;; + "patch") + NEW_PATCH=$((PATCH + 1)) + NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" + ;; + esac + + echo "DRY_RUN_VERSION=$NEW_VERSION" >> $GITHUB_ENV + echo "PACKAGE_VERSION=$NEW_VERSION" >> $GITHUB_ENV + echo "🧪 DRY RUN: Version would be: $CURRENT_VERSION → $NEW_VERSION" + echo "🧪 DRY RUN: Changelog validation will use current version: $CURRENT_VERSION" + + - name: Bump Theme Version (Actual) + if: ${{ inputs.dry_run == false }} + uses: ./.github/actions/bump-theme-version-release + with: + CLEAN_PACKAGE_VERSION: ${{ env.CLEAN_PACKAGE_VERSION }} + VERSION_TYPE: ${{ inputs.version_type }} + + - name: Validate current versions (Dry Run) + if: ${{ inputs.dry_run == true }} + run: | + CURRENT_VERSION=$(node -p "require('./package.json').version") + echo "🔍 Validating CURRENT versions ($CURRENT_VERSION)..." + bash .github/scripts/validate-versions-release.sh + + - name: Validate changelog for updated version (Dry Run) + if: ${{ inputs.dry_run == true }} + uses: ./.github/actions/get-changelog-from-readme-release + with: + VERSION: ${{ env.DRY_RUN_VERSION }} + + - name: Validate changelog for new version (Actual) + if: ${{ inputs.dry_run == false }} + uses: ./.github/actions/get-changelog-from-readme-release + with: + VERSION: ${{ env.PACKAGE_VERSION }} + + # Build with version-bumped files to ensure release assets contain correct versions + - name: Build Hello Elementor Theme + id: build + uses: ./.github/actions/build-theme-release + with: + PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }} + BUILD_SCRIPT_PATH: "npm run package:zip" + + - name: Create GitHub Release (Dry Run) + if: ${{ inputs.dry_run == true }} + run: | + echo "🧪 DRY RUN: Would create GitHub release" + echo " - Tag: v${{ env.PACKAGE_VERSION }}" + echo " - Build file: ${{ env.BUILD_ZIP_PATH }}" + echo " - Changelog: ${{ env.CHANGELOG_FILE }}" + echo "RELEASE_URL=https://github.com/elementor/hello-theme/releases/tag/v${{ env.PACKAGE_VERSION }}" >> $GITHUB_ENV + + # Create GitHub release with version-bumped assets before repository cleanup + # This ensures the published release contains the correct version numbers + - name: Create GitHub Release (Actual) + if: ${{ inputs.dry_run == false }} + id: create-release + uses: softprops/action-gh-release@v1 + with: + tag_name: v${{ env.PACKAGE_VERSION }} + name: Hello Elementor v${{ env.PACKAGE_VERSION }} + body_path: ${{ env.CHANGELOG_FILE }} + files: ${{ env.BUILD_ZIP_PATH }} + prerelease: false + token: ${{ secrets.GITHUB_TOKEN }} + + # Repository maintenance steps happen after release creation + # Note: peter-evans/create-pull-request automatically restores working directory + # This design ensures release assets are created before any git cleanup occurs + + # Skip PR creation for 'current' version type since no version bump occurs + - name: Create PR With Bumped Version + if: ${{ inputs.dry_run == false && inputs.version_type != 'current' }} + uses: ./.github/actions/create-pr-with-bumped-theme-version-release + with: + base_branch: ${{ inputs.release_branch }} + # Use NEW_VERSION (bumped version) instead of CLEAN_PACKAGE_VERSION (old version) + # This ensures PR title/branch reflects the actual new version (e.g., "Release v3.4.5") + # Fallback to CLEAN_PACKAGE_VERSION for safety if NEW_VERSION is not set + package_version: ${{ env.NEW_VERSION || env.CLEAN_PACKAGE_VERSION }} + token: ${{ secrets.GITHUB_TOKEN }} + + # Update main branch version if new version > main version + - name: Update Main Branch Version + if: ${{ inputs.dry_run == false && inputs.version_type != 'current' }} + uses: ./.github/actions/update-main-branch-version-release + with: + new_version: ${{ env.NEW_VERSION }} + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Set Release URL + if: ${{ inputs.dry_run == false }} + run: | + echo "RELEASE_URL=${{ steps.create-release.outputs.html_url }}" >> $GITHUB_ENV + + - name: Send Slack Notification (Dry Run) + if: false + run: | + echo "🧪 DRY RUN: Would send Slack notification" + echo " - Channel: ${{ inputs.slack_channel }}" + echo " - Version: v${{ env.PACKAGE_VERSION }}" + echo " - Message: Hello Elementor release preparation complete (DRY RUN)" + + - name: Slack Notification Skipped + if: ${{ inputs.dry_run == true }} + run: | + echo "📢 Slack notification skipped (release-preparation workflow)" + echo " - Only full releases with WordPress.org deployment trigger Slack notifications" + + - name: Send Slack Notification (Actual) + if: false + uses: ./.github/actions/theme-slack-notification-release + with: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }} + BUILD_ZIP_PATH: ${{ env.BUILD_ZIP_PATH }} + GITHUB_RELEASE_URL: ${{ env.RELEASE_URL }} + SLACK_CHANNEL: ${{ inputs.slack_channel }} + WPORG_DEPLOYMENT_STATUS: 'skipped' + + - name: Manual Upload Instructions + run: | + if [ "${{ inputs.dry_run }}" == "true" ]; then + echo "🧪 **DRY RUN COMPLETE!**" + echo "" + echo "📋 **This was a test run - no actual release was created**" + echo "" + echo "🔍 **What would have happened:**" + echo "1. Version would be bumped to: v${{ env.PACKAGE_VERSION }}" + echo "2. Hello Elementor theme would be built: ${{ env.BUILD_ZIP_PATH }}" + echo "3. GitHub release would be created: ${{ env.RELEASE_URL }}" + echo "4. Slack notification would be sent to #release" + echo "" + echo "✅ **Dry run validation passed - ready for actual release!**" + else + bash .github/scripts/generate-upload-instructions-release.sh + fi + + # Error recovery: restore repository to clean state on any workflow failure + # Design principle: always return to original branch state for consistency + # This prevents partial updates and ensures repository remains in sync with branch + - name: Cleanup on Error + if: ${{ always() && !inputs.dry_run && failure() }} + run: | + echo "🧹 Workflow failed - restoring to original state..." + + # Restore all version-bumped files to their original branch state + # This maintains consistency between working directory and remote branch + if ! git diff --quiet; then + echo "⚠️ Found modified files, restoring original versions..." + + # Restore specific files that were version-bumped earlier in workflow + git checkout -- package.json functions.php style.css readme.txt 2>/dev/null || true + git checkout -- assets/scss/style.scss 2>/dev/null || true + + echo "✅ Files restored to original state" + else + echo "ℹ️ Working directory already clean" + fi + + # Remove temporary files generated during workflow execution + rm -f temp-changelog-from-readme.txt 2>/dev/null || true + rm -f *.bak 2>/dev/null || true + + echo "🔍 Final state check:" + git status --porcelain || true From f6926867a11c9d90ffeb9a65c422f08a1bd5db7b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 17:38:54 +0200 Subject: [PATCH 07/43] Tweak: improve changelog appearance [TMZ-928] (#543) (#544) --- .gitignore | 4 +- modules/admin-home/assets/images/plus.svg | 1 + .../js/components/settings/changelog.js | 44 +++++++++++++++++++ .../js/components/settings/plus-icon.js | 10 +++++ .../js/components/settings/settings-page.js | 30 +------------ .../assets/js/components/settings/update.js | 18 +++++--- 6 files changed, 72 insertions(+), 35 deletions(-) create mode 100644 modules/admin-home/assets/images/plus.svg create mode 100644 modules/admin-home/assets/js/components/settings/changelog.js create mode 100644 modules/admin-home/assets/js/components/settings/plus-icon.js diff --git a/.gitignore b/.gitignore index 74438716..4a3bc0c8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,8 @@ node_modules/ .sass-cache/ build/** -assets/ +# Only ignore root-level assets directory (build output), not module assets (source files) +/assets/ hello-elementor/ elementor-hello-theme/ log/ @@ -13,7 +14,6 @@ Thumbs.db *.log *.map yarn.lock -assets/js/ *.zip .npmrc .env diff --git a/modules/admin-home/assets/images/plus.svg b/modules/admin-home/assets/images/plus.svg new file mode 100644 index 00000000..ceedebe3 --- /dev/null +++ b/modules/admin-home/assets/images/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/modules/admin-home/assets/js/components/settings/changelog.js b/modules/admin-home/assets/js/components/settings/changelog.js new file mode 100644 index 00000000..72e824f8 --- /dev/null +++ b/modules/admin-home/assets/js/components/settings/changelog.js @@ -0,0 +1,44 @@ +import Dialog from '@elementor/ui/Dialog'; +import DialogContent from '@elementor/ui/DialogContent'; +import DialogHeader from '@elementor/ui/DialogHeader'; +import Typography from '@elementor/ui/Typography'; +import { __ } from '@wordpress/i18n'; +import Stack from '@elementor/ui/Stack'; +import Update from './update'; +import Divider from '@elementor/ui/Divider'; +import { PlusIcon } from './plus-icon'; +import { Fragment } from 'react'; + +export const ChangelogDialog = ( { open, onClose, whatsNew } ) => { + return ( + + } + > + + { __( 'Changelog', 'hello-elementor' ) } + + + + + + { whatsNew.map( ( item, index ) => { + return ( + + + { index !== whatsNew.length - 1 && } + + ); + } ) } + + + + ); +}; diff --git a/modules/admin-home/assets/js/components/settings/plus-icon.js b/modules/admin-home/assets/js/components/settings/plus-icon.js new file mode 100644 index 00000000..5d1c8685 --- /dev/null +++ b/modules/admin-home/assets/js/components/settings/plus-icon.js @@ -0,0 +1,10 @@ +import SvgIcon from '@elementor/ui/SvgIcon'; +import { ReactComponent as Icon } from '../../../images/plus.svg'; + +export const PlusIcon = ( props ) => { + return ( + + + + ); +}; diff --git a/modules/admin-home/assets/js/components/settings/settings-page.js b/modules/admin-home/assets/js/components/settings/settings-page.js index 57d99422..7c5f1282 100644 --- a/modules/admin-home/assets/js/components/settings/settings-page.js +++ b/modules/admin-home/assets/js/components/settings/settings-page.js @@ -18,8 +18,7 @@ import Paper from '@elementor/ui/Paper'; import { styled } from '@elementor/ui/styles'; import Link from '@elementor/ui/Link'; import Stack from '@elementor/ui/Stack'; -import Modal from '@elementor/ui/Modal'; -import Update from './update'; +import { ChangelogDialog } from './changelog'; const Notices = () => { const notices = useSelect( @@ -75,19 +74,6 @@ const StyledTabs = styled( Tabs )( () => ( { }, } ) ); -const style = { - position: 'absolute', - top: '50%', - left: '50%', - transform: 'translate(-50%, -50%)', - bgcolor: 'background.paper', - border: '1px solid #000', - boxShadow: 24, - p: 2, - maxHeight: '80vh', - overflowY: 'auto', -}; - export const SettingsPage = () => { const { whatsNew } = useSettingsContext(); const { getTabsProps, getTabProps, getTabPanelProps } = useTabs( 'one' ); @@ -131,19 +117,7 @@ export const SettingsPage = () => { - - - { __( 'Changelog', 'hello-plus' ) } - - { whatsNew.map( ( item ) => ) } - - - + ); }; diff --git a/modules/admin-home/assets/js/components/settings/update.js b/modules/admin-home/assets/js/components/settings/update.js index 06baf9f2..143dcc49 100644 --- a/modules/admin-home/assets/js/components/settings/update.js +++ b/modules/admin-home/assets/js/components/settings/update.js @@ -1,11 +1,19 @@ -import Stack from '@elementor/ui/Stack'; +import Box from '@elementor/ui/Box'; import Typography from '@elementor/ui/Typography'; +import { useMemo } from 'react'; export default function Update( { title, description } ) { + const descriptionToShow = useMemo( () => { + const parser = new DOMParser(); + const doc = parser.parseFromString( description, 'text/html' ); + const listItems = doc.querySelectorAll( 'li' ); + const extractedContent = Array.from( listItems ).map( ( item ) => item.textContent.trim() ); + return extractedContent.join( '\n' ); + }, [ description ] ); return ( - - { title } -
- + + { title } + { descriptionToShow } + ); } From 2cec5ca8a2c5bd9582474c0e8d2ec9673dc0f7e5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:03:23 +0200 Subject: [PATCH 08/43] Internal: Revert changes to quicklinks [TMZ-923] (#545) (#546) --- modules/admin-home/rest/admin-config.php | 7 +++---- .../playwright/tests/admin/hello-theme-admin-home.test.ts | 5 ----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/admin-home/rest/admin-config.php b/modules/admin-home/rest/admin-config.php index 482a710a..52055518 100644 --- a/modules/admin-home/rest/admin-config.php +++ b/modules/admin-home/rest/admin-config.php @@ -86,7 +86,6 @@ private function get_elementor_editor_url( ?int $page_id, string $active_tab ): 'post' => $page_id, 'action' => 'elementor', 'active-tab' => $active_tab, - 'active-document' => $active_kit_id, ], admin_url( 'post.php' ) ); @@ -285,18 +284,18 @@ public function get_quicklinks( $config, ?int $elementor_page_id = null ): array $config['quickLinks'] = [ 'site_name' => [ 'title' => __( 'Site Name', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity' ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity', null, [ 'autofocus[section]' => 'title_tagline' ] ), 'icon' => 'TextIcon', ], 'site_logo' => [ 'title' => __( 'Site Logo', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity' ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity', null, [ 'autofocus[section]' => 'title_tagline' ] ), 'icon' => 'PhotoIcon', ], 'site_favicon' => [ 'title' => __( 'Site Favicon', 'hello-elementor' ), - 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity' ), + 'link' => $this->get_open_homepage_with_tab( $elementor_page_id, 'settings-site-identity', null, [ 'autofocus[section]' => 'title_tagline' ] ), 'icon' => 'AppsIcon', ], ]; diff --git a/tests/playwright/tests/admin/hello-theme-admin-home.test.ts b/tests/playwright/tests/admin/hello-theme-admin-home.test.ts index 97c54ba8..de0bb079 100644 --- a/tests/playwright/tests/admin/hello-theme-admin-home.test.ts +++ b/tests/playwright/tests/admin/hello-theme-admin-home.test.ts @@ -63,11 +63,6 @@ test.describe( 'Hello Theme Admin Home Page', () => { const linkElement = page.locator( `h6:has-text("${ linkTest.linkText }") a` ); await expect( linkElement ).toBeVisible(); - if ( !! process.env.DAILY_MATRIX_WORKFLOW ) { - // Skip this test in Daily Matrix workflow due to artifact deployment timing issues - continue; - } - await Promise.all( [ page.waitForURL( linkTest.expectedUrlPattern ), linkElement.click(), From 6974bba5ed612478c4925ca67d921d9835cd3858 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:24:32 +0200 Subject: [PATCH 09/43] Tweak: Show PLG only on selected pages [TMZ-919] (#547) (#548) --- .buildignore | 1 + .vscode/settings.json | 8 + composer.json | 36 ++-- .../js/hello-elementor-conversion-banner.js | 18 +- .../components/conversion-banner.php | 166 ++++++++++++++++-- tests/bootstrap.php | 6 +- 6 files changed, 186 insertions(+), 49 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.buildignore b/.buildignore index e3e90448..c199bf70 100644 --- a/.buildignore +++ b/.buildignore @@ -32,3 +32,4 @@ tsconfig.json .wp-env.json .phpunit.result.cache temp-changelog-from-readme.txt +.vscode/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..74b0ac78 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "phpcs.standard": "./phpcs.xml", + "phpcs.executablePath": "vendor/bin/phpcs", + "phpcbf.executablePath": "vendor/bin/phpcbf", + "phpcs.enable": true, + "phpcbf.enable": true, + "phpcs.showSources": true +} \ No newline at end of file diff --git a/composer.json b/composer.json index dc89ea2f..da76fc57 100644 --- a/composer.json +++ b/composer.json @@ -3,23 +3,23 @@ "require-dev": { "squizlabs/php_codesniffer": "^3.6", "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1", - "wp-coding-standards/wpcs": "^2.3", - "phpunit/phpunit": "9.5.14", - "elementor/elementor-editor-testing": "0.0.3", - "yoast/phpunit-polyfills": "^1.0.1" - }, - "require": { - "elementor/wp-notifications-package": "1.2.*" - }, - "config": { - "allow-plugins": { - "dealerdirect/phpcodesniffer-composer-installer": true - } - }, + "wp-coding-standards/wpcs": "^2.3", + "phpunit/phpunit": "9.5.14", + "elementor/elementor-editor-testing": "0.0.3", + "yoast/phpunit-polyfills": "^1.0.1" + }, + "require": { + "elementor/wp-notifications-package": "1.2.*" + }, + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, "scripts": { - "lint": "phpcs --extensions=php -p", - "lint:fix": "vendor/bin/phpcbf --ignore=node_modules,vendor,build .", - "test": "phpunit --testsuite hello-elementor", - "test:install": "bash ./bin/install-wp-tests-local.sh" + "lint": "phpcs --extensions=php --standard=./phpcs.xml --ignore=node_modules,vendor,assets,tmp -p .", + "lint:fix": "vendor/bin/phpcbf --extensions=php --standard=./phpcs.xml --ignore=node_modules,vendor,assets,tmp .", + "test": "phpunit --testsuite hello-elementor", + "test:install": "bash ./bin/install-wp-tests-local.sh" } -} +} \ No newline at end of file diff --git a/modules/admin-home/assets/js/hello-elementor-conversion-banner.js b/modules/admin-home/assets/js/hello-elementor-conversion-banner.js index ccd203de..5f13d414 100644 --- a/modules/admin-home/assets/js/hello-elementor-conversion-banner.js +++ b/modules/admin-home/assets/js/hello-elementor-conversion-banner.js @@ -20,21 +20,21 @@ document.addEventListener( 'DOMContentLoaded', () => { const container = document.getElementById( 'ehe-admin-cb' ); if ( container ) { - let headerEnd = document.querySelector( '.wp-header-end' ); - - if ( ! headerEnd ) { - headerEnd = document.querySelector( '.wrap h1, .wrap h2' ); - } + const { beforeWrap = false } = window.ehe_cb; + const { selector, before = false } = window.ehe_cb.data; + const headerEnd = document.querySelector( selector ); if ( headerEnd ) { - if ( window.ehe_cb.beforeWrap ) { + if ( beforeWrap ) { const wrapElement = document.querySelector( '.wrap' ); if ( wrapElement ) { wrapElement.insertAdjacentElement( 'beforebegin', container ); } - } else { - headerEnd.insertAdjacentElement( 'afterend', container ); - } + } else if ( before ) { + headerEnd.insertAdjacentElement( 'beforebegin', container ); + } else { + headerEnd.insertAdjacentElement( 'afterend', container ); + } } const root = createRoot( container ); diff --git a/modules/admin-home/components/conversion-banner.php b/modules/admin-home/components/conversion-banner.php index d2a444ca..72e09a86 100644 --- a/modules/admin-home/components/conversion-banner.php +++ b/modules/admin-home/components/conversion-banner.php @@ -11,6 +11,13 @@ class Conversion_Banner { + const DEFAULT_SELECTOR = '.wrap h1, .wrap h2'; + const SCRIPT_HANDLE = 'hello-conversion-banner'; + const NONCE_ACTION = 'ehe_cb_nonce'; + const OBJECT_NAME = 'ehe_cb'; + const USER_META_KEY = '_hello_elementor_install_notice'; + const AJAX_ACTION = 'ehe_dismiss_theme_notice'; + private function render_conversion_banner() { ?>
@@ -18,23 +25,144 @@ private function render_conversion_banner() { [ 'selector' => '#wpbody #wpbody-content .wrap h1' ], + 'update-core' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-post' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-category' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-post_tag' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'upload' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'media' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-page' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'elementor_page_elementor-settings' => [ 'selector' => self::DEFAULT_SELECTOR ], + 'edit-elementor_library' => [ + 'selector' => self::DEFAULT_SELECTOR, + 'before' => true, + ], + 'elementor_page_elementor-tools' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'elementor_page_elementor-role-manager' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'elementor_page_elementor-element-manager' => [ + 'selector' => '.wrap h1, .wrap h3.wp-heading-inline', + ], + 'elementor_page_elementor-system-info' => [ + 'selector' => '#wpbody #wpbody-content #elementor-system-info .elementor-system-info-header', + 'before' => true, + ], + 'elementor_library_page_e-floating-buttons' => [ + 'selector' => '#wpbody-content .e-landing-pages-empty, .wrap h2', + 'before' => true, + ], + 'edit-e-floating-buttons' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'edit-elementor_library_category' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'themes' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'nav-menus' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'theme-editor' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'plugins' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'plugin-install' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'plugin-editor' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'users' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'user' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'profile' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'tools' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'import' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'export' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'site-health' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'export-personal-data' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'erase-personal-data' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-general' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-writing' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-reading' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-discussion' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-media' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-permalink' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'options-privacy' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + 'privacy-policy-guide' => [ + 'selector' => self::DEFAULT_SELECTOR, + ], + ]; + } + + private function is_allowed_admin_page(): array { + $current_screen = get_current_screen(); + + if ( ! $current_screen ) { + return []; } - if ( Utils::has_pro() && Utils::is_elementor_active() ) { - return false; + $allowed_pages = $this->get_allowed_admin_pages(); + $current_page = $current_screen->id; + + return $allowed_pages[ $current_page ] ?? []; + } + + private function is_conversion_banner_active(): array { + if ( get_user_meta( get_current_user_id(), self::USER_META_KEY, true ) ) { + return []; } - $current_screen = get_current_screen(); + if ( Utils::has_pro() && Utils::is_elementor_active() ) { + return []; + } - return false === strpos( $current_screen->id ?? '', EHP_THEME_SLUG ); + return $this->is_allowed_admin_page(); } - private function enqueue_scripts() { + private function enqueue_scripts( array $conversion_banner_active ) { $script = new Script( - 'hello-conversion-banner', + self::SCRIPT_HANDLE, [ 'wp-util' ] ); @@ -43,29 +171,31 @@ private function enqueue_scripts() { $is_installing_plugin_with_uploader = 'upload-plugin' === filter_input( INPUT_GET, 'action', FILTER_UNSAFE_RAW ); wp_localize_script( - 'hello-conversion-banner', - 'ehe_cb', + self::SCRIPT_HANDLE, + self::OBJECT_NAME, [ - 'nonce' => wp_create_nonce( 'ehe_cb_nonce' ), + 'nonce' => wp_create_nonce( self::NONCE_ACTION ), 'beforeWrap' => $is_installing_plugin_with_uploader, + 'data' => $conversion_banner_active, ] ); } public function dismiss_theme_notice() { - check_ajax_referer( 'ehe_cb_nonce', 'nonce' ); + check_ajax_referer( self::NONCE_ACTION, 'nonce' ); - update_user_meta( get_current_user_id(), '_hello_elementor_install_notice', true ); + update_user_meta( get_current_user_id(), self::USER_META_KEY, true ); wp_send_json_success( [ 'message' => __( 'Notice dismissed.', 'hello-elementor' ) ] ); } public function __construct() { - add_action( 'wp_ajax_ehe_dismiss_theme_notice', [ $this, 'dismiss_theme_notice' ] ); + add_action( 'wp_ajax_' . self::AJAX_ACTION, [ $this, 'dismiss_theme_notice' ] ); add_action( 'current_screen', function () { - if ( ! $this->is_conversion_banner_active() ) { + $conversion_banner_active = $this->is_conversion_banner_active(); + if ( ! $conversion_banner_active ) { return; } @@ -73,8 +203,8 @@ public function __construct() { $this->render_conversion_banner(); }, 11 ); - add_action( 'admin_enqueue_scripts', function () { - $this->enqueue_scripts(); + add_action( 'admin_enqueue_scripts', function () use ( $conversion_banner_active ) { + $this->enqueue_scripts( $conversion_banner_active ); } ); } ); } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index f81de1b7..bbf96dbf 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -65,8 +65,8 @@ do_action('plugins_loaded'); -function initialize_elementor_plugin($plugin_class) -{ +function initialize_elementor_plugin($plugin_class){ + if (!class_exists($plugin_class)) { return null; } @@ -76,7 +76,5 @@ function initialize_elementor_plugin($plugin_class) $plugin_instance = initialize_elementor_plugin('Elementor\Plugin'); -$plugin_instance->initialize_container(); - do_action('init'); do_action('wp_loaded'); From dbe0ec10b3422ae7bee658558ce76555da0d8656 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 13:03:57 +0200 Subject: [PATCH 10/43] New: Add theme home to Finder [TMZ-935] (#549) (#550) --- modules/admin-home/components/finder.php | 27 ++++++++++++++++++++++++ modules/admin-home/module.php | 1 + 2 files changed, 28 insertions(+) create mode 100644 modules/admin-home/components/finder.php diff --git a/modules/admin-home/components/finder.php b/modules/admin-home/components/finder.php new file mode 100644 index 00000000..f42e12fa --- /dev/null +++ b/modules/admin-home/components/finder.php @@ -0,0 +1,27 @@ + esc_html__( 'Hello Theme Home', 'hello-elementor' ), + 'icon' => 'paint-brush', + 'url' => admin_url( 'admin.php?page=hello-elementor' ), + 'keywords' => [ 'theme', 'hello', 'home', 'plus', '+' ], + ]; + } + + return $categories_data; + } + + public function __construct() { + add_filter( 'elementor/finder/categories', [ $this, 'add_hello_theme_finder_entry' ] ); + } +} diff --git a/modules/admin-home/module.php b/modules/admin-home/module.php index f7820ad3..38fe3b23 100644 --- a/modules/admin-home/module.php +++ b/modules/admin-home/module.php @@ -35,6 +35,7 @@ protected function get_component_ids(): array { 'Admin_Top_Bar', 'Settings_Controller', 'Notificator', + 'Finder', ]; } } From 4ece011972d58bbcc364d77c5293a57bae5c85c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 13:41:30 +0200 Subject: [PATCH 11/43] Internal: Bump version and add changelog [TMZ-954] (#551) (#552) --- functions.php | 2 +- package-lock.json | 5219 +++++++++++++++++++++++++-------------------- package.json | 2 +- readme.txt | 13 +- style.css | 4 +- 5 files changed, 2918 insertions(+), 2322 deletions(-) diff --git a/functions.php b/functions.php index 28f52eca..f9bfe47b 100644 --- a/functions.php +++ b/functions.php @@ -9,7 +9,7 @@ exit; // Exit if accessed directly. } -define( 'HELLO_ELEMENTOR_VERSION', '3.4.4' ); +define( 'HELLO_ELEMENTOR_VERSION', '3.4.5' ); define( 'EHP_THEME_SLUG', 'hello-elementor' ); define( 'HELLO_THEME_PATH', get_template_directory() ); diff --git a/package-lock.json b/package-lock.json index 47849099..fe2b0509 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "hello-elementor", - "version": "3.4.4", + "version": "3.4.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "hello-elementor", - "version": "3.4.4", + "version": "3.4.5", "dependencies": { "@elementor/icons": "1.42.0", "@elementor/ui": "1.34.2", @@ -58,13 +58,13 @@ "license": "MIT" }, "node_modules/@ariakit/react": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.17.tgz", - "integrity": "sha512-HQaIboE2axtlncJz1hRTaiQfJ1GGjhdtNcAnPwdjvl2RybfmlHowIB+HTVBp36LzroKPs/M4hPCxk7XTaqRZGg==", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.18.tgz", + "integrity": "sha512-r38DFvdv6JzjC/8mHekTaJEXO6hmx+YPIiyjq9oL7DckLmqGkAKbFrmQd2CeKZZ1c372DDVw7lLhYjj/VYCBZQ==", "dev": true, "license": "MIT", "dependencies": { - "@ariakit/react-core": "0.4.17" + "@ariakit/react-core": "0.4.18" }, "funding": { "type": "opencollective", @@ -76,9 +76,9 @@ } }, "node_modules/@ariakit/react-core": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.17.tgz", - "integrity": "sha512-kFF6n+gC/5CRQIyaMTFoBPio2xUe0k9rZhMNdUobWRmc/twfeLVkODx+8UVYaNyKilTge8G0JFqwvFKku/jKEw==", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.18.tgz", + "integrity": "sha512-wHtojXF7KPRwGTSbPg50l203Qngg2aGYCzCut+mYEwe3S0ZzuYVpiY+2Yh15HssnQ/S5yiDGRL4q94UEXsyO+w==", "dev": true, "license": "MIT", "dependencies": { @@ -106,9 +106,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, "license": "MIT", "engines": { @@ -116,22 +116,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -165,16 +165,26 @@ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -212,18 +222,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.28.3", "semver": "^6.3.1" }, "engines": { @@ -252,22 +262,31 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -296,15 +315,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -415,41 +434,41 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -526,14 +545,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -870,15 +889,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -922,9 +941,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", - "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "dev": true, "license": "MIT", "dependencies": { @@ -955,13 +974,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -972,18 +991,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1010,13 +1029,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", - "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1358,16 +1378,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", - "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.3", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1427,9 +1448,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { @@ -1510,9 +1531,9 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", - "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", "dev": true, "license": "MIT", "dependencies": { @@ -1599,9 +1620,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", - "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1733,13 +1754,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", - "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -1994,9 +2015,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -2017,27 +2038,27 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2054,6 +2075,47 @@ "dev": true, "license": "MIT" }, + "node_modules/@cacheable/memoize": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.2.tgz", + "integrity": "sha512-wPrr7FUiq3Qt4yQyda2/NcOLTJCFcQSU3Am2adP+WLy+sz93/fKTokVTHmtz+rjp4PD7ee0AEOeRVNN6IvIfsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.0.2" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.2.tgz", + "integrity": "sha512-sJTITLfeCI1rg7P3ssaGmQryq235EGT8dXGcx6oZwX5NRnKq9IE6lddlllcOl+oXW+yaeTRddCjo0xrfU6ZySA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memoize": "^2.0.1", + "@cacheable/utils": "^2.0.2", + "@keyv/bigmap": "^1.0.2", + "hookified": "^1.12.1", + "keyv": "^5.5.2" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.0.2.tgz", + "integrity": "sha512-JTFM3raFhVv8LH95T7YnZbf2YoE9wEtkPPStuRF9a6ExZ103hFvs+QyCuYJ6r0hA9wRtbzgZtwUCoDWxssZd4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", @@ -2199,14 +2261,14 @@ } }, "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", "dev": true, "license": "MIT", "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/JounQin" } }, "node_modules/@elementor/design-tokens": { @@ -2261,6 +2323,7 @@ "resolved": "https://registry.npmjs.org/@elementor/wp-lite-env/-/wp-lite-env-0.0.20.tgz", "integrity": "sha512-q4DJSCThe0e2k5Wyw1QzhU0IrL302zn6d3wR2aZM9Ktxe+JyhPIgE8OJ4HP0dNyHL0WcNJD/xMEfpsWYNHmcKA==", "dev": true, + "license": "ISC", "dependencies": { "command-line-args": "^6.0.1", "docker-compose": "^1.1.0", @@ -2271,24 +2334,6 @@ "wp-lite-env": "dist/bin.cjs" } }, - "node_modules/@elementor/wp-lite-env/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@elementor/wp-lite-env/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -2381,9 +2426,9 @@ "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", - "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -2504,9 +2549,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -2569,17 +2614,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2587,35 +2625,6 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2629,19 +2638,6 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -2653,31 +2649,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz", - "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.9" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz", - "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.1", - "@floating-ui/utils": "^0.2.9" + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz", - "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", + "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.0.0" + "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", @@ -2685,9 +2681,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, "node_modules/@formatjs/ecma402-abstract": { @@ -2746,21 +2742,58 @@ "tslib": "^2.8.0" } }, + "node_modules/@hapi/address": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-5.1.1.tgz", + "integrity": "sha512-A+po2d/dVoY7cYajycYI43ZbYMXukuopIsqCjh5QzsBCipDtdofHntljDlpccMjIfTy6UOkg+5KPriwYch2bXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^11.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@hapi/formula": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-3.0.2.tgz", + "integrity": "sha512-hY5YPNXzw1He7s0iqkRQi+uMGh383CGdyyIGYtB+W5N3KHPXoqychklvHhKCC9M3Xtv0OCs/IHw+r4dcHtBYWw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.7.tgz", + "integrity": "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/pinpoint": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.1.tgz", + "integrity": "sha512-EKQmr16tM8s16vTT3cA5L0kZZcTMU5DUOZTuvpnY738m+jyP3JIUj+Mm1xc1rsLkGBQ/gVnfKYPwOmPg1tUR4Q==", "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@hapi/tlds": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.3.tgz", + "integrity": "sha512-QIvUMB5VZ8HMLZF9A2oWr3AFM430QC8oGd0L35y2jHpuW6bIIca6x/xL7zUf4J7L9WJ3qjz+iJII8ncaeMbpSg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-6.0.2.tgz", + "integrity": "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@hapi/hoek": "^11.0.2" } }, "node_modules/@humanwhocodes/config-array": { @@ -2780,9 +2813,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2825,16 +2858,27 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@inquirer/ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", + "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/checkbox": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.1.tgz", - "integrity": "sha512-bevKGO6kX1eM/N+pdh9leS5L7TBF4ICrzi9a+cbWkrxeAeIcwlo/7OfWGCDERdRCI2/Q6tjltX4bt07ALHDwFw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", + "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", "@inquirer/figures": "^1.0.13", "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -2850,12 +2894,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", - "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "version": "5.1.18", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz", + "integrity": "sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8" }, "engines": { @@ -2871,14 +2916,15 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.15", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.15.tgz", - "integrity": "sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", + "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", "dev": true, + "license": "MIT", "dependencies": { + "@inquirer/ansi": "^1.0.0", "@inquirer/figures": "^1.0.13", "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", @@ -2897,40 +2943,15 @@ } } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@inquirer/editor": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.17.tgz", - "integrity": "sha512-r6bQLsyPSzbWrZZ9ufoWL+CztkSatnJ6uSxqd6N+o41EZC51sQeWOzI6s5jLb+xxTWxl7PlUppqm8/sow241gg==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", + "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/external-editor": "^1.0.1", + "@inquirer/core": "^10.2.2", + "@inquirer/external-editor": "^1.0.2", "@inquirer/type": "^3.0.8" }, "engines": { @@ -2946,12 +2967,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.17.tgz", - "integrity": "sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==", + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", + "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8", "yoctocolors-cjs": "^2.1.2" }, @@ -2968,13 +2990,14 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dev": true, + "license": "MIT", "dependencies": { "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" + "iconv-lite": "^0.7.0" }, "engines": { "node": ">=18" @@ -2993,17 +3016,19 @@ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@inquirer/input": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.1.tgz", - "integrity": "sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", + "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8" }, "engines": { @@ -3019,12 +3044,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.17.tgz", - "integrity": "sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", + "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8" }, "engines": { @@ -3040,14 +3066,15 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.17.tgz", - "integrity": "sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==", + "version": "4.0.20", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", + "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/type": "^3.0.8" }, "engines": { "node": ">=18" @@ -3062,21 +3089,22 @@ } }, "node_modules/@inquirer/prompts": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", - "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.6.tgz", + "integrity": "sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.2.1", - "@inquirer/confirm": "^5.1.14", - "@inquirer/editor": "^4.2.17", - "@inquirer/expand": "^4.0.17", - "@inquirer/input": "^4.2.1", - "@inquirer/number": "^3.0.17", - "@inquirer/password": "^4.0.17", - "@inquirer/rawlist": "^4.1.5", - "@inquirer/search": "^3.1.0", - "@inquirer/select": "^4.3.1" + "@inquirer/checkbox": "^4.2.4", + "@inquirer/confirm": "^5.1.18", + "@inquirer/editor": "^4.2.20", + "@inquirer/expand": "^4.0.20", + "@inquirer/input": "^4.2.4", + "@inquirer/number": "^3.0.20", + "@inquirer/password": "^4.0.20", + "@inquirer/rawlist": "^4.1.8", + "@inquirer/search": "^3.1.3", + "@inquirer/select": "^4.3.4" }, "engines": { "node": ">=18" @@ -3091,12 +3119,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.5.tgz", - "integrity": "sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", + "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/core": "^10.2.2", "@inquirer/type": "^3.0.8", "yoctocolors-cjs": "^2.1.2" }, @@ -3113,12 +3142,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.0.tgz", - "integrity": "sha512-PMk1+O/WBcYJDq2H7foV0aAZSmDdkzZB9Mw2v/DmONRJopwA/128cS9M/TXWLKKdEQKZnKwBzqu2G4x/2Nqx8Q==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", + "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/core": "^10.2.2", "@inquirer/figures": "^1.0.13", "@inquirer/type": "^3.0.8", "yoctocolors-cjs": "^2.1.2" @@ -3136,15 +3166,16 @@ } }, "node_modules/@inquirer/select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.1.tgz", - "integrity": "sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", + "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.15", + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", "@inquirer/figures": "^1.0.13", "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -3164,6 +3195,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -3181,6 +3213,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3194,10 +3227,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3206,10 +3240,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3222,6 +3257,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3235,10 +3271,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3254,6 +3291,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3283,6 +3321,16 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3293,13 +3341,34 @@ "node": ">=6" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", - "engines": { + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { "node": ">=8" } }, @@ -3626,17 +3695,24 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3648,19 +3724,10 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -3669,61 +3736,47 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@keyv/serialize": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", - "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", + "node_modules/@keyv/bigmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.0.2.tgz", + "integrity": "sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA==", "dev": true, "license": "MIT", "dependencies": { - "buffer": "^6.0.3" + "hookified": "^1.12.1" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/@keyv/serialize/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } + "license": "MIT" }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1" } @@ -3732,7 +3785,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", @@ -3775,9 +3829,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.17.1.tgz", - "integrity": "sha512-OcZj+cs6EfUD39IoPBOgN61zf1XFVY+imsGoBDwXeSq2UHJZE3N59zzBOVjclck91Ne3e9gudONOeILvHCIhUA==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.18.0.tgz", + "integrity": "sha512-jbhwoQ1AY200PSSOrNXmrFCaSDSJWP7qk6urkTmIirvRXDROkqe+QwcLlUiw/PrREwsIF/vm3/dAXvjlMHF0RA==", "license": "MIT", "funding": { "type": "opencollective", @@ -3910,19 +3964,20 @@ } }, "node_modules/@mui/private-theming/node_modules/react-is": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", - "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", "license": "MIT" }, "node_modules/@mui/styled-engine": { - "version": "5.16.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.14.tgz", - "integrity": "sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.18.0.tgz", + "integrity": "sha512-BN/vKV/O6uaQh2z5rXV+MBlVrEkwoS/TK75rFQ2mjxA7+NBo8qtTAOA4UaM0XeJfn7kh2wZ+xQw2HAx0u+TiBg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, @@ -3967,14 +4022,14 @@ "license": "MIT" }, "node_modules/@mui/system": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.17.1.tgz", - "integrity": "sha512-aJrmGfQpyF0U4D4xYwA6ueVtQcEMebET43CUmKMP7e7iFh3sMIF3sBR0l8Urb4pqx1CBjHAaWgB0ojpND4Q3Jg==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", + "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", - "@mui/styled-engine": "^5.16.14", + "@mui/styled-engine": "^5.18.0", "@mui/types": "~7.2.15", "@mui/utils": "^5.17.1", "clsx": "^2.1.0", @@ -4060,18 +4115,18 @@ } }, "node_modules/@mui/system/node_modules/react-is": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", - "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", "license": "MIT" }, "node_modules/@mui/types": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.3.tgz", - "integrity": "sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.6.tgz", + "integrity": "sha512-NVBbIw+4CDMMppNamVxyTccNv0WxtDb7motWDlMeSC8Oy95saj1TIZMGynPpFLePt3yOD8TskzumeqORCgRGWw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.27.1" + "@babel/runtime": "^7.28.3" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4122,9 +4177,9 @@ } }, "node_modules/@mui/utils/node_modules/react-is": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", - "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz", + "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==", "license": "MIT" }, "node_modules/@mui/x-date-pickers": { @@ -4241,212 +4296,825 @@ "node": ">= 8" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "node": ">=8.0.0" } }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" + "node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=14" } }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 10.0.0" + "node": ">=14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@paulirish/trace_engine": { - "version": "0.0.53", - "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.53.tgz", - "integrity": "sha512-PUl/vlfo08Oj804VI5nDPeSk9vyslnBlVzDDwFt8SUVxY8+KdGMkra/vrXjEEHe8gb7+RqVTfOIlGw0nyrEelA==", + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0", "dependencies": { - "legacy-javascript": "latest", - "third-party-web": "latest" + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", "dev": true, - "optional": true, + "license": "Apache-2.0", "engines": { "node": ">=14" } }, - "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=14" }, - "funding": { - "url": "https://opencollective.com/pkgr" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@playwright/test": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.0.tgz", - "integrity": "sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==", + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", + "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.0" - }, - "bin": { - "playwright": "cli.js" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" }, "engines": { - "node": ">=18" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.16.tgz", - "integrity": "sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==", + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.1.tgz", + "integrity": "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-html": "^0.0.9", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^4.2.0", - "source-map": "^0.7.3" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" }, "engines": { - "node": ">= 10.13" + "node": ">=14" }, "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x || 5.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.1.tgz", + "integrity": "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.1.tgz", + "integrity": "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==", "dev": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@puppeteer/browsers": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", - "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.1.tgz", + "integrity": "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.1.tgz", + "integrity": "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.1.tgz", + "integrity": "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.2.tgz", + "integrity": "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.2.tgz", + "integrity": "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/instrumentation": "0.57.2", + "@opentelemetry/semantic-conventions": "1.28.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.1.tgz", + "integrity": "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.1.tgz", + "integrity": "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.1.tgz", + "integrity": "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.1.tgz", + "integrity": "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.1.tgz", + "integrity": "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.52.0.tgz", + "integrity": "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.1.tgz", + "integrity": "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.1.tgz", + "integrity": "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.2.tgz", + "integrity": "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.1.tgz", + "integrity": "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.1.tgz", + "integrity": "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.1.tgz", + "integrity": "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.1.tgz", + "integrity": "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz", + "integrity": "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@paulirish/trace_engine": { + "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.59.tgz", + "integrity": "sha512-439NUzQGmH+9Y017/xCchBP9571J4bzhpcNhrxorf7r37wcyJZkgUfrUsRL3xl+JDcZ6ORhoFCzCw98c6S3YHw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "legacy-javascript": "latest", + "third-party-web": "latest" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", + "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.55.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@prisma/instrumentation": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.11.1.tgz", + "integrity": "sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.8" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4466,6 +5134,27 @@ "node": ">=18" } }, + "node_modules/@puppeteer/browsers/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/@puppeteer/browsers/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -4486,115 +5175,107 @@ "dev": true, "license": "MIT" }, - "node_modules/@sentry-internal/tracing": { - "version": "7.120.3", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.3.tgz", - "integrity": "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sentry/core": "7.120.3", - "@sentry/types": "7.120.3", - "@sentry/utils": "7.120.3" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@sentry/core": { - "version": "7.120.3", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.3.tgz", - "integrity": "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA==", + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", + "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", "dev": true, "license": "MIT", - "dependencies": { - "@sentry/types": "7.120.3", - "@sentry/utils": "7.120.3" - }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@sentry/integrations": { - "version": "7.120.3", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.3.tgz", - "integrity": "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sentry/core": "7.120.3", - "@sentry/types": "7.120.3", - "@sentry/utils": "7.120.3", - "localforage": "^1.8.1" + "node_modules/@sentry/node": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.46.0.tgz", + "integrity": "sha512-pRLqAcd7GTGvN8gex5FtkQR5Mcol8gOy1WlyZZFq4rBbVtMbqKOQRhohwqnb+YrnmtFpj7IZ7KNDo077MvNeOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1", + "@opentelemetry/core": "^1.30.1", + "@opentelemetry/instrumentation": "^0.57.2", + "@opentelemetry/instrumentation-amqplib": "^0.46.1", + "@opentelemetry/instrumentation-connect": "0.43.1", + "@opentelemetry/instrumentation-dataloader": "0.16.1", + "@opentelemetry/instrumentation-express": "0.47.1", + "@opentelemetry/instrumentation-fs": "0.19.1", + "@opentelemetry/instrumentation-generic-pool": "0.43.1", + "@opentelemetry/instrumentation-graphql": "0.47.1", + "@opentelemetry/instrumentation-hapi": "0.45.2", + "@opentelemetry/instrumentation-http": "0.57.2", + "@opentelemetry/instrumentation-ioredis": "0.47.1", + "@opentelemetry/instrumentation-kafkajs": "0.7.1", + "@opentelemetry/instrumentation-knex": "0.44.1", + "@opentelemetry/instrumentation-koa": "0.47.1", + "@opentelemetry/instrumentation-lru-memoizer": "0.44.1", + "@opentelemetry/instrumentation-mongodb": "0.52.0", + "@opentelemetry/instrumentation-mongoose": "0.46.1", + "@opentelemetry/instrumentation-mysql": "0.45.1", + "@opentelemetry/instrumentation-mysql2": "0.45.2", + "@opentelemetry/instrumentation-pg": "0.51.1", + "@opentelemetry/instrumentation-redis-4": "0.46.1", + "@opentelemetry/instrumentation-tedious": "0.18.1", + "@opentelemetry/instrumentation-undici": "0.10.1", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-trace-base": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@prisma/instrumentation": "6.11.1", + "@sentry/core": "9.46.0", + "@sentry/node-core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", + "import-in-the-middle": "^1.14.2", + "minimatch": "^9.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@sentry/node": { - "version": "7.120.3", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.3.tgz", - "integrity": "sha512-t+QtekZedEfiZjbkRAk1QWJPnJlFBH/ti96tQhEq7wmlk3VszDXraZvLWZA0P2vXyglKzbWRGkT31aD3/kX+5Q==", + "node_modules/@sentry/node-core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.46.0.tgz", + "integrity": "sha512-XRVu5pqoklZeh4wqhxCLZkz/ipoKhitctgEFXX9Yh1e1BoHM2pIxT52wf+W6hHM676TFmFXW3uKBjsmRM3AjgA==", "dev": true, "license": "MIT", "dependencies": { - "@sentry-internal/tracing": "7.120.3", - "@sentry/core": "7.120.3", - "@sentry/integrations": "7.120.3", - "@sentry/types": "7.120.3", - "@sentry/utils": "7.120.3" + "@sentry/core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", + "import-in-the-middle": "^1.14.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/types": { - "version": "7.120.3", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.3.tgz", - "integrity": "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/resources": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" } }, - "node_modules/@sentry/utils": { - "version": "7.120.3", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.3.tgz", - "integrity": "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ==", + "node_modules/@sentry/opentelemetry": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.46.0.tgz", + "integrity": "sha512-w2zTxqrdmwRok0cXBoh+ksXdGRUHUZhlpfL/H2kfTodOL+Mk8rW72qUmfqQceXoqgbz8UyK8YgJbyt+XS5H4Qg==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/types": "7.120.3" + "@sentry/core": "9.46.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4607,6 +5288,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4634,10 +5316,17 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@stylistic/stylelint-plugin": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.2.tgz", - "integrity": "sha512-tylFJGMQo62alGazK74MNxFjMagYOHmBZiePZFOJK2n13JZta0uVkB3Bh5qodUmOLtRH+uxH297EibK14UKm8g==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.3.tgz", + "integrity": "sha512-85fsmzgsIVmyG3/GFrjuYj6Cz8rAM7IZiPiXCMiSMfoDOC1lOrzrXPDk24WqviAghnPqGpx8b0caK2PuewWGFg==", "dev": true, "license": "MIT", "dependencies": { @@ -4645,10 +5334,10 @@ "@csstools/css-tokenizer": "^3.0.1", "@csstools/media-query-list-parser": "^3.0.1", "is-plain-object": "^5.0.0", + "postcss": "^8.4.41", "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0", - "style-search": "^0.1.0", - "stylelint": "^16.8.2" + "style-search": "^0.1.0" }, "engines": { "node": "^18.12 || >=20.9" @@ -4841,13 +5530,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/core/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/@svgr/core/node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4875,19 +5557,6 @@ } } }, - "node_modules/@svgr/core/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", @@ -4951,13 +5620,6 @@ "@svgr/core": "*" } }, - "node_modules/@svgr/plugin-svgo/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4985,19 +5647,6 @@ } } }, - "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@svgr/webpack": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", @@ -5027,6 +5676,7 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -5069,6 +5719,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@tannin/sprintf": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@tannin/sprintf/-/sprintf-1.3.3.tgz", + "integrity": "sha512-RwARl+hFwhzy0tg9atWcchLFvoQiOh4rrP7uG2N5E4W80BPCUX0ElcUR9St43fxB9EfjsW2df9Qp+UsTbvQDjA==", + "dev": true, + "license": "MIT" + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5132,19 +5789,19 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5167,6 +5824,7 @@ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -5218,16 +5876,16 @@ } }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.22.tgz", - "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5238,9 +5896,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5263,17 +5921,6 @@ "@types/send": "*" } }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -5302,12 +5949,13 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, @@ -5379,6 +6027,7 @@ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5390,13 +6039,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -5411,20 +6053,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "22.15.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.29.tgz", - "integrity": "sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.12.0" } }, "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", "dev": true, "license": "MIT", "dependencies": { @@ -5444,10 +6096,32 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "license": "MIT" }, "node_modules/@types/qs": { @@ -5465,9 +6139,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "version": "18.3.24", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", + "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -5498,6 +6172,7 @@ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5510,16 +6185,16 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", "dev": true, "license": "MIT", "dependencies": { @@ -5538,9 +6213,9 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", "dev": true, "license": "MIT", "dependencies": { @@ -5549,6 +6224,13 @@ "@types/send": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/sockjs": { "version": "0.3.36", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", @@ -5559,13 +6241,6 @@ "@types/node": "*" } }, - "node_modules/@types/source-list-map": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz", - "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -5573,12 +6248,15 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/tapable": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz", - "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==", + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/tough-cookie": { "version": "4.0.5", @@ -5587,73 +6265,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/uglify-js": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz", - "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/uglify-js/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@types/webpack": { - "version": "4.41.40", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz", - "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - } - }, - "node_modules/@types/webpack-sources/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/webpack/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -5693,16 +6304,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.41.0.tgz", - "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/typescript-estree": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -5718,14 +6329,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", - "integrity": "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.41.0", - "@typescript-eslint/types": "^8.41.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -5740,14 +6351,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", - "integrity": "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5758,9 +6369,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", - "integrity": "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", "engines": { @@ -5919,9 +6530,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.41.0.tgz", - "integrity": "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { @@ -5933,16 +6544,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", - "integrity": "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.41.0", - "@typescript-eslint/tsconfig-utils": "8.41.0", - "@typescript-eslint/types": "8.41.0", - "@typescript-eslint/visitor-keys": "8.41.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6135,13 +6746,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", - "integrity": "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6152,19 +6763,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -6401,15 +6999,15 @@ } }, "node_modules/@wordpress/a11y": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.25.0.tgz", - "integrity": "sha512-9wJZC7gWUrDN1Ybch6pgGZL73kSm2b4dm9YDJtNJuCa/6T7TkVRVdpjVtnTLhvATPSXNV81P/bLK8fWbI3ze0A==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.31.0.tgz", + "integrity": "sha512-LU2Ea+RRaqe1Q8u15Y1dBxXfGwPsOtqXLZR7Bfk7y9yMsJnKqymovR7yvoPYe/4dWXy0B9sK1jUJtPAMUFfOng==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/dom-ready": "^4.25.0", - "@wordpress/i18n": "^5.25.0" + "@wordpress/dom-ready": "^4.31.0", + "@wordpress/i18n": "^6.4.0" }, "engines": { "node": ">=18.12.0", @@ -6429,10 +7027,32 @@ "node": ">=6.9.0" } }, + "node_modules/@wordpress/a11y/node_modules/@wordpress/i18n": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.4.0.tgz", + "integrity": "sha512-tLTjdLw8H778K4fmEo5NDLYJOAgvHxgfLU5N7lPuBy2TKi8tQl24xgmJOlDLiMzbmbSEwvUBZ/4xWJsGq9ITDQ==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.31.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/babel-preset-default": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.25.0.tgz", - "integrity": "sha512-8Sf4pkH7/4pcKt/jOkVNLOoScypMOM2xEHtyiTE5tHgX4z7UZRNbXFKqJ9fxDDb/cniDdNyeG5QhOLIZbO7hlg==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.31.0.tgz", + "integrity": "sha512-9ZOMKyhR5dBwFgXtxyGkwKp/tC6dcKm6zu8v5fXOepdF/in4Z+Bh438dTKCb6QHDcZrrv313S5bnxgWdWypC4A==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -6442,8 +7062,8 @@ "@babel/preset-env": "7.25.7", "@babel/preset-typescript": "7.25.7", "@babel/runtime": "7.25.7", - "@wordpress/browserslist-config": "^6.25.0", - "@wordpress/warning": "^3.25.0", + "@wordpress/browserslist-config": "^6.31.0", + "@wordpress/warning": "^3.31.0", "browserslist": "^4.21.10", "core-js": "^3.31.0", "react": "^18.3.0" @@ -6498,9 +7118,9 @@ } }, "node_modules/@wordpress/base-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.1.0.tgz", - "integrity": "sha512-5AC4M7jXQaSknrSiuBbUWJa00jYr6i3yABf93VFuVzy9QGZQTvupQo2/bi6uAZ98pDruniScrnJJq8UG6JsoJQ==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-6.7.0.tgz", + "integrity": "sha512-Ob2+lGMFJnPZE5OQLEsdvs2Rp1RxemqHufJFg00c5mWCXokKPaDBIa/EcS/O3nsQGA3qYHciUSM1uIYLOUdbzA==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -6509,9 +7129,9 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.25.0.tgz", - "integrity": "sha512-pJdhs1KJES46Z7/EFA4clmXlc+BBMlDrtFjoBX1FC5Lqh4RfJ1YD7VGdMSSuQpCF2iIrU4AijR31AZQ8NOy5mQ==", + "version": "6.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.31.0.tgz", + "integrity": "sha512-ZZZz/VjbHyDEc6/yOzyjyDkBAPbn5+nuDgujwm/GXTo2u0RoyiPTl/uuRsqz32JYhRHMhETxsQPdMZfrAh9lkg==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -6520,9 +7140,9 @@ } }, "node_modules/@wordpress/components": { - "version": "29.11.0", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-29.11.0.tgz", - "integrity": "sha512-p/hicoCxHo4uC5DeGsdLme/JcRwedFkNctKS7uo5dy05odWXWOPDLiSsWYz6F7uCKbmBJNucxdF3f42YTh6y1Q==", + "version": "29.12.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-29.12.0.tgz", + "integrity": "sha512-jE96pUj84OZya54VusRdEIdTiLjbe2Qst3GbHZcQpA5GiSkPBmGjKWpO6FxR7kRDT4GMnZoVxgtV6xJk4IaNQw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -6538,23 +7158,23 @@ "@types/gradient-parser": "0.1.3", "@types/highlight-words-core": "1.2.1", "@use-gesture/react": "^10.3.1", - "@wordpress/a11y": "^4.25.0", - "@wordpress/compose": "^7.25.0", - "@wordpress/date": "^5.25.0", - "@wordpress/deprecated": "^4.25.0", - "@wordpress/dom": "^4.25.0", - "@wordpress/element": "^6.25.0", - "@wordpress/escape-html": "^3.25.0", - "@wordpress/hooks": "^4.25.0", - "@wordpress/html-entities": "^4.25.0", - "@wordpress/i18n": "^5.25.0", - "@wordpress/icons": "^10.25.0", - "@wordpress/is-shallow-equal": "^5.25.0", - "@wordpress/keycodes": "^4.25.0", - "@wordpress/primitives": "^4.25.0", - "@wordpress/private-apis": "^1.25.0", - "@wordpress/rich-text": "^7.25.0", - "@wordpress/warning": "^3.25.0", + "@wordpress/a11y": "^4.26.0", + "@wordpress/compose": "^7.26.0", + "@wordpress/date": "^5.26.0", + "@wordpress/deprecated": "^4.26.0", + "@wordpress/dom": "^4.26.0", + "@wordpress/element": "^6.26.0", + "@wordpress/escape-html": "^3.26.0", + "@wordpress/hooks": "^4.26.0", + "@wordpress/html-entities": "^4.26.0", + "@wordpress/i18n": "^5.26.0", + "@wordpress/icons": "^10.26.0", + "@wordpress/is-shallow-equal": "^5.26.0", + "@wordpress/keycodes": "^4.26.0", + "@wordpress/primitives": "^4.26.0", + "@wordpress/private-apis": "^1.26.0", + "@wordpress/rich-text": "^7.26.0", + "@wordpress/warning": "^3.26.0", "change-case": "^4.1.2", "clsx": "^2.1.1", "colord": "^2.7.0", @@ -6616,21 +7236,21 @@ } }, "node_modules/@wordpress/compose": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.25.0.tgz", - "integrity": "sha512-nfjtMZgrhdHU8/zOLUyA5o8ShLot1vbHZ0I2+IxLyNskRMVyR9pm4BAJSYKJ9XqBUom2/N51gfeKg5uhd9Y0TQ==", + "version": "7.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.31.0.tgz", + "integrity": "sha512-kxb1qHhiFwUDifBM9r4JZ3gYC1ZUvck5tgjmaWeg8EqIEnVn+Z7C+ntNA9ySLWrmDYc4Gki7YJZbfVHzrtcDLg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", "@types/mousetrap": "^1.6.8", - "@wordpress/deprecated": "^4.25.0", - "@wordpress/dom": "^4.25.0", - "@wordpress/element": "^6.25.0", - "@wordpress/is-shallow-equal": "^5.25.0", - "@wordpress/keycodes": "^4.25.0", - "@wordpress/priority-queue": "^3.25.0", - "@wordpress/undo-manager": "^1.25.0", + "@wordpress/deprecated": "^4.31.0", + "@wordpress/dom": "^4.31.0", + "@wordpress/element": "^6.31.0", + "@wordpress/is-shallow-equal": "^5.31.0", + "@wordpress/keycodes": "^4.31.0", + "@wordpress/priority-queue": "^3.31.0", + "@wordpress/undo-manager": "^1.31.0", "change-case": "^4.1.2", "clipboard": "^2.0.11", "mousetrap": "^1.6.5", @@ -6658,20 +7278,20 @@ } }, "node_modules/@wordpress/data": { - "version": "10.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.25.0.tgz", - "integrity": "sha512-PHfF7S2jhgcH9D3Z9nskaQEDIbh0k0MX6KprzK4plT4Xu71YboMVWnBx78glzMMu17DOFoHJC25d+ymfGBM5rw==", + "version": "10.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.31.0.tgz", + "integrity": "sha512-iuQxrmbW55q+xy7lnXH8D6qHFAoG0/YcnjZ6jvqpDekRhdgl4kAPE+crx/kJ5RkrIIo38a+cLgVskCaKo+9E3w==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/compose": "^7.25.0", - "@wordpress/deprecated": "^4.25.0", - "@wordpress/element": "^6.25.0", - "@wordpress/is-shallow-equal": "^5.25.0", - "@wordpress/priority-queue": "^3.25.0", - "@wordpress/private-apis": "^1.25.0", - "@wordpress/redux-routine": "^5.25.0", + "@wordpress/compose": "^7.31.0", + "@wordpress/deprecated": "^4.31.0", + "@wordpress/element": "^6.31.0", + "@wordpress/is-shallow-equal": "^5.31.0", + "@wordpress/priority-queue": "^3.31.0", + "@wordpress/private-apis": "^1.31.0", + "@wordpress/redux-routine": "^5.31.0", "deepmerge": "^4.3.0", "equivalent-key-map": "^0.2.2", "is-plain-object": "^5.0.0", @@ -6702,14 +7322,14 @@ } }, "node_modules/@wordpress/date": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.25.0.tgz", - "integrity": "sha512-w3De486/qx2/MbxCCjiW7KS8lGhJ00VvnrbXRlrY9l/6yqbz0iMVglmFKrlLPftgutyhe3OSOSZsXX/uCF6yOg==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.31.0.tgz", + "integrity": "sha512-xqKytkb60N9i+ETqTI+Asgb1myZIgnUne8zsGaYQU+B7H1M3ELw4lmc+ptDXjXrpI1Yb6BGUad4EIHBGVk+mog==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/deprecated": "^4.25.0", + "@wordpress/deprecated": "^4.31.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40" }, @@ -6732,9 +7352,9 @@ } }, "node_modules/@wordpress/dependency-extraction-webpack-plugin": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.25.0.tgz", - "integrity": "sha512-bAVve8ksBNfCcBq09IoTLCdF604UXtVh4Fb+/LBqyJc1kTTS02PsIv5aguSvCjcNSakQgvs7IJqEGJ2ZmP4JZg==", + "version": "6.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.31.0.tgz", + "integrity": "sha512-5PFebfXy1nCV6qj54CDqMRTfcy5bf9/KPo0VvPATZeqQbhQ9rvbt7v1nkbwYQ/Nf/2meKm3J0zt25M93rpJctQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -6756,14 +7376,14 @@ "license": "BSD" }, "node_modules/@wordpress/deprecated": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.25.0.tgz", - "integrity": "sha512-NfVGSVfAESrgQRQu5QpyprTsDY0BLq6hJ2KrWlpscLetApxU5kSpP/wRzmjbtuuWSr5RsoopaeoTbiZNXb0QEA==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.31.0.tgz", + "integrity": "sha512-bbDrL2lp7crFfvmJ1EYVxPDcheTIwimt3gVzqQWCDr0SSCQw4fii5NEKOrUnWhz51YCuPbfWXUBaFlbAMS2CXw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/hooks": "^4.25.0" + "@wordpress/hooks": "^4.31.0" }, "engines": { "node": ">=18.12.0", @@ -6784,14 +7404,14 @@ } }, "node_modules/@wordpress/dom": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.25.0.tgz", - "integrity": "sha512-uyP8oTjSYjU+OXSvpPITqMaF9Dk50WH7fiQIVUcjC/9VmrzIiaYaZ4USmuoUBtbFjJsSyANHw/anYMFqby9iIA==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.31.0.tgz", + "integrity": "sha512-5/RBy9OreQktnBE75cB3R6Lva5c6hUlXvPo1NFfAebLeXX+7swZBmLYZnyf7dZbARRdqSwkundHZoKLcHa+20A==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/deprecated": "^4.25.0" + "@wordpress/deprecated": "^4.31.0" }, "engines": { "node": ">=18.12.0", @@ -6799,9 +7419,9 @@ } }, "node_modules/@wordpress/dom-ready": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.25.0.tgz", - "integrity": "sha512-HvGxncRhskqrkwyIPVsfznToFtSr6X0zBrIMHK7bgwGGiMr+yz5jYX3wnY1AsUDSr95ezhbCTdE2rNmvFkCD0g==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.31.0.tgz", + "integrity": "sha512-aRM4l5wzkrqAU686s4fz1bb+/7/BOFp+sXB0kx1vkiXl3ocfmHAr3jwEYU+OH/sX6Is3Ntkfh0uZe3EJLsqHTQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -6839,9 +7459,9 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.25.0.tgz", - "integrity": "sha512-M1jn4qH9iq1igLZ+sMQYNWp0P1tDgDsXF1iWWdqRn9wWcwHFn7iyDEEZ68uXzNvavkGyIHxZIoBcmKGeUA11/A==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.31.0.tgz", + "integrity": "sha512-iOMZfnYxartxmI/9nnCzPH6LbveFxKdtpT040U4ccTYtN33YiUTPap9pDmwmR+Lc6UC9nIzdfQVmgbFly25q1A==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -6861,16 +7481,16 @@ } }, "node_modules/@wordpress/element": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.25.0.tgz", - "integrity": "sha512-zxdaf2s/en5Y+DfiswRZtQ+P8SvQ18+l5I2WmHb66+bVkFg7jrN+AJqLk86k2zcalOEjx7Fg4cce1wWytp8Wsw==", + "version": "6.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.31.0.tgz", + "integrity": "sha512-KOier6Y4b4Y5yEV1GYen81R9gCEOvJT6eVbsc93w2fFEKi2FK/oI7IKzGv9GeJMkoCWvTSX6C/ZYTWk6fCUfeA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.25", - "@wordpress/escape-html": "^3.25.0", + "@wordpress/escape-html": "^3.31.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^18.3.0", @@ -6895,10 +7515,11 @@ } }, "node_modules/@wordpress/env": { - "version": "10.28.0", - "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.28.0.tgz", - "integrity": "sha512-4SbePb8kcD3mCUb2LXDp27luIP+ocT6Mvg42GK0loeUHk9KeiQJvrCvb6g2EFl0oVoOrX5voLb23x/+V3GIH0Q==", + "version": "10.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.31.0.tgz", + "integrity": "sha512-y/qCaz6CpAkjNgdCyZ7IQk56E0tvED6k6lwebWzlV5uN6fnoftjsAzh8RMu4Q+yxjycQaAv7TEd1K4kj/Y4zww==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { "@inquirer/prompts": "^7.2.0", "chalk": "^4.0.0", @@ -6921,13 +7542,14 @@ "npm": ">=8.19.2" } }, - "node_modules/@wordpress/env/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@wordpress/env/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "sprintf-js": "~1.0.2" } }, "node_modules/@wordpress/env/node_modules/docker-compose": { @@ -6935,6 +7557,7 @@ "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", "dev": true, + "license": "MIT", "dependencies": { "yaml": "^2.2.2" }, @@ -6942,67 +7565,33 @@ "node": ">= 6.0.0" } }, - "node_modules/@wordpress/env/node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/@wordpress/env/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@wordpress/env/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@wordpress/env/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/@wordpress/env/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "node_modules/@wordpress/env/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "BSD-3-Clause" }, "node_modules/@wordpress/env/node_modules/yaml": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -7011,9 +7600,9 @@ } }, "node_modules/@wordpress/escape-html": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.25.0.tgz", - "integrity": "sha512-sQ3graObu5K/RWrngk9bsULJ+9E7QLC6gMG34ja0Jm1LdeRjVgHv3FqP/uIkL36EvxEkjQ0LSbgbZsdV/E1q0w==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.31.0.tgz", + "integrity": "sha512-9g9qd7Q16PWDeYEa2dU+84d1SvjP4LfS7n7AuXkwl5+F7KfL2nZTmDTHWutw9jVjdDAGmjm1VNIj4ydQk9vaLA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7038,17 +7627,17 @@ } }, "node_modules/@wordpress/eslint-plugin": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.11.0.tgz", - "integrity": "sha512-JxN4T7r0k9lePG1dDJ2bxyqc5zFtLeTY0Ns8EfU2G/QZsB6gvxGTLhK2u6csflswUt2vnJ3oCT5MbPfANJuLDg==", + "version": "22.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.17.0.tgz", + "integrity": "sha512-2Qu8YxjbpvvSblPpYm0otOWUSILX3DmEcUPLrBTW4dD3VlYDr3O0Wk2pk+fmGMVZxt6bZ5cd4bkV1oCnW/3DyQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/eslint-parser": "7.25.7", "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/parser": "^6.4.1", - "@wordpress/babel-preset-default": "^8.25.0", - "@wordpress/prettier-config": "^4.25.0", + "@wordpress/babel-preset-default": "^8.31.0", + "@wordpress/prettier-config": "^4.31.0", "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.25.2", @@ -7385,22 +7974,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@wordpress/eslint-plugin/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@wordpress/eslint-plugin/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", @@ -7443,23 +8016,10 @@ "typescript": ">=4.2.0" } }, - "node_modules/@wordpress/eslint-plugin/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@wordpress/hooks": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.25.0.tgz", - "integrity": "sha512-IWqgozRE+8PE96TIsf5bfS7ezZfvleSm1YZAuhAWYH7QUVm07WK7/yhhDYkj9QyTpWSZnGkmR7YYH/NJ8jaMDQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.31.0.tgz", + "integrity": "sha512-8YOftWP54V4hvO46/FgXnpiB/fAC72CWD/F1JYtcfZcrWgbR96MGZxKXNvn5BgLx6juO36QQuFhJ5y2ZUEulkw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7484,9 +8044,9 @@ } }, "node_modules/@wordpress/html-entities": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.25.0.tgz", - "integrity": "sha512-SEf8nnLm85KH2fZiEzUgLuh4Nd53iW0rmA5k9xM7n0uM6BA6HMDidtT/5wxTlnMH8cxOSjL2IkCHwhuRFTibbg==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.31.0.tgz", + "integrity": "sha512-5dk9h16jSXDTSdk0HnyXEOgZd7VSsMtr3YCSUQvzIYOFkpW2q1eB10coXHiuz0Z5ArlTuNYSfBd2J02xnG+a8g==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7511,14 +8071,14 @@ } }, "node_modules/@wordpress/i18n": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.25.0.tgz", - "integrity": "sha512-6MWkwmA9dwiLA+N4cj81JxxSqgJ+5HeLZHa3Sy2u7A2f4wgGCH+Bj2T6eQnZdky9fMy4vjvUpUZdv5sdmtYJlQ==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.26.0.tgz", + "integrity": "sha512-YHzaUWlCuN2ynl47qbsdMkTGtP52+E1giDOdWBgUaSexUYjbeFxKFUzRMB0Wuh1psL80+VzvJOH/mU440KAJnA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/hooks": "^4.25.0", + "@wordpress/hooks": "^4.26.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "sprintf-js": "^1.1.1", @@ -7546,15 +8106,15 @@ } }, "node_modules/@wordpress/icons": { - "version": "10.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.25.0.tgz", - "integrity": "sha512-CNAgZ0ZE6pPjLWxPLBdmIQlxpkQCNZ9Zv4wuUDSMqG0jJDdf+YCpklwIMLWbv9WVubmzgURo54qeCedbpXhCjA==", + "version": "10.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.31.0.tgz", + "integrity": "sha512-Bfwt3SyjqClG6mwY78zhlzVRRW/OIqej09NLOGO0CDtjfrgQqD5HAK8kk2CayQr4hWeKMoFxzPBevMxWumBMPA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/element": "^6.25.0", - "@wordpress/primitives": "^4.25.0" + "@wordpress/element": "^6.31.0", + "@wordpress/primitives": "^4.31.0" }, "engines": { "node": ">=18.12.0", @@ -7575,9 +8135,9 @@ } }, "node_modules/@wordpress/is-shallow-equal": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.25.0.tgz", - "integrity": "sha512-/37IIoJz8/mp7TGZbdmakXr6YKqvpjYUHJx9LA9ibVVh6AsM72nI7N5V3AsGndan46vItfzhs0zpEWI7xF86Gw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.31.0.tgz", + "integrity": "sha512-jqGEw+5DLNf2kNbjaNxIKWQGYkqxygRYDYTdhZ+f+Btw/gMKILJq0sZGRD8YjJFGG0cOC2qxtJnr9oF36Iu96Q==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7602,9 +8162,9 @@ } }, "node_modules/@wordpress/jest-console": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.25.0.tgz", - "integrity": "sha512-X2YzKV1Pv5PC6QHqUp+FDlBgu7C+a2Yxdk6p4XDsTIjLV+I7eQuAdBUMzjyKSd1wN/Tx0x6Dr7/HmrV0ThRm1Q==", + "version": "8.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.31.0.tgz", + "integrity": "sha512-pkeMoLokwUTsQpDxmzKtLS10JQhVln+TgibuDiygCnEWnR78G6++1l4PPgtRR33qdwyXlWIDZhLdBBGRRA3sOg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7633,13 +8193,13 @@ } }, "node_modules/@wordpress/jest-preset-default": { - "version": "12.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.25.0.tgz", - "integrity": "sha512-YLKfgQl5ZW63XuJh24Mzv1yXIO4otTXg9fTbSsEAHhZI8KQL9VuFJgNQ4hE8lZV2Wbmy6Njh8q4TY05/oMJ3KA==", + "version": "12.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.31.0.tgz", + "integrity": "sha512-e03LT1SvaciRhSfVkn6ZpAvZ6B8non9NKfdYNV9N6WQiVlega6S0I8gDS7/IDhEwa8RqQA8lWzqhrrcr3tj4cQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/jest-console": "^8.25.0", + "@wordpress/jest-console": "^8.31.0", "babel-jest": "29.7.0" }, "engines": { @@ -7652,14 +8212,14 @@ } }, "node_modules/@wordpress/keycodes": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.25.0.tgz", - "integrity": "sha512-cnV4/7RY4m+DNo3BF10pHdFITKyoYr4TqvcSmka5O7RulPQi/PTeLcFgTTM+LrULGSNfV5ZUgIuPwLpLA5pqGQ==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.31.0.tgz", + "integrity": "sha512-TmweVWZKUu3DreU9SAX69h7wGNnsl5cnN5S3RTVK3aMNOGhJabC7j7rueCmBgqgOFvzNEXeIL+SuYtWpIyEVsA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/i18n": "^5.25.0" + "@wordpress/i18n": "^6.4.0" }, "engines": { "node": ">=18.12.0", @@ -7671,24 +8231,46 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dev": true, - "license": "MIT", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@wordpress/keycodes/node_modules/@wordpress/i18n": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.4.0.tgz", + "integrity": "sha512-tLTjdLw8H778K4fmEo5NDLYJOAgvHxgfLU5N7lPuBy2TKi8tQl24xgmJOlDLiMzbmbSEwvUBZ/4xWJsGq9ITDQ==", + "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/runtime": "7.25.7", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.31.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.12.0", + "npm": ">=8.19.2" } }, "node_modules/@wordpress/notices": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.25.0.tgz", - "integrity": "sha512-BvgvvFPa9eA98Xiyb0NeTqfuVfD+5TMfBmWId+y6iwbplKHetW/Bj/36qRWzUGptPh3ae7NKc/ovi4KDO4t9og==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.31.0.tgz", + "integrity": "sha512-dU8ARG3UP1PSmPMfQNrz1DpDIn5xuW6t1J+mVkyAbq2o1+Fs72Fsmi6hXPc0ut+P0pGTmsASzIeo7CzZUihmGw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/a11y": "^4.25.0", - "@wordpress/data": "^10.25.0" + "@wordpress/a11y": "^4.31.0", + "@wordpress/data": "^10.31.0" }, "engines": { "node": ">=18.12.0", @@ -7712,9 +8294,9 @@ } }, "node_modules/@wordpress/npm-package-json-lint-config": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.25.0.tgz", - "integrity": "sha512-wB35qxGlVkBx0GdoxDXjySMACHYgfrFacYcP6IkYHMu1e7/HU/Kz8ZW2g+4A+nea/SPO46V6xuSbayrYy6c+UQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.31.0.tgz", + "integrity": "sha512-FKlLoQx6q9lc/9drC77uHePYYnFCKKa/4ozmHHWad+EHKukmHZjoMnObv0cry4lsA/NCoUORDDODUjfiUFuliA==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -7726,13 +8308,13 @@ } }, "node_modules/@wordpress/postcss-plugins-preset": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.25.0.tgz", - "integrity": "sha512-J9RK9R1cwiOBXC/iORi1Kz1i9VEASAv7OnERGxtHtbXFsPXq1cHDNJ3slwYGovUPjMOvfDNMjCgTWtM3MizEag==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.31.0.tgz", + "integrity": "sha512-nGhn23e5lRfFD9nba7CI7MgJRA8pKDrzmqmly+Z5Wc1ggcpJayiCCc1y8Rujotr2gSMJO29wwr4RMW6yIDqbEw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/base-styles": "^6.1.0", + "@wordpress/base-styles": "^6.7.0", "autoprefixer": "^10.4.20" }, "engines": { @@ -7744,9 +8326,9 @@ } }, "node_modules/@wordpress/prettier-config": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.25.0.tgz", - "integrity": "sha512-P18anKvMO9lEpr2827No0SFmeypX1A5Ce3DZ4NdNNnoJRGYkdlwRzwMpMoB9XpAQz5o45ystBrak2/OqzdBWLg==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.31.0.tgz", + "integrity": "sha512-gEnLhuM27DFZIdDaftx32ZCdiklP0mvTNTYDULpJ00HQyq0sqTAJ9bjWYR9YSt+2pCfwFd4o721f9vT2fVYoTA==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -7758,14 +8340,14 @@ } }, "node_modules/@wordpress/primitives": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.25.0.tgz", - "integrity": "sha512-I8voo9KWDFOgVUzxO0n1UtaTGBwhA/MuYmh6Bpn4M33SQAm4K5aUFidnJOelILWSA4Ox4R7wskGhuItfyty1LA==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.31.0.tgz", + "integrity": "sha512-cY4EKYQRqHu9NZuoWchxc/KWiofwGskzxz0oCfgbdkRlfTag8yBjWMayz+fRNaenw0l5pzLyIg3rcNDN8xLezw==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/element": "^6.25.0", + "@wordpress/element": "^6.31.0", "clsx": "^2.1.1" }, "engines": { @@ -7800,9 +8382,9 @@ } }, "node_modules/@wordpress/priority-queue": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.25.0.tgz", - "integrity": "sha512-HtN8G1o/TaUIhapJf6Kq2dy1OOpC1beGB7sJUvq5JrwKd3VRdrXx0K3HKoHe99EJoE9v6lgEIS5VtVIaW0u0cQ==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.31.0.tgz", + "integrity": "sha512-OuHq9iGB8wppHfoMHs4g07Cc2yh2DyyqySDn+bpyXPbDcuqxU9s9EgjY08ZVjJEYMuFz2sjC16HlOFqv3NBYAg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7828,9 +8410,9 @@ } }, "node_modules/@wordpress/private-apis": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.25.0.tgz", - "integrity": "sha512-O+Vo4h1CjKkYubduKVXW2fi7vvse7YyyvQOEdCut0Sl9uc0lVoHB0Wstc2sHllDTAI2fyjTLrLbddYuM7sVvMA==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.31.0.tgz", + "integrity": "sha512-OS/OvnUFj2QKeAsPGwgzETLPQhN8Ek1AC3q7rpuu+kZhZxB5hOsHDF/759XxH0fGPL/n0/Xqo4ZlnVYwPwqMPg==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7855,9 +8437,9 @@ } }, "node_modules/@wordpress/redux-routine": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.25.0.tgz", - "integrity": "sha512-0YZNyuL1QO3CbA6njHzoHMmYX+tnOSUIOpag5jeeNKzNE7iThKRmD07HtMo+hL5B3EFumvWDXlwOLpoi2xBJuw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.31.0.tgz", + "integrity": "sha512-J16NmvIxWMU4lJMWrAshLCac5qjIs1QZnSzQXNKBXxg78ZjB7sa5Q9Qb8/aYxFVIIzTvpvDQVyHhHPcUnB4KYA==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -7888,21 +8470,22 @@ } }, "node_modules/@wordpress/rich-text": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.25.0.tgz", - "integrity": "sha512-7M7kD5ix4XjuNRZP4ijG9jGhK+alMVO9nB2jCHIZW8RoGpnZ5QdITGQ25OOYhcIcBhRcAxP+1JS0yn2qzqkBOw==", + "version": "7.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.31.0.tgz", + "integrity": "sha512-s1CHb9vFYxa/fOPXSMn8GauOYb+gSVczHHx06Hj86JilGNAKmALADqzR+6D6ACKjahQypduYsF9P669PY7+PrQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/a11y": "^4.25.0", - "@wordpress/compose": "^7.25.0", - "@wordpress/data": "^10.25.0", - "@wordpress/deprecated": "^4.25.0", - "@wordpress/element": "^6.25.0", - "@wordpress/escape-html": "^3.25.0", - "@wordpress/i18n": "^5.25.0", - "@wordpress/keycodes": "^4.25.0", + "@wordpress/a11y": "^4.31.0", + "@wordpress/compose": "^7.31.0", + "@wordpress/data": "^10.31.0", + "@wordpress/deprecated": "^4.31.0", + "@wordpress/element": "^6.31.0", + "@wordpress/escape-html": "^3.31.0", + "@wordpress/i18n": "^6.4.0", + "@wordpress/keycodes": "^4.31.0", + "colord": "2.9.3", "memize": "^2.1.0" }, "engines": { @@ -7926,33 +8509,54 @@ "node": ">=6.9.0" } }, + "node_modules/@wordpress/rich-text/node_modules/@wordpress/i18n": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-6.4.0.tgz", + "integrity": "sha512-tLTjdLw8H778K4fmEo5NDLYJOAgvHxgfLU5N7lPuBy2TKi8tQl24xgmJOlDLiMzbmbSEwvUBZ/4xWJsGq9ITDQ==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "@tannin/sprintf": "^1.3.2", + "@wordpress/hooks": "^4.31.0", + "gettext-parser": "^1.3.1", + "memize": "^2.1.0", + "tannin": "^1.2.0" + }, + "bin": { + "pot-to-php": "tools/pot-to-php.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, "node_modules/@wordpress/scripts": { - "version": "30.18.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.18.0.tgz", - "integrity": "sha512-NVtJYcmWjq57TDc0kStw0oeejpejH2KSJklOrDKf4Sah4gDQqy695COnHSVVoujCgUm6a5uv5+3mpujF08JsRA==", + "version": "30.24.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.24.0.tgz", + "integrity": "sha512-8L2tDBcopC0uFbIH7mFUNM+6Ib+hvc+56L5hOMVmwMNMUSSTXxrnEelsbhc/SM99E3Dy75KFa18lk2Y3Dzr5IQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.25.0", - "@wordpress/browserslist-config": "^6.25.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.25.0", - "@wordpress/e2e-test-utils-playwright": "^1.25.0", - "@wordpress/eslint-plugin": "^22.11.0", - "@wordpress/jest-preset-default": "^12.25.0", - "@wordpress/npm-package-json-lint-config": "^5.25.0", - "@wordpress/postcss-plugins-preset": "^5.25.0", - "@wordpress/prettier-config": "^4.25.0", - "@wordpress/stylelint-config": "^23.17.0", + "@wordpress/babel-preset-default": "^8.31.0", + "@wordpress/browserslist-config": "^6.31.0", + "@wordpress/dependency-extraction-webpack-plugin": "^6.31.0", + "@wordpress/e2e-test-utils-playwright": "^1.31.0", + "@wordpress/eslint-plugin": "^22.17.0", + "@wordpress/jest-preset-default": "^12.31.0", + "@wordpress/npm-package-json-lint-config": "^5.31.0", + "@wordpress/postcss-plugins-preset": "^5.31.0", + "@wordpress/prettier-config": "^4.31.0", + "@wordpress/stylelint-config": "^23.23.0", "adm-zip": "^0.5.9", "babel-jest": "29.7.0", "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", - "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", @@ -8002,9 +8606,15 @@ "npm": ">=8.19.2" }, "peerDependencies": { - "@playwright/test": "^1.51.1", + "@playwright/test": "^1.55.0", + "@wordpress/env": "^10.0.0", "react": "^18.0.0", "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@wordpress/env": { + "optional": true + } } }, "node_modules/@wordpress/scripts/node_modules/@babel/core": { @@ -8297,9 +8907,9 @@ } }, "node_modules/@wordpress/stylelint-config": { - "version": "23.17.0", - "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.17.0.tgz", - "integrity": "sha512-FYA2pEJWLfC3g08rmBmEY6frRD45NLBpLX1W4tLgPDFwC21WHr9aEvIdPS4YF+1/kNwRGWdkTITcR2Lq5dZ4wg==", + "version": "23.23.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.23.0.tgz", + "integrity": "sha512-YgaXlLieNrvES5qasprBmkXDQhbNWZFI2cc/aHrGl27ZbEeS/sn3s/lNQCEF5y8y36xe6Jhtydsw5WFG64ZAqA==", "dev": true, "license": "MIT", "dependencies": { @@ -8317,14 +8927,14 @@ } }, "node_modules/@wordpress/undo-manager": { - "version": "1.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.25.0.tgz", - "integrity": "sha512-Y+f8Xa+vpG+Cj/ekeI6ky54p/UTlFUZmutBusmsH+QzaGHb9bVKHPhXfTLyjhdDIUE3YV0vqz32DjNrbuiGRWg==", + "version": "1.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.31.0.tgz", + "integrity": "sha512-4jsvLaf+O/AMX/2m34BHS4Jz/Z+9vfxkNLP0mhuqftOWRC66XFseMqU19VszQypL7VxWKMahenYqZw4O22JNnQ==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { "@babel/runtime": "7.25.7", - "@wordpress/is-shallow-equal": "^5.25.0" + "@wordpress/is-shallow-equal": "^5.31.0" }, "engines": { "node": ">=18.12.0", @@ -8345,9 +8955,9 @@ } }, "node_modules/@wordpress/warning": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.25.0.tgz", - "integrity": "sha512-Pp4+1zgY6wDqiGPpb33+B7YplujkFyMVmi2VDBbJcy/OEXNU/cowfjYuGxgyQpJlCpKnrmVYV+snowZ3Iytk0g==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.31.0.tgz", + "integrity": "sha512-Npw1Apa6r+K+jtX40ABWAXv7J1bVnOi6h9VPiMY8l/iZoRHBXao8HTgQnIoCm+GzymaQs6NQoH4X8UAClggeXA==", "dev": true, "license": "GPL-2.0-or-later", "engines": { @@ -8402,9 +9012,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -8425,6 +9035,29 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -8576,6 +9209,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", @@ -8663,21 +9309,11 @@ } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "BSD-3-Clause" + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", @@ -8704,6 +9340,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } @@ -8765,16 +9402,6 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", @@ -8957,10 +9584,21 @@ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, + "node_modules/atomically": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", + "dev": true, + "dependencies": { + "stubborn-fs": "^1.2.5", + "when-exit": "^2.1.1" + } + }, "node_modules/autoprefixer": { "version": "10.4.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -9026,14 +9664,14 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -9047,13 +9685,6 @@ "node": ">= 0.4" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -9143,14 +9774,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -9172,22 +9803,22 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -9208,7 +9839,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -9236,24 +9867,25 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", - "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", + "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" }, "engines": { "bare": ">=1.16.0" @@ -9268,9 +9900,9 @@ } }, "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -9290,9 +9922,9 @@ } }, "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -9312,6 +9944,17 @@ } } }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -9333,6 +9976,16 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.9.tgz", + "integrity": "sha512-hY/u2lxLrbecMEWSB0IpGzGyDyeoMFQhCvZd2jGFSE5I17Fh01sYUBPCJtkWERw7zrac9+cIghxm/ytJa2X8iA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -9447,9 +10100,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9470,9 +10123,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", "dev": true, "funding": [ { @@ -9490,9 +10143,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -9578,14 +10232,17 @@ } }, "node_modules/cacheable": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.9.0.tgz", - "integrity": "sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.0.2.tgz", + "integrity": "sha512-dWjhLx8RWnPsAWVKwW/wI6OJpQ/hSVb1qS0NUif8TR9vRiSwci7Gey8x04kRU9iAF+Rnbtex5Kjjfg/aB5w8Pg==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.8.2", - "keyv": "^5.3.3" + "@cacheable/memoize": "^2.0.2", + "@cacheable/memory": "^2.0.2", + "@cacheable/utils": "^2.0.2", + "hookified": "^1.12.1", + "keyv": "^5.5.2" } }, "node_modules/cacheable-lookup": { @@ -9593,6 +10250,7 @@ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.6.0" } @@ -9602,6 +10260,7 @@ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -9615,29 +10274,14 @@ "node": ">=8" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cacheable/node_modules/keyv": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz", - "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.3.tgz", + "integrity": "sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A==", "dev": true, "license": "MIT", "dependencies": { - "@keyv/serialize": "^1.0.3" + "@keyv/serialize": "^1.1.1" } }, "node_modules/call-bind": { @@ -9751,6 +10395,16 @@ "node": ">=6" } }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -9765,9 +10419,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001721", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", - "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", "dev": true, "funding": [ { @@ -9849,7 +10503,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/check-node-version": { "version": "4.2.1", @@ -9902,9 +10557,9 @@ } }, "node_modules/chrome-launcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.2.0.tgz", - "integrity": "sha512-JbuGuBNss258bvGil7FT4HKdC3SC2K7UAEUqiPy3ACS3Yxo3hAW6bvFpCu2HsIJLgTqxgEX6BkujvzZfLpUD0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.2.1.tgz", + "integrity": "sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9973,28 +10628,12 @@ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, - "node_modules/clean-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/webpack": "^4.4.31", - "del": "^4.1.1" - }, - "engines": { - "node": ">=8.9.0" - }, - "peerDependencies": { - "webpack": "*" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -10007,6 +10646,7 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" }, @@ -10019,6 +10659,7 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, + "license": "ISC", "engines": { "node": ">= 12" } @@ -10050,11 +10691,30 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -10094,6 +10754,7 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -10179,6 +10840,7 @@ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-6.0.1.tgz", "integrity": "sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^6.2.2", "find-replace": "^5.0.2", @@ -10238,9 +10900,9 @@ } }, "node_modules/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, "license": "MIT", "dependencies": { @@ -10248,7 +10910,7 @@ "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -10288,6 +10950,7 @@ "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -10295,89 +10958,25 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.1.0.tgz", + "integrity": "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" + "atomically": "^2.0.3", + "dot-prop": "^9.0.0", + "graceful-fs": "^4.2.11", + "xdg-basedir": "^5.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -10451,12 +11050,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-1.3.0.tgz", "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/copy-webpack-plugin": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.0.tgz", - "integrity": "sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-13.0.1.tgz", + "integrity": "sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==", "dev": true, "license": "MIT", "dependencies": { @@ -10478,9 +11078,9 @@ } }, "node_modules/core-js": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", - "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10490,13 +11090,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "browserslist": "^4.25.3" }, "funding": { "type": "opencollective", @@ -10504,9 +11104,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", - "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.45.1.tgz", + "integrity": "sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -10572,17 +11172,7 @@ "which": "^2.0.1" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">= 8" } }, "node_modules/csp_evaluator": { @@ -10593,9 +11183,9 @@ "license": "Apache-2.0" }, "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", "dev": true, "license": "ISC", "engines": { @@ -10665,9 +11255,9 @@ } }, "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10696,9 +11286,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11010,9 +11600,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -11064,9 +11654,9 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, @@ -11075,6 +11665,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -11090,6 +11681,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -11098,9 +11690,9 @@ } }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -11157,6 +11749,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -11169,6 +11762,7 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -11234,65 +11828,6 @@ "node": ">= 14" } }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -11362,9 +11897,9 @@ "license": "MIT" }, "node_modules/devtools-protocol": { - "version": "0.0.1467305", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1467305.tgz", - "integrity": "sha512-LxwMLqBoPPGpMdRL4NkLFRNy3QLp6Uqa7GNp1v6JaBheop2QrB9Q7q0A/q/CYYP9sBfZdHOyszVx4gc9zyk7ow==", + "version": "0.0.1507524", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz", + "integrity": "sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w==", "dev": true, "license": "BSD-3-Clause" }, @@ -11405,10 +11940,11 @@ } }, "node_modules/docker-compose": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.2.0.tgz", - "integrity": "sha512-wIU1eHk3Op7dFgELRdmOYlPYS4gP8HhH1ZmZa13QZF59y0fblzFDFmKPhyc05phCy2hze9OEvNZAsoljrs+72w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-1.3.0.tgz", + "integrity": "sha512-7Gevk/5eGD50+eMD+XDnFnOrruFkL0kSd7jEG4cjmqweDSUhB7i0g8is/nBdVpl+Bx338SqIB2GLKm32M+Vs6g==", "dev": true, + "license": "MIT", "dependencies": { "yaml": "^2.2.2" }, @@ -11417,10 +11953,11 @@ } }, "node_modules/docker-compose/node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, + "license": "ISC", "bin": { "yaml": "bin.mjs" }, @@ -11536,16 +12073,32 @@ } }, "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", "dev": true, "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "type-fest": "^4.18.2" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dotenv": { @@ -11553,6 +12106,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -11586,7 +12140,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", @@ -11596,9 +12151,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.165", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", - "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", + "version": "1.5.227", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.227.tgz", + "integrity": "sha512-ITxuoPfJu3lsNWUi2lBM2PaBPYgH3uqmxut5vmBxgYvyI4AlJ6P3Cai1O76mOrkJCBzq0IxWg/NtqOrpu/0gKA==", "dev": true, "license": "ISC" }, @@ -11652,10 +12207,23 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, "license": "MIT", "dependencies": { @@ -11663,9 +12231,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { @@ -11714,9 +12282,9 @@ } }, "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.15.0.tgz", + "integrity": "sha512-chR+t7exF6y59kelhXw5I3849nTy7KIRO+ePdLMhCD+JRP/JvmkenDWP7QSFGlsHX+kxGxdDutOPrmj5j1HR6g==", "dev": true, "license": "MIT", "bin": { @@ -11734,9 +12302,9 @@ "license": "MIT" }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -12056,9 +12624,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", + "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", "dev": true, "license": "MIT", "bin": { @@ -12091,9 +12659,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -12135,30 +12703,30 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -12169,9 +12737,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -12283,9 +12851,9 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -12317,9 +12885,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", - "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { @@ -12394,9 +12962,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -12483,26 +13051,22 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -12557,35 +13121,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -12631,19 +13166,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -12762,6 +13284,16 @@ "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -12786,6 +13318,26 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -12904,42 +13456,38 @@ "license": "MIT" }, "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", "yauzl": "^2.10.0" }, "bin": { "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "2.0.0" } }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13005,19 +13553,10 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-redact": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", - "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { @@ -13226,9 +13765,9 @@ } }, "node_modules/find-process": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.10.tgz", - "integrity": "sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==", + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.11.tgz", + "integrity": "sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA==", "dev": true, "license": "MIT", "dependencies": { @@ -13245,6 +13784,7 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -13327,9 +13867,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "dev": true, "funding": [ { @@ -13391,6 +13931,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -13402,28 +13943,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -13440,6 +13970,13 @@ "node": ">= 0.6" } }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "dev": true, + "license": "MIT" + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -13503,9 +14040,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", + "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", "dev": true, "license": "Unlicense" }, @@ -13516,20 +14053,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -13666,13 +14189,16 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13697,9 +14223,9 @@ } }, "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", "dev": true, "license": "MIT", "dependencies": { @@ -13765,9 +14291,9 @@ "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -13832,12 +14358,19 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -13913,6 +14446,7 @@ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -14129,9 +14663,9 @@ } }, "node_modules/hookified": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz", - "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.1.tgz", + "integrity": "sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q==", "dev": true, "license": "MIT" }, @@ -14181,46 +14715,6 @@ "wbuf": "^1.1.0" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -14274,7 +14768,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -14377,6 +14872,7 @@ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -14385,18 +14881,6 @@ "node": ">=10.19.0" } }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -14422,9 +14906,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14432,6 +14916,10 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/icss-utils": { @@ -14492,9 +14980,9 @@ } }, "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -14522,17 +15010,10 @@ "dev": true, "license": "MIT" }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "license": "MIT" - }, "node_modules/immutable": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", "license": "MIT" }, "node_modules/import-fresh": { @@ -14560,6 +15041,19 @@ "node": ">=4" } }, + "node_modules/import-in-the-middle": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.4.tgz", + "integrity": "sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -14678,15 +15172,11 @@ } }, "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", "dev": true, "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } @@ -14996,6 +15486,7 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -15053,52 +15544,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -15258,13 +15703,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -15348,9 +15786,9 @@ } }, "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, @@ -15439,9 +15877,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -15475,6 +15913,7 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -16116,17 +16555,22 @@ } }, "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-18.0.1.tgz", + "integrity": "sha512-IiQpRyypSnLisQf3PwuN2eIHAsAIGZIrLZkd4zdvIar2bDyhM91ubRjy8a3eYablXsh9BeI/c7dmPYHca5qtoA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" + "@hapi/address": "^5.1.1", + "@hapi/formula": "^3.0.2", + "@hapi/hoek": "^11.0.7", + "@hapi/pinpoint": "^2.0.1", + "@hapi/tlds": "^1.1.1", + "@hapi/topo": "^6.0.2", + "@standard-schema/spec": "^1.0.0" + }, + "engines": { + "node": ">= 20" } }, "node_modules/jpeg-js": { @@ -16153,26 +16597,18 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", @@ -16355,9 +16791,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", - "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", "dev": true, "license": "MIT" }, @@ -16382,14 +16818,14 @@ } }, "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, "node_modules/lazy-cache": { @@ -16433,48 +16869,37 @@ "node": ">= 0.8.0" } }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/lighthouse": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.6.1.tgz", - "integrity": "sha512-85WDkjcXAVdlFem9Y6SSxqoKiz/89UsDZhLpeLJIsJ4LlHxw047XTZhlFJmjYCB7K5S1erSBAf5cYLcfyNbH3A==", + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.2.tgz", + "integrity": "sha512-+5SKYzVaTFj22MgoYDPNrP9tlD2/Ay7j3SxPSFD9FpPyVxGr4UtOQGKyrdZ7wCmcnBaFk0mCkPfARU3CsE0nvA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@paulirish/trace_engine": "0.0.53", - "@sentry/node": "^7.0.0", + "@paulirish/trace_engine": "0.0.59", + "@sentry/node": "^9.28.1", "axe-core": "^4.10.3", "chrome-launcher": "^1.2.0", - "configstore": "^5.0.1", + "configstore": "^7.0.0", "csp_evaluator": "1.1.5", - "devtools-protocol": "0.0.1467305", + "devtools-protocol": "0.0.1507524", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", "js-library-detector": "^6.7.0", - "lighthouse-logger": "^2.0.1", + "lighthouse-logger": "^2.0.2", "lighthouse-stack-packs": "1.12.2", "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "puppeteer-core": "^24.10.0", + "puppeteer-core": "^24.17.1", "robots-parser": "^3.0.1", - "semver": "^5.3.0", "speedline-core": "^1.4.3", - "third-party-web": "^0.26.6", - "tldts-icann": "^6.1.16", + "third-party-web": "^0.27.0", + "tldts-icann": "^7.0.12", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" @@ -16485,37 +16910,20 @@ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" }, "engines": { - "node": ">=18.20" + "node": ">=18.16" } }, "node_modules/lighthouse-logger": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", - "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz", + "integrity": "sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^2.6.9", + "debug": "^4.4.1", "marky": "^1.2.2" } }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, "node_modules/lighthouse-stack-packs": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", @@ -16524,18 +16932,18 @@ "license": "Apache-2.0" }, "node_modules/lighthouse/node_modules/@puppeteer/browsers": { - "version": "2.10.5", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz", - "integrity": "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "debug": "^4.4.1", + "debug": "^4.4.3", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.2", - "tar-fs": "^3.0.8", + "tar-fs": "^3.1.0", "yargs": "^17.7.2" }, "bin": { @@ -16545,41 +16953,50 @@ "node": ">=18" } }, - "node_modules/lighthouse/node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "node_modules/lighthouse/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, "bin": { - "semver": "bin/semver.js" + "extract-zip": "cli.js" }, "engines": { - "node": ">=10" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, "node_modules/lighthouse/node_modules/puppeteer-core": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.10.0.tgz", - "integrity": "sha512-xX0QJRc8t19iAwRDsAOR38Q/Zx/W6WVzJCEhKCAwp2XMsaWqfNtQ+rBfQW9PlF+Op24d7c8Zlgq9YNmbnA7hdQ==", + "version": "24.22.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.3.tgz", + "integrity": "sha512-M/Jhg4PWRANSbL/C9im//Yb55wsWBS5wdp+h59iwM+EPicVQQCNs56iC5aEAO7avfDPRfxs4MM16wHjOYHNJEw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.5", - "chromium-bidi": "5.1.0", - "debug": "^4.4.1", - "devtools-protocol": "0.0.1452169", + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "9.1.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1495869", "typed-query-selector": "^2.12.0", - "ws": "^8.18.2" + "webdriver-bidi-protocol": "0.2.11", + "ws": "^8.18.3" }, "engines": { "node": ">=18" } }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz", - "integrity": "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", + "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -16591,16 +17008,16 @@ } }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1452169", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1452169.tgz", - "integrity": "sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g==", + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -16620,13 +17037,16 @@ } }, "node_modules/lighthouse/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/lighthouse/node_modules/ws": { @@ -16652,9 +17072,9 @@ } }, "node_modules/lighthouse/node_modules/zod": { - "version": "3.25.51", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.51.tgz", - "integrity": "sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==", + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", "funding": { @@ -16715,16 +17135,6 @@ "node": ">=8.9.0" } }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lie": "3.1.1" - } - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -16756,7 +17166,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -16858,6 +17269,7 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -16948,13 +17360,6 @@ "markdown-it": "bin/markdown-it.js" } }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/markdown-it/node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -17003,17 +17408,10 @@ "node": ">=12" } }, - "node_modules/markdownlint-cli/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/markdownlint-cli/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -17041,19 +17439,6 @@ "node": ">= 4" } }, - "node_modules/markdownlint-cli/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/markdownlint-cli/node_modules/minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", @@ -17160,9 +17545,9 @@ } }, "node_modules/memize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz", - "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.1.tgz", + "integrity": "sha512-8Nl+i9S5D6KXnruM03Jgjb+LwSupvR13WBr4hJegaaEyobvowCVupi79y2WSiWvO1mzBWxPwEYE5feCe8vyA5w==", "dev": true, "license": "MIT" }, @@ -17340,6 +17725,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17355,9 +17741,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", - "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17448,6 +17834,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -17488,6 +17875,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -17495,6 +17883,13 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "dev": true, + "license": "MIT" + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -17577,6 +17972,7 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, + "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -17670,9 +18066,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "dev": true, "license": "MIT" }, @@ -17730,6 +18126,7 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -17787,13 +18184,6 @@ "npm": ">=6.0.0" } }, - "node_modules/npm-package-json-lint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/npm-package-json-lint/node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -17821,19 +18211,6 @@ } } }, - "node_modules/npm-package-json-lint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/npm-package-json-lint/node_modules/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -17913,9 +18290,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", "dev": true, "license": "MIT" }, @@ -18060,6 +18437,7 @@ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -18078,9 +18456,9 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, "license": "MIT", "engines": { @@ -18164,6 +18542,7 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz", "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^3.0.0", "cli-cursor": "^3.1.0", @@ -18186,6 +18565,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18199,6 +18579,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -18207,13 +18588,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ora/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -18223,6 +18606,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -18232,6 +18616,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^2.4.2" }, @@ -18244,6 +18629,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -18256,6 +18642,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -18270,6 +18657,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -18281,7 +18669,8 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/os-homedir": { "version": "1.0.2", @@ -18316,6 +18705,7 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -18365,16 +18755,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/p-retry": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", @@ -18420,9 +18800,9 @@ } }, "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -18475,7 +18855,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/param-case": { "version": "3.0.4", @@ -18548,9 +18929,9 @@ } }, "node_modules/parse5/node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -18612,13 +18993,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -18640,6 +19014,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -18655,7 +19030,8 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/path-to-regexp": { "version": "6.3.0", @@ -18680,6 +19056,40 @@ "dev": true, "license": "MIT" }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -18699,47 +19109,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pino": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.7.0.tgz", - "integrity": "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.12.0.tgz", + "integrity": "sha512-0Gd0OezGvqtqMwgYxpL7P0pSHHzTJ0Lx992h+mNlMtRVfNnqweWmf0JmRWk5gJzHalyd2mxTzKjhiNbGS2Ztfw==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", @@ -18747,6 +19124,7 @@ "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", + "slow-redact": "^0.3.0", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, @@ -18759,6 +19137,7 @@ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "dev": true, + "license": "MIT", "dependencies": { "split2": "^4.0.0" } @@ -18767,7 +19146,8 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pirates": { "version": "4.0.7", @@ -18884,13 +19264,13 @@ } }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", + "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.55.1" }, "bin": { "playwright": "cli.js" @@ -18903,9 +19283,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", + "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", "dev": true, "license": "Apache-2.0", "bin": { @@ -18942,9 +19322,9 @@ } }, "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -19620,6 +20000,49 @@ "dev": true, "license": "MIT" }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -19631,9 +20054,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "peer": true, @@ -19709,7 +20132,8 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", @@ -19797,9 +20221,9 @@ } }, "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -19865,9 +20289,9 @@ } }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, "license": "MIT", "dependencies": { @@ -19975,16 +20399,20 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/randombytes": { @@ -20199,20 +20627,28 @@ } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -20231,6 +20667,7 @@ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" } @@ -20300,9 +20737,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -20341,18 +20778,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -20366,31 +20803,18 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/rememo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz", @@ -20432,6 +20856,21 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -20473,7 +20912,8 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-bin": { "version": "0.4.3", @@ -20537,6 +20977,7 @@ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, + "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -20549,6 +20990,7 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -20557,6 +20999,13 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -20579,17 +21028,40 @@ } }, "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "glob": "^10.3.7" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/robots-parser": { @@ -20708,6 +21180,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -20746,6 +21225,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -20769,6 +21255,7 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -20781,9 +21268,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.89.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.1.tgz", - "integrity": "sha512-eMLLkl+qz7tx/0cJ9wI+w09GQ2zodTkcE/aVfywwdlRcI3EO19xGnbmJwg/JMIm+5MxVJ6outddLZ4Von4E++Q==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -21278,6 +21765,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -21355,17 +21849,24 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/simple-git": { "version": "3.28.0", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", "dev": true, + "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -21426,6 +21927,13 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/slow-redact": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.0.tgz", + "integrity": "sha512-cf723wn9JeRIYP9tdtd86GuqoR5937u64Io+CYjlm2i7jvu7g0H+Cp0l0ShAf/4ZL+ISUTVT+8Qzz7RZmp9FjA==", + "dev": true, + "license": "MIT" + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -21471,13 +21979,13 @@ } }, "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -21501,9 +22009,9 @@ } }, "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -21515,6 +22023,7 @@ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "dev": true, + "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -21559,6 +22068,19 @@ "webpack": "^5.0.0" } }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -21594,19 +22116,6 @@ "node": ">=16" } }, - "node_modules/spawnd/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -21648,9 +22157,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true, "license": "CC0-1.0" }, @@ -21686,6 +22195,21 @@ "wbuf": "^1.7.3" } }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/speedline-core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", @@ -21706,6 +22230,7 @@ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 10.x" } @@ -21772,29 +22297,34 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -21830,6 +22360,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -21843,7 +22374,8 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", @@ -21984,6 +22516,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -22060,6 +22593,12 @@ "node": ">=0.8.0" } }, + "node_modules/stubborn-fs": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==", + "dev": true + }, "node_modules/style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", @@ -22085,9 +22624,9 @@ } }, "node_modules/stylelint": { - "version": "16.20.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.20.0.tgz", - "integrity": "sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==", + "version": "16.24.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz", + "integrity": "sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==", "dev": true, "funding": [ { @@ -22101,9 +22640,9 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", @@ -22114,21 +22653,21 @@ "debug": "^4.4.1", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.0", + "file-entry-cache": "^10.1.4", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^7.0.4", + "ignore": "^7.0.5", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.36.0", + "known-css-properties": "^0.37.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.3", + "postcss": "^8.5.6", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.0", @@ -22195,9 +22734,9 @@ } }, "node_modules/stylelint-scss": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.0.tgz", - "integrity": "sha512-U7CKhi1YNkM1pXUXl/GMUXi8xKdhl4Ayxdyceie1nZ1XNIdaUgMV6OArpooWcDzEggwgYD0HP/xIgVJo9a655w==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", + "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", "dev": true, "license": "MIT", "dependencies": { @@ -22217,10 +22756,17 @@ "stylelint": "^16.0.2" } }, + "node_modules/stylelint-scss/node_modules/known-css-properties": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", + "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", + "dev": true, + "license": "MIT" + }, "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.21.0.tgz", - "integrity": "sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==", + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.24.0.tgz", + "integrity": "sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA==", "dev": true, "license": "CC0-1.0" }, @@ -22285,13 +22831,6 @@ "postcss-selector-parser": "^7.0.0" } }, - "node_modules/stylelint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", @@ -22327,25 +22866,25 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.0.tgz", - "integrity": "sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", + "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.9" + "flat-cache": "^6.1.13" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.9.tgz", - "integrity": "sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg==", + "version": "6.1.14", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.14.tgz", + "integrity": "sha512-ExZSCSV9e7v/Zt7RzCbX57lY2dnPdxzU/h3UE6WJ6NtEMfwBd8jmi1n4otDEUfz+T/R+zxrFDpICFdjhD3H/zw==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^1.9.0", + "cacheable": "^2.0.1", "flatted": "^3.3.3", - "hookified": "^1.8.2" + "hookified": "^1.12.0" } }, "node_modules/stylelint/node_modules/global-modules": { @@ -22386,19 +22925,6 @@ "node": ">= 4" } }, - "node_modules/stylelint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/stylelint/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -22436,19 +22962,6 @@ "node": ">=4" } }, - "node_modules/stylelint/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/stylelint/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -22614,13 +23127,13 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.4" + "@pkgr/core": "^0.2.9" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -22681,19 +23194,23 @@ } }, "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/tar-fs": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", - "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { @@ -22717,11 +23234,27 @@ "streamx": "^2.15.0" } }, + "node_modules/tar-stream/node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -22738,6 +23271,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -22747,14 +23281,14 @@ } }, "node_modules/terser": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.41.0.tgz", - "integrity": "sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -22875,9 +23409,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -22908,6 +23442,21 @@ "b4a": "^1.6.4" } }, + "node_modules/text-decoder/node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -22916,9 +23465,9 @@ "license": "MIT" }, "node_modules/third-party-web": { - "version": "0.26.6", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.6.tgz", - "integrity": "sha512-GsjP92xycMK8qLTcQCacgzvffYzEqe29wyz3zdKVXlfRD5Kz1NatCTOZEeDaSd6uCZXvGd2CNVtQ89RNIhJWvA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.27.0.tgz", + "integrity": "sha512-h0JYX+dO2Zr3abCQpS6/uFjujaOjA1DyDzGQ41+oFn9VW/ARiq9g5ln7qEP9+BTzDpOMyIfsfj4OvfgXAsMUSA==", "dev": true, "license": "MIT" }, @@ -22927,6 +23476,7 @@ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", "dev": true, + "license": "MIT", "dependencies": { "real-require": "^0.2.0" } @@ -22953,14 +23503,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -22970,11 +23520,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -22985,9 +23538,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -22998,20 +23551,20 @@ } }, "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz", + "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==", "dev": true, "license": "MIT" }, "node_modules/tldts-icann": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.86.tgz", - "integrity": "sha512-NFxmRT2lAEMcCOBgeZ0NuM0zsK/xgmNajnY6n4S1mwAKocft2s2ise1O3nQxrH3c+uY6hgHUV9GGNVp7tUE4Sg==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.0.16.tgz", + "integrity": "sha512-WS/pPasPs2cx6orcxCcIz01SlG3dwYlgjLAnQt7vLAusTuTLqdI8zmkqbM8TWYEf3Z0o1S4BzM3oSRFPk/6WnA==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.86" + "tldts-core": "^7.0.16" } }, "node_modules/tmpl": { @@ -23228,9 +23781,9 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -23343,22 +23896,13 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } + "license": "MIT" }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -23374,6 +23918,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } @@ -23416,9 +23961,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "dev": true, "license": "MIT" }, @@ -23447,9 +23992,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { @@ -23457,28 +24002,15 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", @@ -23740,14 +24272,14 @@ } }, "node_modules/wait-on": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz", - "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.5.tgz", + "integrity": "sha512-J3WlS0txVHkhLRb2FsmRg3dkMTCV1+M6Xra3Ho7HzZDHpE7DCOnoSoCJsZotrmW3uRMhvIJGSKUKrh/MeF4iag==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.8.2", - "joi": "^17.13.3", + "axios": "^1.12.1", + "joi": "^18.0.1", "lodash": "^4.17.21", "minimist": "^1.2.8", "rxjs": "^7.8.2" @@ -23798,6 +24330,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, + "license": "MIT", "dependencies": { "defaults": "^1.0.3" } @@ -23809,6 +24342,13 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -23820,22 +24360,23 @@ } }, "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", + "version": "5.101.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", + "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -23849,7 +24390,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -24218,9 +24759,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.2.tgz", - "integrity": "sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", "engines": { @@ -24265,6 +24806,19 @@ "node": ">=12" } }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", @@ -24289,6 +24843,13 @@ "node": ">=12" } }, + "node_modules/when-exit": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz", + "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==", + "dev": true, + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -24353,6 +24914,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", @@ -24412,9 +24980,9 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -24423,10 +24991,7 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { @@ -24435,6 +25000,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -24468,10 +25034,17 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { @@ -24491,13 +25064,16 @@ } }, "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xml-name-validator": { @@ -24517,6 +25093,16 @@ "dev": true, "license": "MIT" }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -24597,10 +25183,11 @@ } }, "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, diff --git a/package.json b/package.json index 3087443c..4a4a21ee 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "slug": "elementor-hello-theme", "homepage": "https://elementor.com/", "description": "A sample theme for Elementor.", - "version": "3.4.4", + "version": "3.4.5", "last_beta_version": "2.4.0-beta3", "scripts": { "start": "wp-scripts start", diff --git a/readme.txt b/readme.txt index f03a6a25..84d40da6 100644 --- a/readme.txt +++ b/readme.txt @@ -3,8 +3,8 @@ Contributors: elemntor, KingYes, ariel.k, bainternet Requires at least: 6.0 Tested up to: 6.8 -Stable tag: 3.4.4 -Version: 3.4.4 +Stable tag: 3.4.5 +Version: 3.4.5 Requires PHP: 7.4 License: GNU General Public License v3 or later License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -36,6 +36,15 @@ Source: https://stocksnap.io/photo/4B83RD7BV9 == Changelog == += 3.4.5 - 2025-09-30 +* Fix: Load styles correctly in Gutenberg pages +* Fix: Do not change menu name after Elementor activation +* Fix: Ensure quicklinks works correctly from home page +* Tweak: Improve banner behavior after clicking on action button +* Tweak: Improve changelog appeareance +* Tweak: Only show Elementor pro upsell on relevant pages +* New: Add theme home to Finder + = 3.4.4 - 2025-06-08 = * Tweak: Improve Header/Footer edit access from theme Home diff --git a/style.css b/style.css index f7b3beae..b3e1b59d 100644 --- a/style.css +++ b/style.css @@ -4,8 +4,8 @@ Description: Hello Elementor is a lightweight and minimalist WordPress theme that was built specifically to work seamlessly with the Elementor site builder plugin. The theme is free, open-source, and designed for users who want a flexible, easy-to-use, and customizable website. The theme, which is optimized for performance, provides a solid foundation for users to build their own unique designs using the Elementor drag-and-drop site builder. Its simplicity and flexibility make it a great choice for both beginners and experienced Web Creators. Author: Elementor Team Author URI: https://elementor.com/?utm_source=wp-themes&utm_campaign=author-uri&utm_medium=wp-dash - Version: 3.4.4 - Stable tag: 3.4.4 + Version: 3.4.5 + Stable tag: 3.4.5 Requires at least: 6.0 Tested up to: 6.8 Requires PHP: 7.4 From 9e2216c2ae08745003f74b879e03d5d875ec7af5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:36:06 +0200 Subject: [PATCH 12/43] Internal: Tweak Date [TMZ-954] (#555) (#556) --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 84d40da6..a54506b5 100644 --- a/readme.txt +++ b/readme.txt @@ -36,7 +36,7 @@ Source: https://stocksnap.io/photo/4B83RD7BV9 == Changelog == -= 3.4.5 - 2025-09-30 += 3.4.5 - 2025-10-20 * Fix: Load styles correctly in Gutenberg pages * Fix: Do not change menu name after Elementor activation * Fix: Ensure quicklinks works correctly from home page From 978705421ec9345b0ec074e4538bd31b1e8d6db6 Mon Sep 17 00:00:00 2001 From: Manor Hazaz Date: Mon, 27 Oct 2025 10:28:59 +0200 Subject: [PATCH 13/43] Internal: Tweak changelog [TMZ-954] (#557) --- readme.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/readme.txt b/readme.txt index a54506b5..a571a150 100644 --- a/readme.txt +++ b/readme.txt @@ -36,14 +36,12 @@ Source: https://stocksnap.io/photo/4B83RD7BV9 == Changelog == -= 3.4.5 - 2025-10-20 += 3.4.5 - 2025-10-27 +* New: Add theme home to Finder +* Tweak: Improve banner behavior after clicking on action button * Fix: Load styles correctly in Gutenberg pages * Fix: Do not change menu name after Elementor activation * Fix: Ensure quicklinks works correctly from home page -* Tweak: Improve banner behavior after clicking on action button -* Tweak: Improve changelog appeareance -* Tweak: Only show Elementor pro upsell on relevant pages -* New: Add theme home to Finder = 3.4.4 - 2025-06-08 = * Tweak: Improve Header/Footer edit access from theme Home From c9e517bfbaaa4f8ca599620c9a6e6d8868016378 Mon Sep 17 00:00:00 2001 From: Nicola Peluchetti Date: Fri, 7 Nov 2025 19:37:55 +0200 Subject: [PATCH 14/43] Internal: Merge main into 3.4 [TMZ-972] (#562) --- .github/BUILD-ACTION-COMPARISON.md | 247 ----------- .github/BUILD-COMPATIBILITY-ANALYSIS.md | 297 ------------- .github/CLONE-RELEASE-PREPARATION.md | 392 ------------------ .../CRITICAL-QUESTIONS-FOR-IMPLEMENTATION.md | 383 ----------------- .github/USE-MAIN-WORKFLOW.md | 342 +++++++++++++++ .../actions/build-theme-release/action.yml | 16 +- .../action.yml | 20 +- .../action.yml | 3 +- .github/config/release.json | 2 +- .github/scripts/daily-report.js | 4 + .../generate-upload-instructions-release.sh | 6 +- ...wright-with-specific-elementor-version.yml | 130 +++--- ...right-with-specific-hello-plus-version.yml | 262 ++++++++---- 13 files changed, 646 insertions(+), 1458 deletions(-) delete mode 100644 .github/BUILD-ACTION-COMPARISON.md delete mode 100644 .github/BUILD-COMPATIBILITY-ANALYSIS.md delete mode 100644 .github/CLONE-RELEASE-PREPARATION.md delete mode 100644 .github/CRITICAL-QUESTIONS-FOR-IMPLEMENTATION.md create mode 100644 .github/USE-MAIN-WORKFLOW.md diff --git a/.github/BUILD-ACTION-COMPARISON.md b/.github/BUILD-ACTION-COMPARISON.md deleted file mode 100644 index d09e7f31..00000000 --- a/.github/BUILD-ACTION-COMPARISON.md +++ /dev/null @@ -1,247 +0,0 @@ -# Build Action Detailed Comparison -# Hello Commerce vs Hello Theme - -## Overview -This document provides a line-by-line comparison of the build-theme actions from both repositories to inform the decision on which approach to use. - -## Current Build Actions - -### Hello Theme Build Action Features -**File:** `.github/workflows/build-theme/action.yml` (120 lines) - -#### Key Features: -- **Sophisticated npm retry logic** with 3 attempts -- **Multiple fallback strategies**: - - Primary: `npm ci --prefer-offline` - - Fallback 1: `npm install --legacy-peer-deps` - - Fallback 2: Public registry explicitly - - Fallback 3: Install without package-lock -- **Advanced error handling** with cache clearing -- **Registry fallback mechanisms** -- **Detailed logging** for debugging - -#### Build Process: -```yaml -- Install npm dependencies (with retry logic) -- Install composer dependencies -- Set package version -- Run build script (npm run build:prod by default) -- Create theme build directory (/tmp/hello-theme-builds) -- Package theme (hello-elementor-${VERSION}.zip) -- Move to workspace -``` - -### Hello Commerce Build Action Features -**File:** `.github/workflows/build-theme/action.yml` (68 lines) - -#### Key Features: -- **Simple npm installation** with single attempt -- **Basic error handling** -- **Straightforward approach** -- **Minimal logging** - -#### Build Process: -```yaml -- Install npm dependencies (npm ci only) -- Install composer dependencies -- Set package version -- Run build script (npm run build by default) -- Create theme build directory (/tmp/hello-commerce-builds) -- Package theme (hello-commerce-${VERSION}.zip) -- Move to workspace -``` - -## Detailed Feature Comparison - -| Feature | Hello Theme | Hello Commerce | Advantage | -|---------|-------------|----------------|-----------| -| **NPM Installation Retries** | 3 attempts with exponential backoff | 1 attempt only | 🏆 Hello Theme | -| **Registry Fallbacks** | 4 different strategies | None | 🏆 Hello Theme | -| **Error Handling** | Comprehensive error recovery | Basic error handling | 🏆 Hello Theme | -| **Cache Management** | Automatic cache clearing on failure | None | 🏆 Hello Theme | -| **Logging Detail** | Verbose logging for debugging | Minimal logging | 🏆 Hello Theme | -| **Code Complexity** | 120 lines (more complex) | 68 lines (simpler) | 🏆 Hello Commerce | -| **Maintenance** | More complex to maintain | Easier to maintain | 🏆 Hello Commerce | -| **Build Reliability** | Higher (due to retry logic) | Lower (single attempt) | 🏆 Hello Theme | - -## NPM Installation Logic Comparison - -### Hello Theme Approach -```yaml -# Enhanced retry logic for npm ci with registry fallbacks and cache clearing -for i in {1..3}; do - echo "🔄 Attempt $i/3: Installing npm dependencies..." - - # Try npm ci first - if npm ci --prefer-offline --no-audit --no-fund --silent; then - echo "✅ npm ci succeeded on attempt $i" - break - else - echo "❌ npm ci failed on attempt $i" - - # Check if it's a 403/registry error and clear cache - if [ $i -lt 3 ]; then - echo "🧹 Clearing npm cache to resolve potential registry issues..." - npm cache clean --force 2>/dev/null || true - echo "⏳ Waiting 30 seconds before retry..." - sleep 30 - else - # Multiple fallback strategies... - # Fallback 1: npm install --legacy-peer-deps - # Fallback 2: NPM_CONFIG_REGISTRY=https://registry.npmjs.org/ - # Fallback 3: Install without package-lock.json - fi - fi -done -``` - -### Hello Commerce Approach -```yaml -- name: Install npm dependencies - shell: bash - run: | - export PUPPETEER_SKIP_DOWNLOAD=true - npm ci -``` - -## Package Creation Comparison - -### Hello Theme -```yaml -# Create zip file with proper naming (following Hello Commerce pattern) -zip -r "/tmp/hello-theme-builds/hello-elementor-${PACKAGE_VERSION}.zip" . \ - -x "node_modules/*" "test-results/*" "tests/*" ".git/*" "*.zip" \ - "playwright-report/*" ".wp-env.json.*" ".wp-env" -``` - -### Hello Commerce -```yaml -# Create zip file with proper naming -zip -r "/tmp/hello-commerce-builds/hello-commerce-${PACKAGE_VERSION}.zip" . \ - -x "node_modules/*" "test-results/*" "tests/*" ".git/*" "*.zip" \ - "playwright-report/*" ".wp-env.json.*" ".wp-env" -``` - -**Identical exclusion patterns - no compatibility issues** - -## Performance Analysis - -### Hello Theme Build Action -**Pros:** -- ✅ High reliability due to retry logic -- ✅ Handles network issues gracefully -- ✅ Comprehensive error recovery -- ✅ Production-tested in hello-theme repository -- ✅ Better for CI/CD environments with network instability - -**Cons:** -- ❌ More complex code to maintain -- ❌ Longer execution time (due to retries) -- ❌ More verbose output -- ❌ Higher complexity for debugging - -### Hello Commerce Build Action -**Pros:** -- ✅ Simple and straightforward -- ✅ Faster execution (no retries) -- ✅ Easy to understand and maintain -- ✅ Less verbose output - -**Cons:** -- ❌ Can fail on transient network issues -- ❌ No fallback strategies -- ❌ Less reliable in unstable environments -- ❌ May require manual intervention on failures - -## Recommendation Analysis - -### Technical Recommendation: **Use Hello Theme's Build Action** - -**Rationale:** -1. **Higher Reliability** - The retry logic and fallback strategies make builds more reliable in CI/CD environments -2. **Production Proven** - Already tested and working in Hello Theme production environment -3. **Future Proof** - Handles edge cases that Hello Commerce might encounter as it scales -4. **Error Recovery** - Automatic recovery from transient failures reduces manual intervention - -### Adaptation Required: -```yaml -# Changes needed for Hello Commerce integration: -1. Update temp directory: /tmp/hello-theme-builds → /tmp/hello-commerce-builds -2. Update package naming: hello-elementor-${VERSION} → hello-commerce-${VERSION} -3. Update default build script: npm run build:prod → npm run build -``` - -## Integration Strategy - -### Phase 1: Direct Copy with Adaptations -```yaml -# Copy Hello Theme's build action to Hello Commerce -# Update these variables: -- TEMP_DIR: "/tmp/hello-commerce-builds" -- ZIP_NAME: "hello-commerce-${PACKAGE_VERSION}.zip" -- DEFAULT_BUILD_SCRIPT: "npm run build" -``` - -### Phase 2: Optional Enhancements -```yaml -# Consider these improvements: -1. Make retry count configurable (input parameter) -2. Add option to disable retry logic for simple builds -3. Add build timing metrics -4. Enhance error reporting -``` - -### Phase 3: Standardization -```yaml -# Long term: Standardize across all theme repositories -1. Create shared build action in common repository -2. Use consistent naming patterns -3. Share retry/fallback logic across all themes -``` - -## Testing Requirements - -### Build Action Testing Checklist -- [ ] Test with Hello Commerce dependencies -- [ ] Test retry logic with simulated network failures -- [ ] Test fallback strategies -- [ ] Verify package naming changes -- [ ] Validate temp directory creation -- [ ] Test with both npm ci and npm install scenarios -- [ ] Verify exclusion patterns work correctly -- [ ] Test error recovery mechanisms - -### Performance Testing -- [ ] Compare build times with and without retry logic -- [ ] Test memory usage during build -- [ ] Validate artifact size and contents -- [ ] Test concurrent build scenarios - -## Risk Assessment - -### Low Risk Changes -- ✅ Package naming updates -- ✅ Temp directory path changes -- ✅ Build script parameter changes - -### Medium Risk Changes -- 🟡 Retry logic integration -- 🟡 Error handling adaptation -- 🟡 Fallback strategy testing - -### High Risk Areas -- 🔴 NPM dependency compatibility with Hello Commerce packages -- 🔴 Registry fallback behavior in Hello Commerce environment -- 🔴 Build timing impact on overall workflow duration - -## Conclusion - -**Hello Theme's build action is superior** due to its comprehensive error handling and retry mechanisms. The additional complexity is justified by the increased reliability, especially in CI/CD environments where network issues are common. - -**Recommended Approach:** -1. **Adopt Hello Theme's build action** as the base -2. **Customize** for Hello Commerce naming and paths -3. **Test thoroughly** with Hello Commerce specific scenarios -4. **Consider standardizing** across all theme repositories - -This approach ensures maximum build reliability while maintaining the proven functionality that Hello Theme has already validated in production. diff --git a/.github/BUILD-COMPATIBILITY-ANALYSIS.md b/.github/BUILD-COMPATIBILITY-ANALYSIS.md deleted file mode 100644 index e44d4b34..00000000 --- a/.github/BUILD-COMPATIBILITY-ANALYSIS.md +++ /dev/null @@ -1,297 +0,0 @@ -# Build Process Compatibility Analysis -# Hello Commerce vs Hello Theme - -## Executive Summary - -This document provides a detailed technical comparison of the build processes, version management, and workflow structures between Hello Commerce and Hello Theme. This analysis is critical for ensuring successful cloning of the release-preparation workflow. - -## 1. Build Process Comparison - -### Package.json Scripts Comparison - -| Feature | Hello Commerce | Hello Theme | Compatibility Risk | -|---------|----------------|-------------|-------------------| -| **Main Build** | `"build"` | `"build:prod"` | 🟡 MEDIUM - Script name different | -| **Clean Command** | `"clean"` | `"clean:build"` | 🟡 MEDIUM - Script name different | -| **Package Command** | `"package:zip"` | `"zip"` | 🟡 MEDIUM - Script name different | -| **Build Tools** | `npx wp-scripts build` | `wp-scripts build` | 🟢 LOW - Both use wp-scripts | -| **Composer** | `--no-dev` | `--no-dev` | ✅ IDENTICAL | - -### Build Action Comparison - -#### Hello Theme Build Action Features -```yaml -# Sophisticated npm retry logic: -- 3 retry attempts with exponential backoff -- Multiple fallback strategies (npm install, public registry, no-lock) -- Advanced error handling and cache clearing -- Registry fallback mechanisms - -# Package naming: -- Creates: hello-elementor-${VERSION}.zip -- Uses sophisticated exclusion patterns -- Temp directory: /tmp/hello-theme-builds -``` - -#### Hello Commerce Build Action Features -```yaml -# Simpler npm installation: -- Single npm ci attempt -- Basic error handling -- No retry logic or fallbacks - -# Package naming: -- Creates: hello-commerce-${VERSION}.zip -- Similar exclusion patterns -- Temp directory: /tmp/hello-commerce-builds -``` - -**RECOMMENDATION:** 🚨 **KEEP Hello Theme's Build Action** - It has superior error handling and retry logic that would benefit the release workflow. - -## 2. Version Management Comparison - -### Current Version Constants - -| Repository | Constant Name | Current Version | Location | -|------------|---------------|----------------|----------| -| Hello Commerce | `HELLO_COMMERCE_ELEMENTOR_VERSION` | `1.0.1` | functions.php:14 | -| Hello Theme | `HELLO_ELEMENTOR_VERSION` | `3.4.4` | functions.php:12 | - -### Version Management Scripts - -#### Hello Theme Approach (JavaScript) -```javascript -// .github/scripts/update-version-in-files.js -// Updates: -- ./assets/scss/style.scss (Version: and Stable tag:) -- ./functions.php (HELLO_ELEMENTOR_VERSION) -- ./readme.txt (Version: and Stable tag:) - -// Uses replace-in-file package -// Regex-based replacements -``` - -#### Hello Commerce Approach (Bash) -```bash -# .github/actions/bump-theme-version/action.yml -# Updates: -- package.json (npm version command) -- functions.php (sed replacement) -- style.css (sed replacement) -- readme.txt (sed replacement) - -# Uses sed commands -# More granular error handling per file -``` - -**KEY DIFFERENCE:** 🚨 Hello Theme updates `assets/scss/style.scss` while Hello Commerce updates `style.css` - -### Version Validation Scripts - -#### Hello Commerce: validate-versions.sh -```bash -# Validates consistency between: -- package.json version -- functions.php HELLO_COMMERCE_ELEMENTOR_VERSION -- style.css Version header -- readme.txt Stable tag - -# Uses grep and awk for extraction -# Exits with error on mismatch -``` - -#### Hello Theme: No equivalent script -**NEEDS TO BE CREATED** with Hello Theme specific patterns. - -## 3. File Structure Differences - -### Theme Naming Conventions - -| Repository | Theme Name in Files | Package Name | Zip Filename | -|------------|-------------------|---------------|--------------| -| Hello Commerce | "Hello Commerce" | hello-commerce | hello-commerce-{version}.zip | -| Hello Theme | "Hello Elementor" | hello-elementor | hello-elementor-{version}.zip | - -**⚠️ CRITICAL:** Repository is `hello-theme` but theme name is `Hello Elementor` - -### Build Artifacts - -| Repository | Primary CSS | Secondary CSS | Build Output | -|------------|-------------|---------------|--------------| -| Hello Commerce | style.css | assets/css/* | Single zip | -| Hello Theme | style.css | assets/css/* + assets/scss/* | Single zip | - -**Hello Theme has additional SCSS source files that may need version management** - -## 4. Dependency Comparison - -### Node Dependencies Analysis - -#### Hello Theme Unique Dependencies -```json -{ - "@wordpress/components": "^29.9.0", - "@wordpress/env": "^10.26.0", - "@wordpress/i18n": "^5.23.0", - "@wordpress/notices": "^5.23.0", - "@elementor/wp-lite-env": "^0.0.20", - "sass": "^1.89.0" // SCSS compilation -} -``` - -#### Hello Commerce Unique Dependencies -```json -{ - "composer": "^4.1.0", - "prettier": "^3.6.2", - "path": "^0.12.7", - "eslint-import-resolver-typescript": "^3.10.1" -} -``` - -**BUILD IMPACT:** 🟡 Hello Theme has SCSS compilation requirements that Hello Commerce lacks. - -### Composer Dependencies -Both repositories use similar PHP dependencies - no significant compatibility issues expected. - -## 5. Workflow Integration Points - -### Existing Hello Theme Workflows - -| Workflow | Purpose | Status | Action Required | -|----------|---------|---------|-----------------| -| publish-release.yml | Legacy release process | 🟡 ACTIVE | Decide: Replace/Coexist/Deprecate | -| publish-patch.yml | Patch releases | 🟡 ACTIVE | Decide: Replace/Coexist/Deprecate | -| publish-beta.yml | Beta releases | 🟡 ACTIVE | Decide: Replace/Coexist/Deprecate | -| build.yml | Build testing | ✅ COMPATIBLE | Keep as-is | - -### Secrets Requirements - -| Secret | Hello Commerce | Hello Theme | Status | -|--------|---------------|-------------|---------| -| DEVOPS_TOKEN | ✅ Required | ❓ Unknown | Needs verification | -| CLOUD_DEVOPS_TOKEN | ✅ Required | ❓ Unknown | Needs verification | -| SLACK_BOT_TOKEN | ✅ Required | ❓ Unknown | Needs verification | -| MAINTAIN_TOKEN | ❌ Not used | ✅ Used in legacy workflows | Different approach | - -## 6. Critical Adaptation Requirements - -### High Priority (Must Fix) - -1. **Version Constant Renaming** - ```bash - # In all scripts and actions: - HELLO_COMMERCE_ELEMENTOR_VERSION → HELLO_ELEMENTOR_VERSION - ``` - -2. **Build Script Integration** - ```yaml - # Adapt hello-commerce workflow to use: - BUILD_SCRIPT_PATH: "npm run zip" # Instead of "npm run package:zip" - ``` - -3. **Package Naming** - ```bash - # Update all references: - hello-commerce-{version}.zip → hello-elementor-{version}.zip - /tmp/hello-commerce-builds/ → /tmp/hello-elementor-builds/ - ``` - -4. **SCSS File Handling** - ```javascript - // Ensure assets/scss/style.scss version is updated - // Either adapt bash scripts or keep JS approach - ``` - -### Medium Priority (Should Fix) - -5. **Repository References** - ```yaml - # Update all references: - elementor/hello-commerce → elementor/hello-theme - ``` - -6. **Legacy Workflow Strategy** - - Document migration path from publish-*.yml workflows - - Provide clear guidance on which workflow to use - -### Low Priority (Nice to Have) - -7. **Build Action Enhancement** - - Consider adopting Hello Theme's superior retry logic in hello-commerce - - Standardize error handling across all theme repositories - -## 7. Integration Testing Requirements - -### Build Compatibility Tests -```bash -# Test these specific scenarios: -1. npm ci with Hello Theme's complex dependencies -2. SCSS compilation during build -3. Version management across all files (including SCSS) -4. Package creation with correct naming -5. Build artifact validation -``` - -### Version Management Tests -```bash -# Test these version update scenarios: -1. package.json → functions.php sync -2. package.json → style.css sync -3. package.json → readme.txt sync -4. package.json → assets/scss/style.scss sync (Hello Theme specific) -``` - -### Workflow Coexistence Tests -```bash -# Test these integration scenarios: -1. New release-preparation.yml alongside existing workflows -2. Secret sharing between workflows -3. Build artifact naming conflicts -4. Git branch management compatibility -``` - -## 8. Recommended Integration Approach - -### Phase 1: Direct Adaptation (Low Risk) -1. Copy GitHub actions with name/constant changes -2. Copy scripts with Hello Theme specific adaptations -3. Copy main workflow with repository references updated - -### Phase 2: Build Process Integration (Medium Risk) -1. Adapt workflow to use Hello Theme's build-theme action -2. Integrate SCSS version management -3. Test build compatibility thoroughly - -### Phase 3: Legacy Workflow Migration (High Risk) -1. Document new workflow usage -2. Plan deprecation of legacy workflows -3. Train team on new process - -## 9. Success Criteria - -### Technical Success -- [ ] All version files stay synchronized (including SCSS) -- [ ] Build process produces correct hello-elementor-{version}.zip -- [ ] No conflicts with existing workflows -- [ ] All Hello Theme specific dependencies handled correctly - -### Process Success -- [ ] Team can successfully use new release workflow -- [ ] Clear documentation for migration from legacy workflows -- [ ] Rollback plan available if issues arise - -## 10. Risk Mitigation - -### High Risk: Build Process Differences -**Mitigation:** Extensive testing with dry_run mode, keep Hello Theme's proven build-theme action - -### Medium Risk: Version Management Integration -**Mitigation:** Thorough validation scripts, test all file updates - -### Low Risk: Legacy Workflow Conflicts -**Mitigation:** Clear documentation, staged rollout approach - ---- - -*This analysis provides the technical foundation for successful Hello Commerce to Hello Theme workflow migration. All identified differences must be addressed for successful implementation.* diff --git a/.github/CLONE-RELEASE-PREPARATION.md b/.github/CLONE-RELEASE-PREPARATION.md deleted file mode 100644 index afe79568..00000000 --- a/.github/CLONE-RELEASE-PREPARATION.md +++ /dev/null @@ -1,392 +0,0 @@ -# Product Requirements Document (PRD) -# Cloning Release Preparation Workflow from Hello Commerce to Hello Theme - -## Executive Summary - -This document outlines the requirements for cloning the `release-preparation.yml` workflow from `hello-commerce` to `hello-theme`. The workflow automates version bumping, building, GitHub release creation, and notification processes for theme releases. This implementation follows the same systematic approach used for Hello Biz, with specific adaptations for Hello Theme's unique requirements. - -## Current State Analysis - -### What Already Exists in Hello Theme -- ✅ `.github/config/release.json` - Pre-configured for hello-elementor -- ✅ `.github/workflows/build-theme/action.yml` - Custom build action (NEEDS COMPARISON) -- ✅ Legacy release workflows: publish-release.yml, publish-patch.yml, publish-beta.yml -- ✅ Existing version management scripts: update-version-in-files.js -- ✅ Build workflow with npm/composer integration -- ✅ Package.json with proper scripts (different from hello-commerce) - -### What Needs to Be Created/Adapted - -#### Required GitHub Actions (8 total) -1. **`.github/actions/install-dependencies/action.yml`** - Dependency installation -2. **`.github/actions/bump-theme-version/action.yml`** - Version bumping in multiple files -3. **`.github/actions/get-changelog-from-readme/action.yml`** - Changelog extraction -4. **`.github/actions/create-pr-with-bumped-theme-version/action.yml`** - PR creation -5. **`.github/actions/update-main-branch-version/action.yml`** - Main branch version sync -6. **`.github/actions/theme-slack-notification/action.yml`** - Slack notifications -7. **Replace existing build-theme action** with hello-commerce version (AFTER COMPARISON) -8. **`.github/actions/create-theme-release/action.yml`** - GitHub release creation - -#### Required Scripts (2 critical) -1. **`.github/scripts/validate-versions.sh`** - Version consistency validation -2. **`.github/scripts/generate-upload-instructions.sh`** - Upload instruction generation - -## Detailed Requirements - -### 1. Repository-Specific Changes Required - -#### A. Theme Name References -- **From:** `hello-commerce` → **To:** `hello-elementor` (note: not hello-theme!) -- **From:** `Hello Commerce` → **To:** `Hello Elementor` -- **From:** `HELLO_COMMERCE_ELEMENTOR_VERSION` → **To:** `HELLO_ELEMENTOR_VERSION` - -#### B. Repository URLs -- **From:** `elementor/hello-commerce` → **To:** `elementor/hello-theme` -- **From:** `https://github.com/elementor/hello-commerce` → **To:** `https://github.com/elementor/hello-theme` - -#### C. Package Configuration -- **From:** Package name `hello-commerce` → **To:** `hello-elementor` -- **From:** Theme slug `hello-commerce` → **To:** `hello-elementor` -- **From:** WordPress.org URL `wordpress.org/themes/hello-commerce/` → **To:** `wordpress.org/themes/hello-elementor/` - -#### D. File Naming Patterns -- **From:** `hello-commerce-{version}.zip` → **To:** `hello-elementor-{version}.zip` -- **From:** `/tmp/hello-commerce-builds/` → **To:** `/tmp/hello-elementor-builds/` - -### 2. Critical Compatibility Analysis - -#### A. Build Process Differences -**Hello Theme Build Commands:** -```json -{ - "zip": "npm run clean:build && npm run build:prod && rsync -av --exclude-from=.buildignore . $npm_package_name && zip -r $npm_package_name.$npm_package_version.zip $npm_package_name/*", - "build:prod": "composer install --no-dev && wp-scripts build --env=production", - "clean:build": "rm -rf assets && rm -rf $npm_package_name" -} -``` - -**Hello Commerce Build Commands:** -```json -{ - "package:zip": "npm run package && zip -r $npm_package_name.$npm_package_version.zip ./$npm_package_name/*", - "build": "composer install --no-dev && npx wp-scripts build --env=production", - "clean": "rm -rf assets && rm -rf $npm_package_name" -} -``` - -**⚠️ CRITICAL ADAPTATION REQUIRED:** -- Hello Theme uses `zip` script vs Hello Commerce `package:zip` -- Hello Theme uses `wp-scripts` directly vs Hello Commerce `npx wp-scripts` -- Hello Theme has more complex build process with sass dependencies - -#### B. Version Constant Differences -**Hello Theme:** -```php -define( 'HELLO_ELEMENTOR_VERSION', '3.4.4' ); -``` - -**Hello Commerce:** -```php -define( 'HELLO_COMMERCE_ELEMENTOR_VERSION', '1.0.1' ); -``` - -#### C. Existing Version Management Scripts -Hello Theme already has `.github/scripts/update-version-in-files.js` which updates: -- `./assets/scss/style.scss` -- `./functions.php` -- `./readme.txt` - -**⚠️ INTEGRATION DECISION NEEDED:** -- Keep existing JS-based version management OR replace with hello-commerce bash approach -- Current JS script targets `assets/scss/style.scss` instead of `style.css` - -### 3. GitHub Actions Adaptation Requirements - -#### Action 1: install-dependencies -```yaml -# Current hello-commerce implementation covers: -- PHP 7.4 setup with shivammathur/setup-php -- Composer OAuth with DEVOPS_TOKEN -- Node.js 18 setup with npm registry configuration -- NPM authentication with CLOUD_DEVOPS_TOKEN - -# Hello Theme adaptation needed: -# - Verify compatibility with Hello Theme's more complex dependencies (sass, webpack) -# - May need enhanced npm retry logic (Hello Theme build-theme action has sophisticated retry logic) -``` - -#### Action 2: bump-theme-version -```yaml -# Files to update with new version: -- package.json (version field) -- functions.php (HELLO_ELEMENTOR_VERSION constant) # CHANGED -- style.css (Version: header) -- readme.txt (Stable tag: field) - -# CRITICAL: Hello Theme has assets/scss/style.scss that may also need updating -# Integration decision: Use existing update-version-in-files.js OR adapt hello-commerce bash approach -``` - -#### Action 3: get-changelog-from-readme -```yaml -# Functionality: -- Extract changelog section for specific version from readme.txt -- Create temporary changelog file -- Validate changelog exists and is not empty -- Set environment variable with changelog file path - -# Hello Theme adaptation: No changes needed - can copy directly -``` - -#### Action 4: build-theme -```yaml -# REQUIRES DETAILED COMPARISON AND POTENTIAL REPLACEMENT: - -# Hello Theme current build-theme features: -- Sophisticated npm retry logic with multiple fallbacks -- Advanced error handling -- Package naming: hello-elementor-${VERSION}.zip -- Uses "npm run build:prod" by default - -# Hello Commerce build-theme features: -- Simpler npm installation -- Uses "npm run build" by default -- Package naming: hello-commerce-${VERSION}.zip - -# RECOMMENDATION: Keep Hello Theme's build-theme action but update: -- Change package naming from hello-elementor to match repository context -- Verify script compatibility with hello-commerce workflow -``` - -#### Action 5: create-pr-with-bumped-theme-version -```yaml -# Functionality: -- Create PR with version-bumped files -- Auto-configure git user as github-actions[bot] -- Use peter-evans/create-pull-request action -- Include specific files: package.json, functions.php, style.css, readme.txt - -# Hello Theme adaptation: No changes needed - can copy directly -``` - -#### Action 6: update-main-branch-version -```yaml -# Functionality: -- Compare new version with main branch version -- Only update if new version > main version -- Auto-detect default branch (main vs master) -- Handle version comparison logic - -# Hello Theme adaptation: No changes needed - can copy directly -``` - -#### Action 7: theme-slack-notification -```yaml -# Customization needed for hello-theme: -- Update header text: "🚀 Hello Elementor v{version} Released!" # Note: Hello Elementor, not Hello Theme -- Update description: "*Hello Elementor theme* has been successfully released" -- Update manual upload instructions for hello-elementor context -- Keep same Slack formatting and structure -``` - -### 4. Script Adaptation Requirements - -#### Script 1: validate-versions.sh -```bash -# Current hello-commerce version checks: -FUNC_VERSION=$(grep -E "define\( 'HELLO_COMMERCE_ELEMENTOR_VERSION'" functions.php) - -# Hello Theme adaptation needed: -FUNC_VERSION=$(grep -E "define\( 'HELLO_ELEMENTOR_VERSION'" functions.php) - -# All other logic remains the same: -- Check package.json version -- Check style.css Version header -- Check readme.txt Stable tag -- Ensure all versions match -``` - -#### Script 2: generate-upload-instructions.sh -```bash -# Customizations needed for hello-theme: -echo "📋 **Hello Elementor v${PACKAGE_VERSION} - Manual Upload Instructions**" -echo " - Theme: Hello Elementor" -echo " - Go to GitHub Releases page" -echo " - Navigate to Hello Elementor theme page" -echo " - GitHub Release: https://github.com/elementor/hello-theme/releases/tag/v${PACKAGE_VERSION}" -echo " - WordPress.org: https://wordpress.org/themes/hello-elementor/" - -# All other instruction logic remains the same -``` - -### 5. Configuration Updates Required - -#### Update .github/config/release.json -```json -{ - "repository": { - "name": "hello-elementor", // ✅ Already correct - "owner": "elementor", // ✅ Already correct - "main_branch": "main", // ✅ Already correct - "release_branches": ["3.4"] // ✅ Already correct - }, - "security": { - "allowed_repositories": ["elementor/hello-theme"], // ✅ Already correct - }, - "release": { - "wordpress_org": { - "theme_slug": "hello-elementor" // ✅ Already correct - } - } -} -``` - -#### Secrets Verification Required -```yaml -# Verify these secrets exist in hello-theme repository: -- DEVOPS_TOKEN # ❓ Needs verification -- CLOUD_DEVOPS_TOKEN # ❓ Needs verification -- SLACK_BOT_TOKEN # ❓ Needs verification -- CLOUD_SLACK_BOT_TOKEN # ❓ Needs verification -- GITHUB_TOKEN # ✅ Automatically provided -``` - -### 6. Legacy Workflow Migration - -#### Current Hello Theme Workflows to Consider -- **publish-release.yml** - Should this be replaced or kept alongside? -- **publish-patch.yml** - Should this be replaced or kept alongside? -- **publish-beta.yml** - Should this be replaced or kept alongside? - -**RECOMMENDATION:** -- Keep legacy workflows for backward compatibility -- Add new release-preparation.yml as the primary release workflow -- Document which workflow should be used going forward - -### 7. Version Management Integration Decision - -#### Option A: Keep Existing JS-based Version Management -**Pros:** -- Maintains consistency with existing Hello Theme approach -- No disruption to current processes -- JS script already handles assets/scss/style.scss - -**Cons:** -- Different from Hello Commerce/Hello Biz approach -- Requires adapting bump-theme-version action significantly - -#### Option B: Adopt Hello Commerce Bash Approach -**Pros:** -- Consistent with Hello Commerce/Hello Biz -- Minimal adaptation of bump-theme-version action -- Proven workflow in production - -**Cons:** -- May not handle assets/scss/style.scss (Hello Theme specific) -- Disrupts existing Hello Theme version management - -**RECOMMENDATION:** Option A - Keep existing JS approach but integrate it into the GitHub Actions workflow - -### 8. Testing Strategy - -#### Pre-deployment Testing -1. **Build compatibility test**: Verify hello-theme builds correctly with cloned workflow -2. **Version management test**: Ensure all files are updated consistently -3. **Legacy workflow coexistence**: Test that new workflow doesn't conflict with existing ones -4. **Dependency test**: Verify all npm/composer dependencies install correctly - -#### Post-deployment Testing -1. **End-to-end test**: Complete release process on test branch -2. **Build artifact validation**: Verify hello-elementor-{version}.zip is created correctly -3. **Version synchronization**: Ensure all version fields are updated properly -4. **Legacy workflow test**: Ensure existing workflows still function - -### 9. Risk Analysis - -#### High Risk Items -- **Build process differences**: Hello Theme has more complex build with sass/webpack -- **Version management integration**: Two different approaches (JS vs Bash) -- **Legacy workflow conflicts**: New workflow might interfere with existing ones -- **Package naming confusion**: hello-elementor vs hello-theme naming - -#### Mitigation Strategies -- Thorough build compatibility testing with dry_run mode -- Careful integration of existing version management scripts -- Clear documentation of workflow migration path -- Comprehensive testing of all build artifacts - -### 10. Questions for Clarification - -#### Critical Questions: -1. **Build Action Strategy**: Should we replace the existing build-theme action with hello-commerce version, or adapt hello-commerce workflow to use hello-theme's more sophisticated build action? - -2. **Version Management Approach**: Should we keep Hello Theme's existing `update-version-in-files.js` approach or adopt Hello Commerce's bash-based approach? - -3. **Legacy Workflows**: Should the existing publish-*.yml workflows be deprecated, kept alongside, or replaced entirely? - -4. **Package Naming**: The repository is `hello-theme` but the theme name is `hello-elementor` - confirm that build artifacts should be named `hello-elementor-{version}.zip`? - -5. **SCSS Handling**: Hello Theme has `assets/scss/style.scss` that needs version updates - how should this be integrated? - -6. **Release Branch Strategy**: Hello Theme uses branch "3.4" - should this be updated to match Hello Commerce pattern? - -#### Build Process Questions: -7. **Build Script**: Should we use Hello Theme's `zip` script or adapt to Hello Commerce's `package:zip` pattern? - -8. **Dependency Complexity**: Hello Theme has more complex dependencies (sass, webpack) - any specific adaptations needed? - -#### Workflow Integration Questions: -9. **Slack Notifications**: Theme display name should be "Hello Elementor" not "Hello Theme" - confirm? - -10. **WordPress.org Integration**: Should Hello Theme adopt Hello Commerce's auto-deploy feature or keep manual upload? - -### 11. Implementation Checklist - -#### GitHub Actions Creation -- [ ] Copy and adapt install-dependencies from hello-commerce -- [ ] Copy and adapt bump-theme-version from hello-commerce (integrate with existing JS version management) -- [ ] Copy and adapt get-changelog-from-readme from hello-commerce -- [ ] Copy and adapt create-pr-with-bumped-theme-version from hello-commerce -- [ ] Copy and adapt update-main-branch-version from hello-commerce -- [ ] Copy and adapt theme-slack-notification from hello-commerce (customize for hello-elementor) -- [ ] **DECISION REQUIRED:** Replace or adapt build-theme with hello-commerce version -- [ ] Copy create-theme-release from hello-commerce - -#### Scripts Creation -- [ ] Copy and adapt validate-versions.sh (update HELLO_COMMERCE → HELLO_ELEMENTOR) -- [ ] Copy and adapt generate-upload-instructions.sh (customize for hello-elementor) - -#### Workflow Setup -- [ ] Copy release-preparation.yml and customize all references -- [ ] **DECISION REQUIRED:** Deprecate or maintain existing publish-*.yml workflows -- [ ] Test with dry_run: true -- [ ] Verify all secrets are available -- [ ] Test complete end-to-end flow - -#### Version Management Integration -- [ ] **DECISION REQUIRED:** Choose version management approach (JS vs Bash) -- [ ] Ensure assets/scss/style.scss is handled properly -- [ ] Test version consistency across all files - -#### Compatibility Testing -- [ ] Test build process compatibility -- [ ] Verify all dependencies install correctly -- [ ] Test build artifact creation (hello-elementor-{version}.zip) -- [ ] Validate version synchronization - -#### Documentation -- [ ] Update team documentation with new process -- [ ] Create migration guide from legacy workflows -- [ ] Document manual fallback procedures - -## Conclusion - -This PRD provides a comprehensive roadmap for cloning the hello-commerce release-preparation workflow to hello-theme. The primary complexity lies in the integration of different version management approaches and build processes. Critical decisions are needed around build action replacement and version management integration. - -**Estimated Implementation Time**: 6-8 hours (more complex than Hello Biz due to build process differences) -**Primary Risk**: Version management integration and build process compatibility -**Key Dependencies**: Build action strategy decision, version management approach decision - ---- - -*This PRD serves as the authoritative guide for implementing the release preparation workflow in hello-theme. All implementation should follow this specification after critical decisions are resolved.* diff --git a/.github/CRITICAL-QUESTIONS-FOR-IMPLEMENTATION.md b/.github/CRITICAL-QUESTIONS-FOR-IMPLEMENTATION.md deleted file mode 100644 index 31743901..00000000 --- a/.github/CRITICAL-QUESTIONS-FOR-IMPLEMENTATION.md +++ /dev/null @@ -1,383 +0,0 @@ -# Critical Questions for Hello Commerce → Hello Theme Workflow Clone - -## Overview -Before proceeding with the workflow cloning, these critical questions must be answered to ensure successful implementation. Each question impacts the implementation approach and requires stakeholder input. - ---- - -## 1. Build Process Strategy Questions - -### Q1: Build Action Replacement Strategy -**Context:** Hello Theme has a more sophisticated build-theme action with retry logic and error handling, while Hello Commerce has a simpler approach. - -**Question:** Should we: -- **Option A:** Replace Hello Theme's build-theme action with Hello Commerce version? -- **Option B:** Keep Hello Theme's build-theme action and adapt Hello Commerce workflow to use it? -- **Option C:** Merge the best features from both actions? - -**Current State:** -- Hello Theme: 72-line sophisticated build action with retry logic -- Hello Commerce: 68-line simpler build action - -**Impact:** Medium - affects build reliability and error handling - -**Recommendation:** Option B - Keep Hello Theme's superior build action - -HVV: For all duplicate files or folder names, add the suffix '-release', e.g. 'build-theme-release'. Use the workflows and actions from Hello Commerce if possible. Logic: I would like to clone existing files as much possible, so that we can't break the workflows with new implementations. - ---- - -### Q2: Build Script Naming Strategy -**Context:** Different script names between repositories - -**Hello Theme:** `npm run zip` (creates hello-elementor-{version}.zip) -**Hello Commerce:** `npm run package:zip` (creates hello-commerce-{version}.zip) - -**Question:** Should we: -- **Option A:** Update Hello Theme package.json to use `package:zip` script name? -- **Option B:** Adapt workflow to use Hello Theme's `zip` script? -- **Option C:** Create alias script for backward compatibility? - -**Impact:** Low - cosmetic change but affects script consistency - -**Recommendation:** Option B - Use Hello Theme's existing script names - -HVV: Use option A. Add the option to use 'package:zip'. Don't remove any existing options. - ---- - -## 2. Version Management Integration Questions - -### Q3: Version Management Approach -**Context:** Two different approaches for version management - -**Hello Theme Current:** JavaScript-based `update-version-in-files.js` -- Updates: `assets/scss/style.scss`, `functions.php`, `readme.txt` -- Uses replace-in-file package -- Already integrated into existing workflows - -**Hello Commerce:** Bash-based approach in GitHub Actions -- Updates: `package.json`, `functions.php`, `style.css`, `readme.txt` -- Uses sed commands -- Integrated into release-preparation workflow - -**Question:** Should we: -- **Option A:** Replace Hello Theme's JS approach with Hello Commerce bash approach? -- **Option B:** Keep Hello Theme's JS approach and adapt GitHub Actions to call it? -- **Option C:** Hybrid approach - use bash for some files, JS for SCSS-specific files? - -**Impact:** High - affects version synchronization reliability - -**Recommendation:** Option B - Keep Hello Theme's existing approach for continuity - -HVV: Option A. But don't delete any existing functionality. - ---- - -### Q4: SCSS File Version Management -**Context:** Hello Theme has `assets/scss/style.scss` that needs version management - -**Question:** How should version updates be handled for SCSS files? -- **Option A:** Add SCSS handling to Hello Commerce's bash approach -- **Option B:** Keep Hello Theme's JS approach which already handles SCSS -- **Option C:** Manual SCSS version management (not recommended) - -**Current Hello Theme JS script updates:** -```javascript -files: './assets/scss/style.scss', -from: /Version:.*$/m, -to: `Version: ${ VERSION }`, -``` - -**Impact:** High - SCSS files must have correct versions for WordPress.org compliance - -**Recommendation:** Option B - Leverage existing JS script capability - -HVV: Use option A. - ---- - -## 3. Repository and Theme Naming Questions - -### Q5: Theme Display Name Confirmation -**Context:** Repository name vs theme display name confusion - -**Repository:** `elementor/hello-theme` -**Theme Name:** "Hello Elementor" -**Package Name:** `hello-elementor` -**Build Artifact:** `hello-elementor-{version}.zip` - -**Question:** Confirm the correct naming for all workflow messages: -- Slack notifications should say "Hello Elementor" (not "Hello Theme")? -- Build artifacts should be named `hello-elementor-{version}.zip`? -- WordPress.org references should use `hello-elementor`? - -**Impact:** Medium - affects user communication and artifact naming - -**Recommendation:** Use "Hello Elementor" for all user-facing messages - -HVV: Compary with the 'Publish Release Version' workflow. -'hello-elementor' seems correct. -WordPress url: https://en-za.wordpress.org/themes/hello-elementor/ -Github url: https://github.com/elementor/hello-theme - ---- - -### Q6: Repository Reference Strategy -**Context:** GitHub repository references throughout workflow - -**Question:** Should workflow references point to: -- **Option A:** `elementor/hello-theme` (actual repository) -- **Option B:** Update any hardcoded references to be dynamic -- **Option C:** Mix of repository and theme names where contextually appropriate - -**Examples:** -- GitHub release URLs: `github.com/elementor/hello-theme/releases` -- Action references: `.github/actions/build-theme` (repository context) -- Theme references: WordPress.org URLs use `hello-elementor` - -**Impact:** Low - mainly affects URLs and references - -**Recommendation:** Option A - Use actual repository name for all GitHub references - -HVV: Option A. - ---- - -## 4. Legacy Workflow Migration Questions - -### Q7: Legacy Workflow Coexistence Strategy -**Context:** Hello Theme has existing release workflows - -**Existing Workflows:** -- `publish-release.yml` - Full release process -- `publish-patch.yml` - Patch releases -- `publish-beta.yml` - Beta releases - -**Question:** What should happen to these workflows when release-preparation.yml is added? -- **Option A:** Keep all workflows active (coexistence) -- **Option B:** Deprecate legacy workflows with migration timeline -- **Option C:** Immediately replace/disable legacy workflows -- **Option D:** Keep beta workflow, replace others - -**Impact:** High - affects team workflow and potential conflicts - -**Recommendation:** Option A initially, then Option B with documented migration plan - -HVV: Option A. - ---- - -### Q8: Workflow Migration Timeline -**Context:** Team needs clear guidance on workflow transition - -**Question:** What should be the migration strategy? -- **Option A:** Immediate switch to new workflow for all releases -- **Option B:** Parallel operation for 1-2 release cycles, then deprecate old workflows -- **Option C:** Feature branch testing first, then gradual rollout -- **Option D:** Team choice per release type - -**Impact:** High - affects team adoption and risk management - -**Recommendation:** Option C - Feature branch testing, then Option B parallel operation - -HVV: Option D: Keep both options in parellel. We don't want a single change to the existing functionality. - ---- - -## 5. Secret and Configuration Questions - -### Q9: GitHub Secrets Verification -**Context:** New workflow requires specific secrets - -**Required Secrets:** -- `DEVOPS_TOKEN` - For composer authentication -- `CLOUD_DEVOPS_TOKEN` - For NPM registry access -- `SLACK_BOT_TOKEN` - For release notifications -- `CLOUD_SLACK_BOT_TOKEN` - For build notifications - -**Question:** Which of these secrets are already available in hello-theme repository? - -**Current Hello Theme Workflows Use:** -- `MAINTAIN_TOKEN` (for publish-*.yml workflows) -- Other secrets TBD - -**Action Required:** Verify secret availability and configure missing ones - -HVV: GITHUB_TOKEN, CLOUD_DEVOPS_TOKEN. Ignore the slack issues for now. - ---- - -### Q10: Slack Notification Configuration -**Context:** Release notifications need proper channel configuration - -**Question:** What are the correct Slack settings for Hello Theme releases? -- **Channel:** Which Slack channel should receive notifications? -- **Format:** Should notifications distinguish Hello Elementor from other Elementor themes? -- **Frequency:** All releases, or only major/minor releases? - -**Current Default:** `#release` (from config) - -**Impact:** Medium - affects team communication - -HVV: Leave as is for now. - ---- - -## 6. WordPress.org Integration Questions - -### Q11: WordPress.org Release Process -**Context:** Different WordPress.org integration approaches - -**Hello Commerce:** Auto-deploy to WordPress.org (in config) -**Hello Theme:** Manual upload process (in config) - -**Question:** Should Hello Theme adopt auto-deploy or keep manual process? -- **Option A:** Keep manual upload (current Hello Theme approach) -- **Option B:** Adopt auto-deploy (Hello Commerce approach) -- **Option C:** Configurable per release type - -**Impact:** Medium - affects release automation level - -**Recommendation:** Option A - Keep manual for safety, consider Option B later - -HVV: Follow Hello Commerce for now. - ---- - -## 7. Technical Integration Questions - -### Q12: Release Branch Strategy -**Context:** Different branching approaches - -**Hello Commerce:** Release branches `["1.0"]` -**Hello Theme:** Release branches `["3.4"]` - -**Question:** Should Hello Theme: -- **Option A:** Keep current "3.4" branch approach -- **Option B:** Adopt Hello Commerce pattern -- **Option C:** Update to next major version pattern (e.g., "3.5") - -**Impact:** Low - affects branch validation in workflow - -**Recommendation:** Option A - Keep existing approach - -HVV: Option A. - ---- - -### Q13: Testing and Validation Strategy -**Context:** Ensuring workflow compatibility - -**Question:** What testing approach should we use? -- **Option A:** Create test branch and run full dry_run workflow -- **Option B:** Test individual actions separately, then full workflow -- **Option C:** Test on fork repository first -- **Option D:** All of the above - -**Required Tests:** -- Build process compatibility -- Version management accuracy -- Secret availability -- Legacy workflow coexistence - -**Impact:** High - affects implementation success - -**Recommendation:** Option D - Comprehensive testing approach - -HVV: I will test manually. - ---- - -## 8. Documentation and Training Questions - -### Q14: Team Training Requirements -**Context:** New workflow requires team education - -**Question:** What documentation/training is needed? -- **Option A:** Written documentation only -- **Option B:** Team walkthrough session -- **Option C:** Both documentation and training session -- **Option D:** Gradual rollout with mentoring - -**Documentation Needs:** -- Migration guide from legacy workflows -- New workflow usage instructions -- Troubleshooting guide -- Rollback procedures - -**Impact:** Medium - affects adoption success - -**Recommendation:** Option C - Both written docs and training - -HVV: None. - ---- - -## 9. Priority and Timeline Questions - -### Q15: Implementation Priority -**Context:** Resource allocation and timeline planning - -**Question:** What is the priority and timeline for this implementation? -- **High Priority:** Implement immediately (1-2 weeks) -- **Medium Priority:** Implement in next sprint (3-4 weeks) -- **Low Priority:** Implement when convenient (1-2 months) - -**Factors to Consider:** -- Current Hello Theme release schedule -- Team availability -- Upcoming releases that could benefit from new workflow - -HVV: Today - ---- - -### Q16: Rollback Strategy -**Context:** Risk mitigation planning - -**Question:** What should be the rollback plan if issues arise? -- **Option A:** Revert to legacy workflows immediately -- **Option B:** Fix issues in new workflow -- **Option C:** Hybrid approach - use working parts, fallback for broken parts - -**Impact:** High - affects risk management - -**Recommendation:** Option A with documented quick rollback procedures - -HVV: We won't update any existing worfklows. There is no risk. - ---- - -## Decision Matrix Summary - -| Question | Impact | Urgency | Recommended Option | -|----------|--------|---------|-------------------| -| Q1: Build Action Strategy | Medium | High | Keep Hello Theme's build action | -| Q2: Script Names | Low | Medium | Use Hello Theme's scripts | -| Q3: Version Management | High | High | Keep Hello Theme's JS approach | -| Q4: SCSS Handling | High | High | Use existing JS script | -| Q5: Theme Names | Medium | High | Use "Hello Elementor" | -| Q6: Repository References | Low | Medium | Use actual repository names | -| Q7: Legacy Workflows | High | Medium | Coexistence then migration | -| Q8: Migration Timeline | High | High | Feature testing → Parallel | -| Q9: Secrets | High | High | Verify availability | -| Q10: Slack Config | Medium | Medium | Confirm channel/format | -| Q11: WordPress.org | Medium | Low | Keep manual process | -| Q12: Branch Strategy | Low | Low | Keep "3.4" approach | -| Q13: Testing Strategy | High | High | Comprehensive testing | -| Q14: Training | Medium | Medium | Docs + training session | -| Q15: Priority | High | High | TBD by stakeholders | -| Q16: Rollback Plan | High | High | Quick revert procedures | - ---- - -## Next Steps - -1. **Answer high-impact questions** (Q3, Q4, Q7, Q8, Q9, Q13, Q16) -2. **Verify technical requirements** (secrets, build compatibility) -3. **Create implementation timeline** based on priorities -4. **Begin Phase 1 implementation** with answered questions -5. **Schedule team training** once workflow is ready - -**All questions marked as "High Impact" must be answered before implementation begins.** diff --git a/.github/USE-MAIN-WORKFLOW.md b/.github/USE-MAIN-WORKFLOW.md new file mode 100644 index 00000000..c9ef3ad8 --- /dev/null +++ b/.github/USE-MAIN-WORKFLOW.md @@ -0,0 +1,342 @@ +# USE MAIN WORKFLOW - HELLO THEME ANALYSIS + +## 🎯 OBJECTIVE +Analyze Hello Theme's workflow setup and trace what happens when version 3.4.4 is passed as input, examining how build files, workflow/action files, and test files are handled. + +## 📋 SCENARIO ANALYSIS: HELLO THEME VERSION 3.4.4 + +### 🔄 **FLOW OVERVIEW** +When version `hello_theme_version: "3.4.4"` is passed to the workflow, here's what happens: + +``` +Daily Matrix → Playwright Workflow → NO CHECKOUT → Build Process → Test Extraction + ↓ ↓ ↓ ↓ ↓ + 3.4.4 3.4.4 input main branch main source 3.4.4 tests +``` + +--- + +## 🚨 **CRITICAL DISCOVERY: HELLO THEME HAS NO PRESERVE/RESTORE PATTERN** + +### **Hello Theme's Unique Approach:** +Unlike Hello Biz, Hello Commerce, and Hello Plus, **Hello Theme does NOT implement any version checkout logic**. It uses a completely different strategy: + +1. **Always builds from main branch** (current source code) +2. **Only extracts tests** from the target version +3. **No preserve/restore pattern** needed + +--- + +## 🏗️ **PART 1: BUILD FILES (What gets built)** + +### **Build Process Flow:** +```yaml +# Lines 59-108: playwright-with-specific-elementor-version.yml +- name: Set version outputs + run: | + # Hello Theme version from current repo (like Hello Commerce pattern) + HT_VERSION=$(node -p "require('./package.json').version") # Gets 3.4.4 + + # Input version for reference (main, etc.) + HELLO_THEME_INPUT="${{ inputs.hello_theme_version || 'main' }}" # Gets "3.4.4" + +- name: Build Hello Theme + uses: ./.github/workflows/build-theme + with: + PACKAGE_VERSION: ${{ steps.set-versions.outputs.hello-theme-version }} # Uses 3.4.4 + BUILD_SCRIPT_PATH: "npm run build:prod" +``` + +### **Key Insight: Version Coincidence** +```yaml +# Lines 65-66: Version detection logic +HT_VERSION=$(node -p "require('./package.json').version") # Current: 3.4.4 +HELLO_THEME_INPUT="${{ inputs.hello_theme_version || 'main' }}" # Input: 3.4.4 +``` + +**Hello Theme works by coincidence**: The current main branch version (3.4.4) matches the requested test version (3.4.4). + +### **Result: Build Zip Contains:** +- ✅ **Source Code**: From Hello Theme main branch (current 3.4.4) + - `style.css` with version 3.4.4 header + - `package.json` with `"version": "3.4.4"` + - All PHP files, modules, assets from main branch + - Current dependencies from main branch `composer.json` +- ✅ **Build Assets**: Compiled from main branch source + - `assets/js/` compiled from main branch TypeScript/JavaScript + - `assets/css/` compiled from main branch SCSS + - Webpack output from main branch configuration + +**Key Point**: The build uses **main branch source code** (which happens to be version 3.4.4) with **main branch build tooling**. + +--- + +## ⚙️ **PART 2: WORKFLOW AND ACTION FILES (What executes the build)** + +### **Workflow Files Used:** +- ✅ **Source**: Always from `main` branch (current checkout) +- ✅ **Location**: `.github/workflows/` directory +- ✅ **Files**: All workflow YAML files from main branch +- ✅ **No Checkout**: No version-specific checkout happens + +### **Action Files Used:** +- ✅ **Source**: Always from `main` branch (current checkout) +- ✅ **Location**: `.github/workflows/*/action.yml` +- ✅ **Examples**: + - `.github/workflows/build-theme/action.yml` (main branch) + - All other actions from main branch + +### **Script Files Used:** +- ✅ **Source**: Always from `main` branch (current checkout) +- ✅ **Location**: `.github/scripts/` directory +- ✅ **Files**: + - `build-wp-env.js` (main branch - configures WordPress environment) + - All other scripts from main branch + +### **Critical Difference from Other Themes:** +```yaml +# Hello Theme: NO checkout step exists +# Lines 54-57: Only standard checkout +- name: Checkout Hello Theme + uses: actions/checkout@v4 + with: + fetch-depth: 0 +# No version-specific checkout follows +``` + +**Key Point**: Hello Theme **never checks out a different version**, so it always uses main branch for everything except tests. + +--- + +## 🧪 **PART 3: TEST FILES (What gets tested)** + +### **Test Extraction Process:** +```yaml +# Lines 450-524: Hybrid Test Setup - Extract tests from target version +TARGET_VERSION="${{ inputs.hello_theme_version || 'main' }}" # "3.4.4" + +# Extract tests from 3.4.4 tag +git archive "v3.4.4" tests/playwright/ | tar -x +``` + +### **Test Files Used:** +- ✅ **Source**: From Hello Theme v3.4.4 tag (version-specific) +- ✅ **Location**: `tests/playwright/` directory +- ✅ **Content**: Test files that match 3.4.4 functionality + - Test specs from 3.4.4 (`tests/playwright/tests/`) + - Page objects from 3.4.4 (`tests/playwright/pages/`) + - Test configuration from 3.4.4 (`tests/playwright/playwright.config.ts`) + +### **Hybrid Approach Logic:** +```bash +# Lines 453-455: Hybrid approach explanation +echo "🎯 HYBRID APPROACH: Always latest workflows + version-specific tests" +echo "📋 Workflow infrastructure: main branch (latest build-wp-env.js, scripts, etc.)" +echo "🧪 Test content: ${{ inputs.hello_theme_version || 'main' }} (matches theme functionality)" +``` + +### **Test Execution:** +- ✅ **Test Runner**: Uses main branch Playwright configuration and scripts +- ✅ **Test Content**: Uses 3.4.4-specific test files +- ✅ **WordPress Environment**: Built with main branch `build-wp-env.js` +- ✅ **Theme Under Test**: Hello Theme 3.4.4 build (from main branch) + +**Key Point**: Tests from 3.4.4 run against Hello Theme 3.4.4 functionality, but use main branch test infrastructure. + +--- + +## 📊 **COMPLETE VERSION MATRIX** + +| Component | Version Source | Actual Version | Purpose | +|-----------|----------------|----------------|---------| +| **Build Zip File** | main branch | 3.4.4 | Theme functionality to test | +| **Workflow Files** | main branch | Latest | Latest workflow definitions | +| **Action Files** | main branch | Latest | Latest build/deploy logic | +| **Script Files** | main branch | Latest | Latest automation scripts | +| **Test Files** | v3.4.4 tag | 3.4.4 | Tests matching theme functionality | +| **Test Infrastructure** | main branch | Latest | Latest test runner and environment | + +--- + +## 🔍 **DETAILED FLOW ANALYSIS** + +### **Step 1: Daily Matrix Triggers Workflow** +```bash +# Daily matrix generates combinations like: +{"combination":"ht-ga-el-main","name":"Hello Theme 3.4.4 (GA) + Elementor main","hello_theme_version":"3.4.4","elementor_version":"main"} +``` + +### **Step 2: Workflow Receives Input** +```yaml +# Lines 9-12: playwright-with-specific-elementor-version.yml +inputs: + hello_theme_version: + description: 'Hello Theme version to test (e.g., 3.4.4 or main)' + default: 'main' + # Receives: "3.4.4" +``` + +### **Step 3: Version Detection (No Checkout)** +```bash +# Lines 65-69: Set version variables +HT_VERSION=$(node -p "require('./package.json').version") # Gets 3.4.4 from main +HELLO_THEME_INPUT="3.4.4" # Input version + +# No checkout happens - stays on main branch +``` + +### **Step 4: Build Process** +```bash +# Lines 104-108: Build step +- name: Build Hello Theme + uses: ./.github/workflows/build-theme + with: + PACKAGE_VERSION: 3.4.4 # Uses current main branch version + BUILD_SCRIPT_PATH: "npm run build:prod" +``` + +### **Step 5: Test Extraction** +```bash +# Lines 487-489: Test extraction +echo "📥 Extracting tests directory from v3.4.4..." +rm -rf ./tests/playwright/ +git archive "v3.4.4" tests/playwright/ | tar -x +``` + +### **Step 6: Test Execution** +```bash +# Test runner uses: +# - Hello Theme 3.4.4 theme (built from main) +# - Tests from 3.4.4 (extracted) +# - Test infrastructure from main (latest) +``` + +--- + +## 🚨 **CRITICAL OBSERVATIONS** + +### **✅ What Works (By Coincidence):** +1. **Current Version Match**: Main branch is currently at 3.4.4 +2. **No Checkout Needed**: Since main = requested version +3. **Hybrid Test Approach**: Uses latest infrastructure with version-specific tests +4. **Simplified Logic**: No complex preserve/restore pattern needed + +### **⚠️ Critical Vulnerabilities:** +1. **Version Dependency**: Only works when main branch version = requested version +2. **Future Versions**: Will break when main branch advances to 3.4.5+ +3. **Past Versions**: Cannot test versions older than current main +4. **No Preserve/Restore**: Missing the pattern other themes have + +### **🔧 Comparison with Other Themes:** + +| Theme | Approach | Version Handling | Risk Level | +|-------|----------|------------------|------------| +| **Hello Biz** | Preserve/Restore | ✅ Any version | ✅ Low | +| **Hello Commerce** | Preserve/Restore | ✅ Any version | ✅ Low | +| **Hello Plus** | JavaScript Script | ✅ Any version | ✅ Low | +| **Hello Theme** | No Checkout | ❌ Current version only | 🚨 High | + +--- + +## 🎯 **HELLO THEME'S FUNDAMENTAL PROBLEM** + +### **The Issue:** +Hello Theme's approach **only works by coincidence** because: +- Main branch version: 3.4.4 +- Requested test version: 3.4.4 +- **They happen to match** + +### **What Happens When They Don't Match:** + +#### **Scenario A: Testing Hello Theme 3.4.3** +```bash +# Input: hello_theme_version: "3.4.3" +# Main branch: 3.4.4 +# Result: Builds 3.4.4 source, tests with 3.4.3 tests → Version mismatch! +``` + +#### **Scenario B: Main Branch Advances to 3.4.5** +```bash +# Input: hello_theme_version: "3.4.4" +# Main branch: 3.4.5 +# Result: Builds 3.4.5 source, tests with 3.4.4 tests → Version mismatch! +``` + +### **The Root Cause:** +Hello Theme **lacks the preserve/restore pattern** that other themes have implemented. + +--- + +## 🔧 **RECOMMENDED SOLUTION** + +### **Hello Theme Needs Preserve/Restore Pattern:** + +Hello Theme should implement the same preserve/restore pattern as Hello Biz and Hello Commerce: + +1. **Add version validation and preserve step** +2. **Add checkout specific version step** +3. **Add restore main branch actions step** +4. **Add cleanup steps** + +This would ensure: +- ✅ **Build**: Uses requested version source code (3.4.4) +- ✅ **Workflows/Actions**: Always uses main branch (latest) +- ✅ **Tests**: Uses version-specific tests (3.4.4) + +--- + +## 🤔 **CRITICAL QUESTIONS** + +### **1. Why Does Hello Theme Work Currently?** +**Answer**: Pure coincidence - main branch version matches requested version. + +### **2. What Happens When Versions Don't Match?** +**Answer**: Version mismatch - builds wrong version, tests with different version. + +### **3. Should Hello Theme Implement Preserve/Restore?** +**Answer**: Yes, to ensure consistent behavior across all themes. + +### **4. Is Hello Theme's Approach Intentional?** +**Answer**: Likely not - it appears to be missing the pattern other themes have. + +--- + +## 📋 **IMPLEMENTATION RECOMMENDATION** + +### **Hello Theme Should:** +1. **Implement preserve/restore pattern** like Hello Biz/Commerce +2. **Add version checkout logic** to handle any requested version +3. **Maintain hybrid test approach** (works well) +4. **Add proper error handling** for missing versions + +### **Benefits:** +- ✅ **Consistency**: Same pattern across all themes +- ✅ **Reliability**: Works for any version combination +- ✅ **Future-proof**: Won't break when main branch advances +- ✅ **Maintainability**: Predictable behavior + +--- + +## 🎯 **CONCLUSION** + +### **Hello Theme Version 3.4.4 Flow Summary:** + +1. **Build Zip**: Contains main branch source (happens to be 3.4.4) +2. **Workflow/Actions**: Always use main branch (current checkout) +3. **Tests**: Extract 3.4.4-specific tests but run with main branch infrastructure + +### **Key Insight:** +Hello Theme **works by pure coincidence** because the main branch version (3.4.4) matches the requested test version (3.4.4). This approach is **fundamentally fragile** and will break when versions don't align. + +### **The Pattern Works Currently Because:** +- ✅ **Source Code**: Happens to match the version being tested (3.4.4) +- ✅ **Build Tools**: Always latest (main branch) +- ✅ **Test Content**: Matches theme functionality (3.4.4) +- ✅ **Test Infrastructure**: Always latest (main branch) + +### **But It Will Break When:** +- ❌ **Main branch advances** to 3.4.5+ +- ❌ **Testing older versions** like 3.4.3 +- ❌ **Any version mismatch** occurs + +**Hello Theme needs the preserve/restore pattern to ensure reliable version testing like the other themes.** diff --git a/.github/actions/build-theme-release/action.yml b/.github/actions/build-theme-release/action.yml index 3329bb5c..756e28ec 100644 --- a/.github/actions/build-theme-release/action.yml +++ b/.github/actions/build-theme-release/action.yml @@ -45,15 +45,15 @@ runs: - name: Create theme build directory shell: bash run: | - mkdir -p /tmp/hello-elementor-builds + mkdir -p /tmp/hello-theme-builds - name: Package theme shell: bash env: PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} run: | - # Create zip file with proper naming (hello-elementor instead of hello-theme) - zip -r "/tmp/hello-elementor-builds/hello-elementor-${PACKAGE_VERSION}.zip" . \ + # Create zip file with hello-theme naming (hardcoded, not from package.json) + zip -r "/tmp/hello-theme-builds/hello-theme-${PACKAGE_VERSION}.zip" . \ -x "node_modules/*" "test-results/*" "tests/*" ".git/*" "*.zip" \ "playwright-report/*" ".wp-env.json.*" ".wp-env" @@ -62,11 +62,11 @@ runs: env: PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} run: | - mv "/tmp/hello-elementor-builds/hello-elementor-${PACKAGE_VERSION}.zip" \ - "./hello-elementor-${PACKAGE_VERSION}.zip" + mv "/tmp/hello-theme-builds/hello-theme-${PACKAGE_VERSION}.zip" \ + "./hello-theme-${PACKAGE_VERSION}.zip" - echo "✅ Hello Elementor theme build complete: hello-elementor-${PACKAGE_VERSION}.zip" - ls -la hello-elementor-*.zip + echo "✅ Hello Elementor theme build complete: hello-theme-${PACKAGE_VERSION}.zip" + ls -la hello-theme-*.zip # Set build path for downstream actions - echo "BUILD_ZIP_PATH=hello-elementor-${PACKAGE_VERSION}.zip" >> $GITHUB_ENV + echo "BUILD_ZIP_PATH=hello-theme-${PACKAGE_VERSION}.zip" >> $GITHUB_ENV diff --git a/.github/actions/create-pr-with-bumped-theme-version-release/action.yml b/.github/actions/create-pr-with-bumped-theme-version-release/action.yml index 6d69ebfb..1c10bc8a 100644 --- a/.github/actions/create-pr-with-bumped-theme-version-release/action.yml +++ b/.github/actions/create-pr-with-bumped-theme-version-release/action.yml @@ -22,19 +22,31 @@ runs: git config user.email "github-actions[bot]@users.noreply.github.com" - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: token: ${{ inputs.token }} commit-message: "chore: bump Hello Elementor version to v${{ inputs.package_version }}" branch: release/v${{ inputs.package_version }} title: "Release Hello Elementor v${{ inputs.package_version }}" - body: "Automated PR to bump Hello Elementor version for release." + body: | + ## 🚀 Hello Elementor Release v${{ inputs.package_version }} + + This automated PR bumps the Hello Elementor theme version for release. + + ### Changes: + - Updated version in `package.json` + - Updated version in `functions.php` + - Updated version in `style.css` + - Updated version in `readme.txt` + + ### Release: + - GitHub release: https://github.com/elementor/hello-theme/releases/tag/v${{ inputs.package_version }} + + Ready for review and merge! 🎉 base: ${{ inputs.base_branch }} add-paths: | package.json package-lock.json functions.php style.css - theme.json readme.txt - assets/scss/style.scss diff --git a/.github/actions/update-main-branch-version-release/action.yml b/.github/actions/update-main-branch-version-release/action.yml index 2d5558cb..743063a4 100644 --- a/.github/actions/update-main-branch-version-release/action.yml +++ b/.github/actions/update-main-branch-version-release/action.yml @@ -137,7 +137,7 @@ runs: # Extract and update functions.php (Hello Elementor specific) git show "origin/$DEFAULT_BRANCH:functions.php" > functions.php || exit 1 - sed -i.bak "s/define( 'HELLO_ELEMENTOR_VERSION', '[^']*'/define( 'HELLO_ELEMENTOR_VERSION', '$NEW_VERSION' /" functions.php || exit 1 + sed -i.bak "s/define( 'HELLO_ELEMENTOR_VERSION', '[^']*' );/define( 'HELLO_ELEMENTOR_VERSION', '$NEW_VERSION' );/" functions.php || exit 1 rm -f functions.php.bak # Verify functions.php was actually updated if ! grep -q "HELLO_ELEMENTOR_VERSION.*$NEW_VERSION" functions.php; then @@ -246,4 +246,3 @@ runs: functions.php style.css readme.txt - assets/scss/style.scss diff --git a/.github/config/release.json b/.github/config/release.json index f15804ba..798d0721 100644 --- a/.github/config/release.json +++ b/.github/config/release.json @@ -12,7 +12,7 @@ "release": { "changelog_file": "readme.txt", "changelog_section": "## Changelog", - "build_artifacts": ["hello-elementor.zip"], + "build_artifacts": ["hello-theme.zip"], "wordpress_org": { "manual_upload": true, "theme_slug": "hello-elementor" diff --git a/.github/scripts/daily-report.js b/.github/scripts/daily-report.js index 20380146..0bbf29dc 100644 --- a/.github/scripts/daily-report.js +++ b/.github/scripts/daily-report.js @@ -105,6 +105,10 @@ function generateDailyMarkdownReport( results ) { report += ` - \`X.Y.Z (GA)\` = General availability release version\n`; report += ` - \`latest-stable\` = Latest published version from WordPress.org\n\n`; + report += `## 🔄 Reliability Features\n\n`; + report += `- **WordPress Environment**: Automatic retry logic (5 attempts, 30s intervals)\n`; + report += `- **Failure Recovery**: Automatic cleanup and restart on wp-env failures\n\n`; + report += `*Generated at ${ new Date().toISOString() }*`; return report; diff --git a/.github/scripts/generate-upload-instructions-release.sh b/.github/scripts/generate-upload-instructions-release.sh index 55291da2..252b9125 100755 --- a/.github/scripts/generate-upload-instructions-release.sh +++ b/.github/scripts/generate-upload-instructions-release.sh @@ -6,8 +6,8 @@ set -e # Get current version PACKAGE_VERSION=$(node -p "require('./package.json').version") -THEME_SLUG=$(node -p "require('./package.json').name") -BUILD_ZIP="${THEME_SLUG}-${PACKAGE_VERSION}.zip" +# Use hardcoded hello-theme prefix for GitHub releases (different from package.json name) +BUILD_ZIP="hello-theme-${PACKAGE_VERSION}.zip" echo "📋 **Hello Elementor v${PACKAGE_VERSION} - Manual Upload Instructions**" echo "" @@ -19,7 +19,7 @@ echo "📦 **Package Details:**" echo " - Theme: Hello Elementor" echo " - Version: v${PACKAGE_VERSION}" echo " - Build File: ${BUILD_ZIP}" -echo " - Theme Slug: ${THEME_SLUG}" +echo " - GitHub Package: ${BUILD_ZIP}" echo "" echo "📋 **Manual Upload Steps:**" echo "" diff --git a/.github/workflows/playwright-with-specific-elementor-version.yml b/.github/workflows/playwright-with-specific-elementor-version.yml index ed5c547d..bd99a19b 100644 --- a/.github/workflows/playwright-with-specific-elementor-version.yml +++ b/.github/workflows/playwright-with-specific-elementor-version.yml @@ -4,27 +4,27 @@ on: workflow_dispatch: inputs: core_branch: - description: 'Elementor Core Branch' + description: "Elementor Core Branch" required: true hello_theme_version: - description: 'Hello Theme version to test (e.g., 3.4.4 or main)' + description: "Hello Theme version to test (e.g., 3.4.4 or main)" required: false - default: 'main' + default: "main" tag: - description: 'Provide @tag or a keyword' + description: "Provide @tag or a keyword" required: false workflow_call: inputs: core_branch: - description: 'Elementor Core Branch' + description: "Elementor Core Branch" required: true type: string hello_theme_version: - description: 'Hello Theme version to test (e.g., 3.4.4 or main)' + description: "Hello Theme version to test (e.g., 3.4.4 or main)" required: false type: string tag: - description: 'Provide @tag or a keyword' + description: "Provide @tag or a keyword" required: false type: string secrets: @@ -61,13 +61,13 @@ jobs: run: | # Set Elementor Core branch from input (can be branch name or version) ELEMENTOR_CORE_BRANCH="${{ inputs.core_branch }}" - + # Hello Theme version from current repo (like Hello Commerce pattern) HT_VERSION=$(node -p "require('./package.json').version") - + # Input version for reference (main, etc.) HELLO_THEME_INPUT="${{ inputs.hello_theme_version || 'main' }}" - + # Determine source type for reporting - Hello Theme always builds from GitHub # Unlike Hello Commerce/Biz, Hello Theme doesn't download from WordPress.org if [[ "$HELLO_THEME_INPUT" == "main" ]]; then @@ -82,23 +82,23 @@ jobs: HELLO_THEME_SOURCE_TYPE="git-branch" HELLO_THEME_SOURCE="github" fi - + echo "hello-theme-version=${HT_VERSION}" >> $GITHUB_OUTPUT echo "hello-theme-input=${HELLO_THEME_INPUT}" >> $GITHUB_OUTPUT echo "hello-theme-source-type=${HELLO_THEME_SOURCE_TYPE}" >> $GITHUB_OUTPUT echo "hello-theme-source=${HELLO_THEME_SOURCE}" >> $GITHUB_OUTPUT echo "elementor-core-branch=${ELEMENTOR_CORE_BRANCH}" >> $GITHUB_OUTPUT echo "elementor-version=${ELEMENTOR_CORE_BRANCH}" >> $GITHUB_OUTPUT - + # Set environment variables for later steps echo "HELLO_THEME_VERSION=${HT_VERSION}" >> $GITHUB_ENV echo "HELLO_THEME_INPUT=${HELLO_THEME_INPUT}" >> $GITHUB_ENV echo "HELLO_THEME_SOURCE_TYPE=${HELLO_THEME_SOURCE_TYPE}" >> $GITHUB_ENV - + # Generate artifact name using input version for readability ARTIFACT_NAME="core-ht${HELLO_THEME_INPUT}-el${ELEMENTOR_CORE_BRANCH}-${{ github.run_id }}" echo "artifact-name=${ARTIFACT_NAME}" >> $GITHUB_OUTPUT - + echo "✅ Set versions: Hello Theme=${HT_VERSION} (${HELLO_THEME_INPUT}), Elementor=${ELEMENTOR_CORE_BRANCH}" - name: Build Hello Theme @@ -107,16 +107,14 @@ jobs: PACKAGE_VERSION: ${{ steps.set-versions.outputs.hello-theme-version }} BUILD_SCRIPT_PATH: "npm run build:prod" - - - name: Download Elementor Core run: | ELEMENTOR_CORE_BRANCH="${{ steps.set-versions.outputs.elementor-core-branch }}" echo "Downloading Elementor Core branch: ${ELEMENTOR_CORE_BRANCH}" - + # Create Elementor build directory mkdir -p ./tmp - + if [[ "$ELEMENTOR_CORE_BRANCH" == "latest-stable" ]]; then # Download latest stable from WordPress.org curl --location -o ./elementor-core.zip https://downloads.wordpress.org/plugin/elementor.latest-stable.zip @@ -181,17 +179,17 @@ jobs: ls -la ./ echo "Creating tmp directory if it doesn't exist:" mkdir -p ./tmp - + - name: Hybrid Test Setup - Extract tests from target version id: extract-version-tests run: | echo "🎯 HYBRID APPROACH: Always latest workflows + version-specific tests" echo "📋 Workflow infrastructure: main branch (latest build-wp-env.js, scripts, etc.)" echo "🧪 Test content: ${{ inputs.hello_theme_version || 'main' }} (matches theme functionality)" - + # Determine the target version for test extraction TARGET_VERSION="${{ inputs.hello_theme_version || 'main' }}" - + if [ "$TARGET_VERSION" = "main" ]; then echo "✅ Using main branch tests (already available)" TEST_VERSION="main" @@ -247,12 +245,12 @@ jobs: TEST_SOURCE_TYPE="not-available" fi fi - + # Set outputs for workflow control echo "test-version=$TEST_VERSION" >> $GITHUB_OUTPUT echo "test-source-type=$TEST_SOURCE_TYPE" >> $GITHUB_OUTPUT echo "tests-available=$TESTS_AVAILABLE" >> $GITHUB_OUTPUT - + echo "✅ Hybrid setup complete:" echo " 🏗️ Workflow infrastructure: main branch" echo " 🧪 Test content: $TEST_VERSION ($TEST_SOURCE_TYPE)" @@ -262,12 +260,12 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.x - cache: 'npm' + cache: "npm" - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.1' + php-version: "8.1" tools: composer coverage: none @@ -290,10 +288,10 @@ jobs: echo "Current directory contents:" ls -la ./ echo "" - + # Ensure tmp directory exists mkdir -p ./tmp - + echo "Checking for Elementor artifacts:" if [ -d "./tmp/elementor" ]; then echo "✅ Elementor directory found in tmp" @@ -331,7 +329,7 @@ jobs: echo "✅ Elementor fallback installed" fi fi - + echo "" echo "Final verification:" echo "tmp directory contents:" @@ -347,7 +345,7 @@ jobs: run: | echo "Extracting Hello Theme build..." HT_ZIP=$(find . -name "hello-elementor-*.zip" -type f | head -1) - + if [ -n "$HT_ZIP" ]; then echo "Found Hello Theme build: $HT_ZIP" mkdir -p ./tmp @@ -373,16 +371,33 @@ jobs: - name: Update wp-env.json file env: - PHP_VERSION: '8.1' - WP_CORE_VERSION: 'latest' + PHP_VERSION: "8.1" + WP_CORE_VERSION: "latest" HELLO_THEME_VERSION: ${{ env.HELLO_THEME_VERSION }} ELEMENTOR_VERSION: ${{ env.ELEMENTOR_VERSION }} run: node ./.github/scripts/build-wp-env.js - name: Install WordPress environment run: | - npx wp-env start - + echo "Starting WordPress environment with retry logic..." + for i in {1..5}; do + echo "Attempt $i/5: Starting wp-env..." + if npx wp-env start; then + echo "✅ WordPress environment started successfully" + break + else + echo "❌ Attempt $i failed" + if [ $i -eq 5 ]; then + echo "🚨 All attempts failed, exiting..." + exit 1 + else + echo "⏳ Waiting 30 seconds before retry..." + npx wp-env stop || true + sleep 30 + fi + fi + done + - name: Setup WordPress environment (activate plugins and themes) run: | npx wp-env run cli bash hello-elementor-config/setup.sh @@ -403,7 +418,7 @@ jobs: echo "🧪 Running tests from: ${{ steps.extract-version-tests.outputs.test-source-type }}" # Only run Hello Theme tests, not Elementor or other plugin tests npm run test:playwright -- tests/playwright/tests/ - + - name: Skip tests - version incompatible if: steps.extract-version-tests.outputs.tests-available != 'true' run: | @@ -453,10 +468,10 @@ jobs: echo "🎯 HYBRID APPROACH: Always latest workflows + version-specific tests" echo "📋 Workflow infrastructure: main branch (latest build-wp-env.js, scripts, etc.)" echo "🧪 Test content: ${{ inputs.hello_theme_version || 'main' }} (matches theme functionality)" - + # Determine the target version for test extraction TARGET_VERSION="${{ inputs.hello_theme_version || 'main' }}" - + if [ "$TARGET_VERSION" = "main" ]; then echo "✅ Using main branch tests (already available)" TEST_VERSION="main" @@ -512,12 +527,12 @@ jobs: TEST_SOURCE_TYPE="not-available" fi fi - + # Set outputs for workflow control echo "test-version=$TEST_VERSION" >> $GITHUB_OUTPUT echo "test-source-type=$TEST_SOURCE_TYPE" >> $GITHUB_OUTPUT echo "tests-available=$TESTS_AVAILABLE" >> $GITHUB_OUTPUT - + echo "✅ Hybrid setup complete:" echo " 🏗️ Workflow infrastructure: main branch" echo " 🧪 Test content: $TEST_VERSION ($TEST_SOURCE_TYPE)" @@ -527,12 +542,12 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.x - cache: 'npm' + cache: "npm" - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.1' + php-version: "8.1" tools: composer coverage: none @@ -555,10 +570,10 @@ jobs: echo "Current directory contents:" ls -la ./ echo "" - + # Ensure tmp directory exists mkdir -p ./tmp - + echo "Checking for Elementor artifacts:" if [ -d "./tmp/elementor" ]; then echo "✅ Elementor directory found in tmp" @@ -596,7 +611,7 @@ jobs: echo "✅ Elementor fallback installed" fi fi - + echo "" echo "Final verification:" echo "tmp directory contents:" @@ -612,7 +627,7 @@ jobs: run: | echo "Extracting Hello Theme build..." HT_ZIP=$(find . -name "hello-elementor-*.zip" -type f | head -1) - + if [ -n "$HT_ZIP" ]; then echo "Found Hello Theme build: $HT_ZIP" mkdir -p ./tmp @@ -638,16 +653,33 @@ jobs: - name: Update wp-env.json file env: - PHP_VERSION: '8.1' - WP_CORE_VERSION: 'latest' + PHP_VERSION: "8.1" + WP_CORE_VERSION: "latest" HELLO_THEME_VERSION: ${{ env.HELLO_THEME_VERSION }} ELEMENTOR_VERSION: ${{ env.ELEMENTOR_VERSION }} run: node ./.github/scripts/build-wp-env.js - name: Install WordPress environment run: | - npx wp-env start - + echo "Starting WordPress environment with retry logic..." + for i in {1..5}; do + echo "Attempt $i/5: Starting wp-env..." + if npx wp-env start; then + echo "✅ WordPress environment started successfully" + break + else + echo "❌ Attempt $i failed" + if [ $i -eq 5 ]; then + echo "🚨 All attempts failed, exiting..." + exit 1 + else + echo "⏳ Waiting 30 seconds before retry..." + npx wp-env stop || true + sleep 30 + fi + fi + done + - name: Setup WordPress environment (activate plugins and themes) run: | npx wp-env run cli bash hello-elementor-config/setup.sh @@ -663,7 +695,7 @@ jobs: echo "🧪 Running tagged tests from: ${{ steps.extract-version-tests.outputs.test-source-type }}" # Only run Hello Theme tests with the specified tag npm run test:playwright -- tests/playwright/tests/ --grep="${{ github.event.inputs.tag }}" - + - name: Skip tagged tests - version incompatible if: steps.extract-version-tests.outputs.tests-available != 'true' run: | diff --git a/.github/workflows/playwright-with-specific-hello-plus-version.yml b/.github/workflows/playwright-with-specific-hello-plus-version.yml index a8c8737c..c8a63f52 100644 --- a/.github/workflows/playwright-with-specific-hello-plus-version.yml +++ b/.github/workflows/playwright-with-specific-hello-plus-version.yml @@ -4,27 +4,27 @@ on: workflow_dispatch: inputs: hello_plus_version: - description: 'Hello Plus version to test (e.g., 1.7.2 or latest-stable)' + description: "Hello Plus version to test (e.g., 1.7.2 or latest-stable)" required: true hello_theme_version: - description: 'Hello Theme version to test (e.g., 3.4.4 or main)' + description: "Hello Theme version to test (e.g., 3.4.4 or main)" required: false - default: 'main' + default: "main" tag: - description: 'Provide @tag or a keyword' + description: "Provide @tag or a keyword" required: false workflow_call: inputs: hello_plus_version: - description: 'Hello Plus version to test (e.g., 1.7.2 or latest-stable)' + description: "Hello Plus version to test (e.g., 1.7.2 or latest-stable)" required: true type: string hello_theme_version: - description: 'Hello Theme version to test (e.g., 3.4.4 or main)' + description: "Hello Theme version to test (e.g., 3.4.4 or main)" required: false type: string tag: - description: 'Provide @tag or a keyword' + description: "Provide @tag or a keyword" required: false type: string @@ -51,66 +51,136 @@ jobs: with: fetch-depth: 0 - - name: Set version outputs + - name: Set version variables and Hello Plus version id: set-versions run: | # Set Hello Plus version from input (released versions only) HELLO_PLUS_VERSION="${{ inputs.hello_plus_version }}" - - # Hello Theme version from current repo (like Hello Commerce pattern) - HT_VERSION=$(node -p "require('./package.json').version") - - # Input version for reference (main, etc.) - HELLO_THEME_INPUT="${{ inputs.hello_theme_version || 'main' }}" - - # Determine source type for reporting - Hello Theme always builds from GitHub - # Unlike Hello Commerce/Biz, Hello Theme doesn't download from WordPress.org - if [[ "$HELLO_THEME_INPUT" == "main" ]]; then - HELLO_THEME_SOURCE_TYPE="git-branch" - HELLO_THEME_SOURCE="github" - elif [[ "$HELLO_THEME_INPUT" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - # Released version input, but still built from GitHub source - HELLO_THEME_SOURCE_TYPE="git-tag" - HELLO_THEME_SOURCE="github" + + # Hello Theme source ref (main or specific GA version) - always use main actions + # Always use main actions regardless of source version - this is the key principle + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + HELLO_THEME_SOURCE="${{ inputs.hello_theme_version || 'main' }}" else - # Other cases (branches, etc.) - HELLO_THEME_SOURCE_TYPE="git-branch" - HELLO_THEME_SOURCE="github" + HELLO_THEME_SOURCE="main" fi - + + # Current Hello Theme version from package.json (actual version string) + HT_VERSION=$(node -p "require('./package.json').version") + + echo "HELLO_PLUS_VERSION=${HELLO_PLUS_VERSION}" >> $GITHUB_ENV + echo "HELLO_THEME_SOURCE=${HELLO_THEME_SOURCE}" >> $GITHUB_ENV + echo "HELLO_THEME_VERSION=${HT_VERSION}" >> $GITHUB_ENV + echo "hello-theme-version=${HT_VERSION}" >> $GITHUB_OUTPUT - echo "hello-theme-input=${HELLO_THEME_INPUT}" >> $GITHUB_OUTPUT - echo "hello-theme-source-type=${HELLO_THEME_SOURCE_TYPE}" >> $GITHUB_OUTPUT echo "hello-plus-version=${HELLO_PLUS_VERSION}" >> $GITHUB_OUTPUT - echo "hello-theme-source=${HELLO_THEME_SOURCE}" >> $GITHUB_OUTPUT - - # Set environment variables for later steps - echo "HELLO_THEME_VERSION=${HT_VERSION}" >> $GITHUB_ENV - echo "HELLO_THEME_INPUT=${HELLO_THEME_INPUT}" >> $GITHUB_ENV - echo "HELLO_THEME_SOURCE_TYPE=${HELLO_THEME_SOURCE_TYPE}" >> $GITHUB_ENV - - # Generate artifact name using input version for readability - ARTIFACT_NAME="plus-ht${HELLO_THEME_INPUT}-hp${HELLO_PLUS_VERSION}-${{ github.run_id }}" + + # Create artifact name + ARTIFACT_NAME="plus-ht${HELLO_THEME_SOURCE}-hp${HELLO_PLUS_VERSION}-$(date +%Y%m%d-%H%M)" echo "artifact-name=${ARTIFACT_NAME}" >> $GITHUB_OUTPUT - - echo "✅ Set versions: Hello Theme=${HT_VERSION} (${HELLO_THEME_INPUT}), Hello Plus=${HELLO_PLUS_VERSION}" + + echo "✅ Hello Theme version: ${HT_VERSION}" + echo "✅ Hello Theme source: ${HELLO_THEME_SOURCE}" + echo "✅ Hello Plus Version: ${HELLO_PLUS_VERSION}" + + - name: Validate and preserve workflow infrastructure + run: | + set -e # Exit on any error + + echo "🔍 DEBUG: Validating version $HELLO_THEME_SOURCE" + + # Validate version exists (if not main) + if [[ "$HELLO_THEME_SOURCE" != "main" ]]; then + git fetch --all --tags + if ! git rev-parse --verify "v$HELLO_THEME_SOURCE" >/dev/null 2>&1 && ! git rev-parse --verify "$HELLO_THEME_SOURCE" >/dev/null 2>&1; then + echo "❌ ERROR: Version $HELLO_THEME_SOURCE not found" + exit 1 + fi + echo "✅ Version $HELLO_THEME_SOURCE exists" + fi + + # Preserve entire .github directory + echo "📦 DEBUG: Preserving .github directory from main branch" + if ! cp -r .github .github-main-backup; then + echo "❌ ERROR: Failed to preserve .github directory" + exit 1 + fi + echo "✅ .github directory preserved" + + - name: Checkout specific Hello Theme version + run: | + set -e # Exit on any error + + if [[ "$HELLO_THEME_SOURCE" != "main" ]]; then + echo "🔄 DEBUG: Checking out Hello Theme version: $HELLO_THEME_SOURCE" + + # Attempt checkout with proper error handling + if git checkout "v$HELLO_THEME_SOURCE" 2>/dev/null || git checkout "$HELLO_THEME_SOURCE" 2>/dev/null; then + echo "✅ Successfully checked out $HELLO_THEME_SOURCE" + else + echo "❌ ERROR: Failed to checkout $HELLO_THEME_SOURCE" + exit 1 + fi + + # Validate package.json version matches + ACTUAL_VERSION=$(node -p "require('./package.json').version") + if [[ "$ACTUAL_VERSION" != "$HELLO_THEME_SOURCE" ]]; then + echo "❌ ERROR: Version mismatch - Expected: $HELLO_THEME_SOURCE, Got: $ACTUAL_VERSION" + exit 1 + fi + echo "✅ Version validated: $ACTUAL_VERSION" + + echo "HELLO_THEME_SOURCE_TYPE=git-tag" >> $GITHUB_ENV + else + echo "✅ DEBUG: Using main branch" + echo "HELLO_THEME_SOURCE_TYPE=git-branch" >> $GITHUB_ENV + fi + + - name: Restore main branch workflow infrastructure + run: | + set -e # Exit on any error + + if [[ "$HELLO_THEME_SOURCE" != "main" ]]; then + echo "🔄 DEBUG: Restoring .github directory from main branch" + + # Remove old .github and restore main version + if ! rm -rf .github; then + echo "❌ ERROR: Failed to remove old .github directory" + exit 1 + fi + + if ! mv .github-main-backup .github; then + echo "❌ ERROR: Failed to restore .github directory" + exit 1 + fi + + echo "✅ Main branch actions restored" + echo "🎯 DEBUG: Using $HELLO_THEME_SOURCE source code with main branch actions" + else + # Clean up backup if we didn't need it + rm -rf .github-main-backup 2>/dev/null || true + echo "✅ DEBUG: Using main branch (no restore needed)" + fi + + # Set final version for build + FINAL_VERSION=$(node -p "require('./package.json').version") + echo "HELLO_THEME_VERSION=$FINAL_VERSION" >> $GITHUB_ENV + echo "📋 DEBUG: Final state - Version: $FINAL_VERSION, Actions: main branch" - name: Build Hello Theme uses: ./.github/workflows/build-theme with: - PACKAGE_VERSION: ${{ steps.set-versions.outputs.hello-theme-version }} + PACKAGE_VERSION: ${{ env.HELLO_THEME_VERSION }} BUILD_SCRIPT_PATH: "npm run build:prod" - - - name: Download Hello Plus run: | HELLO_PLUS_VERSION="${{ steps.set-versions.outputs.hello-plus-version }}" echo "Downloading Hello Plus version: ${HELLO_PLUS_VERSION}" - + # Create Hello Plus build directory mkdir -p ./tmp - + if [[ "$HELLO_PLUS_VERSION" == "latest-stable" ]]; then # Download latest stable from WordPress.org curl --location -o ./hello-plus.zip https://downloads.wordpress.org/plugin/hello-plus.latest-stable.zip @@ -138,6 +208,13 @@ jobs: ./tmp/hello-plus retention-days: 3 + - name: Cleanup backup files + if: always() + run: | + echo "🧹 DEBUG: Cleaning up backup files" + rm -rf .github-main-backup 2>/dev/null || true + echo "✅ Cleanup complete" + - name: Generate build summary run: | echo "## 🔧 Build Summary" >> $GITHUB_STEP_SUMMARY @@ -170,10 +247,10 @@ jobs: echo "🎯 HYBRID APPROACH: Always latest workflows + version-specific tests" echo "📋 Workflow infrastructure: main branch (latest build-wp-env.js, scripts, etc.)" echo "🧪 Test content: ${{ inputs.hello_theme_version || 'main' }} (matches theme functionality)" - + # Determine the target version for test extraction TARGET_VERSION="${{ inputs.hello_theme_version || 'main' }}" - + if [ "$TARGET_VERSION" = "main" ]; then echo "✅ Using main branch tests (already available)" TEST_VERSION="main" @@ -229,12 +306,12 @@ jobs: TEST_SOURCE_TYPE="not-available" fi fi - + # Set outputs for workflow control echo "test-version=$TEST_VERSION" >> $GITHUB_OUTPUT echo "test-source-type=$TEST_SOURCE_TYPE" >> $GITHUB_OUTPUT echo "tests-available=$TESTS_AVAILABLE" >> $GITHUB_OUTPUT - + echo "✅ Hybrid setup complete:" echo " 🏗️ Workflow infrastructure: main branch" echo " 🧪 Test content: $TEST_VERSION ($TEST_SOURCE_TYPE)" @@ -244,12 +321,12 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.x - cache: 'npm' + cache: "npm" - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.1' + php-version: "8.1" tools: composer coverage: none @@ -270,7 +347,7 @@ jobs: run: | echo "Extracting Hello Theme build..." HT_ZIP=$(find . -name "hello-elementor-*.zip" -type f | head -1) - + if [ -n "$HT_ZIP" ]; then echo "Found Hello Theme build: $HT_ZIP" mkdir -p ./tmp @@ -296,17 +373,34 @@ jobs: - name: Update wp-env.json file env: - PHP_VERSION: '8.1' - WP_CORE_VERSION: 'latest' + PHP_VERSION: "8.1" + WP_CORE_VERSION: "latest" HELLO_THEME_VERSION: ${{ env.HELLO_THEME_VERSION }} HELLO_PLUS_VERSION: ${{ env.HELLO_PLUS_VERSION }} - ELEMENTOR_VERSION: 'latest-stable' + ELEMENTOR_VERSION: "latest-stable" run: node ./.github/scripts/build-wp-env.js - name: Install WordPress environment run: | - npx wp-env start - + echo "Starting WordPress environment with retry logic..." + for i in {1..5}; do + echo "Attempt $i/5: Starting wp-env..." + if npx wp-env start; then + echo "✅ WordPress environment started successfully" + break + else + echo "❌ Attempt $i failed" + if [ $i -eq 5 ]; then + echo "🚨 All attempts failed, exiting..." + exit 1 + else + echo "⏳ Waiting 30 seconds before retry..." + npx wp-env stop || true + sleep 30 + fi + fi + done + - name: Setup WordPress environment (activate plugins and themes) run: | npx wp-env run cli bash hello-elementor-config/setup.sh @@ -327,7 +421,7 @@ jobs: echo "🧪 Running tests from: ${{ steps.extract-version-tests.outputs.test-source-type }}" # Only run Hello Theme tests, not Hello Plus or other plugin tests npm run test:playwright -- tests/playwright/tests/ - + - name: Skip tests - version incompatible if: steps.extract-version-tests.outputs.tests-available != 'true' run: | @@ -377,10 +471,10 @@ jobs: echo "🎯 HYBRID APPROACH: Always latest workflows + version-specific tests" echo "📋 Workflow infrastructure: main branch (latest build-wp-env.js, scripts, etc.)" echo "🧪 Test content: ${{ inputs.hello_theme_version || 'main' }} (matches theme functionality)" - + # Determine the target version for test extraction TARGET_VERSION="${{ inputs.hello_theme_version || 'main' }}" - + if [ "$TARGET_VERSION" = "main" ]; then echo "✅ Using main branch tests (already available)" TEST_VERSION="main" @@ -436,12 +530,12 @@ jobs: TEST_SOURCE_TYPE="not-available" fi fi - + # Set outputs for workflow control echo "test-version=$TEST_VERSION" >> $GITHUB_OUTPUT echo "test-source-type=$TEST_SOURCE_TYPE" >> $GITHUB_OUTPUT echo "tests-available=$TESTS_AVAILABLE" >> $GITHUB_OUTPUT - + echo "✅ Hybrid setup complete:" echo " 🏗️ Workflow infrastructure: main branch" echo " 🧪 Test content: $TEST_VERSION ($TEST_SOURCE_TYPE)" @@ -451,12 +545,12 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.x - cache: 'npm' + cache: "npm" - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.1' + php-version: "8.1" tools: composer coverage: none @@ -477,7 +571,7 @@ jobs: run: | echo "Extracting Hello Theme build..." HT_ZIP=$(find . -name "hello-elementor-*.zip" -type f | head -1) - + if [ -n "$HT_ZIP" ]; then echo "Found Hello Theme build: $HT_ZIP" mkdir -p ./tmp @@ -503,17 +597,34 @@ jobs: - name: Update wp-env.json file env: - PHP_VERSION: '8.1' - WP_CORE_VERSION: 'latest' + PHP_VERSION: "8.1" + WP_CORE_VERSION: "latest" HELLO_THEME_VERSION: ${{ env.HELLO_THEME_VERSION }} HELLO_PLUS_VERSION: ${{ env.HELLO_PLUS_VERSION }} - ELEMENTOR_VERSION: 'latest-stable' + ELEMENTOR_VERSION: "latest-stable" run: node ./.github/scripts/build-wp-env.js - name: Install WordPress environment run: | - npx wp-env start - + echo "Starting WordPress environment with retry logic..." + for i in {1..5}; do + echo "Attempt $i/5: Starting wp-env..." + if npx wp-env start; then + echo "✅ WordPress environment started successfully" + break + else + echo "❌ Attempt $i failed" + if [ $i -eq 5 ]; then + echo "🚨 All attempts failed, exiting..." + exit 1 + else + echo "⏳ Waiting 30 seconds before retry..." + npx wp-env stop || true + sleep 30 + fi + fi + done + - name: Setup WordPress environment (activate plugins and themes) run: | npx wp-env run cli bash hello-elementor-config/setup.sh @@ -528,7 +639,7 @@ jobs: echo "🧪 Running tagged tests from: ${{ steps.extract-version-tests.outputs.test-source-type }}" # Only run Hello Theme tests with the specified tag npm run test:playwright -- tests/playwright/tests/ --grep="${{ github.event.inputs.tag }}" - + - name: Skip tagged tests - version incompatible if: steps.extract-version-tests.outputs.tests-available != 'true' run: | @@ -570,3 +681,10 @@ jobs: - name: Check Plus Matrix status if: ${{ needs.plus-playwright-tests.result != 'success' && needs.plus-playwright-tests.result != 'skipped' }} run: exit 1 + + - name: Cleanup backup files (final) + if: always() + run: | + echo "🧹 DEBUG: Final cleanup of any remaining backup files" + rm -rf .github-main-backup 2>/dev/null || true + echo "✅ Final cleanup complete" From 029c9196db1afc51bcc5838d61da894b9a4e5015 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:59:44 +0200 Subject: [PATCH 15/43] Create automated workflow (#564) (#566) --- .github/config/release.json | 7 +- .../{release-preparation.yml => release.yml} | 220 +++++++++++++----- 2 files changed, 161 insertions(+), 66 deletions(-) rename .github/workflows/{release-preparation.yml => release.yml} (57%) diff --git a/.github/config/release.json b/.github/config/release.json index 798d0721..573ae792 100644 --- a/.github/config/release.json +++ b/.github/config/release.json @@ -14,8 +14,11 @@ "changelog_section": "## Changelog", "build_artifacts": ["hello-theme.zip"], "wordpress_org": { - "manual_upload": true, - "theme_slug": "hello-elementor" + "auto_deploy": true, + "theme_slug": "hello-elementor", + "svn_url": "https://themes.svn.wordpress.org/hello-elementor/", + "skip_pre_releases": true, + "validation_required": true } }, "notifications": { diff --git a/.github/workflows/release-preparation.yml b/.github/workflows/release.yml similarity index 57% rename from .github/workflows/release-preparation.yml rename to .github/workflows/release.yml index 31373fb4..f77fabb0 100644 --- a/.github/workflows/release-preparation.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: 'Release Preparation (Hello Elementor)' +name: 'Automated Release' on: workflow_dispatch: @@ -20,6 +20,11 @@ on: type: boolean description: 'Dry run (test without creating actual release)?' required: false + default: true + deploy_to_wporg: + type: boolean + description: 'Deploy to WordPress.org theme repository?' + required: false default: false slack_channel: type: string @@ -40,8 +45,6 @@ env: jobs: release: runs-on: ubuntu-22.04 - # Workflow design: version files are bumped early, used for build/release, then automatically restored - # by peter-evans/create-pull-request action. Error cleanup ensures consistent state on any failure. steps: - name: Checkout uses: actions/checkout@v4 @@ -52,7 +55,7 @@ jobs: - name: Load Release Configuration id: config run: | - echo "📋 Loading Hello Elementor release configuration..." + echo "📋 Loading release configuration..." CONFIG_FILE=".github/config/release.json" if [ ! -f "$CONFIG_FILE" ]; then @@ -71,13 +74,17 @@ jobs: BLOCKED_ACTORS=$(jq -r '.security.blocked_actors[]' "$CONFIG_FILE" | tr '\n' ' ') RELEASE_BRANCHES=$(jq -r '.repository.release_branches[]' "$CONFIG_FILE" | tr '\n' ' ') CONFIG_THEME_SLUG=$(jq -r '.release.wordpress_org.theme_slug' "$CONFIG_FILE") + AUTO_DEPLOY_ENABLED=$(jq -r '.release.wordpress_org.auto_deploy' "$CONFIG_FILE") echo "ALLOWED_REPOS=$ALLOWED_REPOS" >> $GITHUB_ENV echo "BLOCKED_ACTORS=$BLOCKED_ACTORS" >> $GITHUB_ENV echo "RELEASE_BRANCHES=$RELEASE_BRANCHES" >> $GITHUB_ENV echo "CONFIG_THEME_SLUG=$CONFIG_THEME_SLUG" >> $GITHUB_ENV + echo "AUTO_DEPLOY_ENABLED=$AUTO_DEPLOY_ENABLED" >> $GITHUB_ENV - echo "✅ Hello Elementor release configuration loaded successfully" + echo "✅ Release configuration loaded successfully" + echo " - Theme slug: $CONFIG_THEME_SLUG" + echo " - Auto-deploy enabled: $AUTO_DEPLOY_ENABLED" - name: Pre-flight checks run: | @@ -86,6 +93,7 @@ jobs: echo "Current Branch: ${{ github.ref_name }}" echo "Version Type: ${{ inputs.version_type }}" echo "Dry Run: ${{ inputs.dry_run }}" + echo "Deploy to WordPress.org: ${{ inputs.deploy_to_wporg }}" echo "Repository: ${{ github.repository }}" echo "Actor: ${{ github.actor }}" @@ -106,7 +114,7 @@ jobs: echo "⚠️ Warning: Running on unauthorized repository: ${{ github.repository }}" fi - # Check actor permissions (basic validation) + # Check actor permissions for blocked_actor in ${{ env.BLOCKED_ACTORS }}; do if [ "${{ github.actor }}" == "$blocked_actor" ]; then echo "❌ Error: Blocked actor cannot create releases: ${{ github.actor }}" @@ -158,12 +166,12 @@ jobs: run: | PACKAGE_VERSION=$(node -p "require('./package.json').version") echo "CLEAN_PACKAGE_VERSION=$PACKAGE_VERSION" >> $GITHUB_ENV - echo "Current Hello Elementor version: $PACKAGE_VERSION" + echo "Current version: $PACKAGE_VERSION" - name: Bump Theme Version (Dry Run) if: ${{ inputs.dry_run == true }} run: | - echo "🧪 DRY RUN: Would bump Hello Elementor version from ${{ env.CLEAN_PACKAGE_VERSION }}" + echo "🧪 DRY RUN: Would bump version from ${{ env.CLEAN_PACKAGE_VERSION }}" CURRENT_VERSION="${{ env.CLEAN_PACKAGE_VERSION }}" IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" @@ -189,7 +197,6 @@ jobs: echo "DRY_RUN_VERSION=$NEW_VERSION" >> $GITHUB_ENV echo "PACKAGE_VERSION=$NEW_VERSION" >> $GITHUB_ENV echo "🧪 DRY RUN: Version would be: $CURRENT_VERSION → $NEW_VERSION" - echo "🧪 DRY RUN: Changelog validation will use current version: $CURRENT_VERSION" - name: Bump Theme Version (Actual) if: ${{ inputs.dry_run == false }} @@ -198,27 +205,12 @@ jobs: CLEAN_PACKAGE_VERSION: ${{ env.CLEAN_PACKAGE_VERSION }} VERSION_TYPE: ${{ inputs.version_type }} - - name: Validate current versions (Dry Run) - if: ${{ inputs.dry_run == true }} - run: | - CURRENT_VERSION=$(node -p "require('./package.json').version") - echo "🔍 Validating CURRENT versions ($CURRENT_VERSION)..." - bash .github/scripts/validate-versions-release.sh - - - name: Validate changelog for updated version (Dry Run) - if: ${{ inputs.dry_run == true }} - uses: ./.github/actions/get-changelog-from-readme-release - with: - VERSION: ${{ env.DRY_RUN_VERSION }} - - - name: Validate changelog for new version (Actual) - if: ${{ inputs.dry_run == false }} + - name: Validate changelog for new version uses: ./.github/actions/get-changelog-from-readme-release with: VERSION: ${{ env.PACKAGE_VERSION }} - # Build with version-bumped files to ensure release assets contain correct versions - - name: Build Hello Elementor Theme + - name: Build Theme id: build uses: ./.github/actions/build-theme-release with: @@ -232,10 +224,8 @@ jobs: echo " - Tag: v${{ env.PACKAGE_VERSION }}" echo " - Build file: ${{ env.BUILD_ZIP_PATH }}" echo " - Changelog: ${{ env.CHANGELOG_FILE }}" - echo "RELEASE_URL=https://github.com/elementor/hello-theme/releases/tag/v${{ env.PACKAGE_VERSION }}" >> $GITHUB_ENV + echo "RELEASE_URL=https://github.com/${{ github.repository }}/releases/tag/v${{ env.PACKAGE_VERSION }}" >> $GITHUB_ENV - # Create GitHub release with version-bumped assets before repository cleanup - # This ensures the published release contains the correct version numbers - name: Create GitHub Release (Actual) if: ${{ inputs.dry_run == false }} id: create-release @@ -248,23 +238,105 @@ jobs: prerelease: false token: ${{ secrets.GITHUB_TOKEN }} - # Repository maintenance steps happen after release creation - # Note: peter-evans/create-pull-request automatically restores working directory - # This design ensures release assets are created before any git cleanup occurs + - name: Set Release URL + if: ${{ inputs.dry_run == false }} + run: | + echo "RELEASE_URL=${{ steps.create-release.outputs.html_url }}" >> $GITHUB_ENV + + # WordPress.org Deployment Section + - name: WordPress.org Deployment Validation + if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + run: | + echo "🔍 **WordPress.org Deployment Pre-flight**" + echo " - Theme: Hello Elementor" + echo " - Version: ${{ env.PACKAGE_VERSION }}" + echo " - SVN URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" + echo " - Build directory: ./${{ env.CONFIG_THEME_SLUG }}" + echo " - Dry run: ${{ inputs.dry_run }}" + + # Validate build directory exists + if [ ! -d "./${{ env.CONFIG_THEME_SLUG }}" ]; then + echo "❌ Build directory not found: ./${{ env.CONFIG_THEME_SLUG }}" + exit 1 + fi + + # Validate required theme files + for file in style.css index.php functions.php readme.txt; do + if [ ! -f "./${{ env.CONFIG_THEME_SLUG }}/$file" ]; then + echo "❌ Required file missing: $file" + exit 1 + fi + done + + echo "✅ Pre-flight validation passed" + + - name: Deploy to WordPress.org (Dry Run) + if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + uses: 10up/action-wordpress-plugin-deploy@stable + with: + dry-run: true + env: + SVN_URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }} + SLUG: ${{ env.CONFIG_THEME_SLUG }} + VERSION: ${{ env.PACKAGE_VERSION }} + BUILD_DIR: ./${{ env.CONFIG_THEME_SLUG }} - # Skip PR creation for 'current' version type since no version bump occurs + - name: Deploy to WordPress.org Theme Repository + if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + uses: 10up/action-wordpress-plugin-deploy@stable + env: + SVN_URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }} + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + SLUG: ${{ env.CONFIG_THEME_SLUG }} + VERSION: ${{ env.PACKAGE_VERSION }} + BUILD_DIR: ./${{ env.CONFIG_THEME_SLUG }} + + - name: WordPress.org Deployment Status + if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + run: | + if [ "${{ inputs.dry_run }}" == "true" ]; then + echo "🧪 **WordPress.org SVN Dry Run Complete!**" + echo "" + echo "📋 **Validation Results:**" + echo " - SVN repository structure: ✅ Validated" + echo " - Theme files preparation: ✅ Validated" + echo " - File exclusions (build process): ✅ Applied correctly" + echo " - Version consistency: ✅ Verified" + echo " - WordPress.org compatibility: ✅ Confirmed" + echo "" + echo "🚀 **Ready for Production Deployment!**" + echo " - Re-run workflow with dry_run: false to deploy" + echo " - All validations passed successfully" + else + echo "🚀 **WordPress.org Theme Deployment Complete!**" + echo "" + echo "📦 **Deployment Details:**" + echo " - Theme: Hello Elementor" + echo " - Version: v${{ env.PACKAGE_VERSION }}" + echo " - SVN Repository: Updated" + echo " - Theme Directory: https://wordpress.org/themes/${{ env.CONFIG_THEME_SLUG }}/" + echo "" + echo "⏰ **Timeline:**" + echo " - SVN commit: Immediate ✅" + echo " - Theme directory update: 15-60 minutes ⏰" + echo " - WordPress admin visibility: 15-60 minutes ⏰" + echo "" + echo "✅ **Next Steps:**" + echo " - Monitor WordPress.org for theme availability" + echo " - Test installation from WordPress admin" + echo " - Update support documentation if needed" + fi + + # Repository maintenance - only for actual releases - name: Create PR With Bumped Version if: ${{ inputs.dry_run == false && inputs.version_type != 'current' }} uses: ./.github/actions/create-pr-with-bumped-theme-version-release with: base_branch: ${{ inputs.release_branch }} - # Use NEW_VERSION (bumped version) instead of CLEAN_PACKAGE_VERSION (old version) - # This ensures PR title/branch reflects the actual new version (e.g., "Release v3.4.5") - # Fallback to CLEAN_PACKAGE_VERSION for safety if NEW_VERSION is not set package_version: ${{ env.NEW_VERSION || env.CLEAN_PACKAGE_VERSION }} token: ${{ secrets.GITHUB_TOKEN }} - # Update main branch version if new version > main version - name: Update Main Branch Version if: ${{ inputs.dry_run == false && inputs.version_type != 'current' }} uses: ./.github/actions/update-main-branch-version-release @@ -272,27 +344,22 @@ jobs: new_version: ${{ env.NEW_VERSION }} token: ${{ secrets.GITHUB_TOKEN }} - - name: Set Release URL - if: ${{ inputs.dry_run == false }} - run: | - echo "RELEASE_URL=${{ steps.create-release.outputs.html_url }}" >> $GITHUB_ENV - - name: Send Slack Notification (Dry Run) - if: false + if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true }} run: | echo "🧪 DRY RUN: Would send Slack notification" echo " - Channel: ${{ inputs.slack_channel }}" echo " - Version: v${{ env.PACKAGE_VERSION }}" - echo " - Message: Hello Elementor release preparation complete (DRY RUN)" + echo " - Message: Release preparation complete (DRY RUN)" - name: Slack Notification Skipped - if: ${{ inputs.dry_run == true }} + if: ${{ inputs.deploy_to_wporg == false }} run: | - echo "📢 Slack notification skipped (release-preparation workflow)" - echo " - Only full releases with WordPress.org deployment trigger Slack notifications" + echo "📢 Slack notification skipped (deploy_to_wporg: false)" + echo " - Only WordPress.org deployments trigger Slack notifications" - name: Send Slack Notification (Actual) - if: false + if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true }} uses: ./.github/actions/theme-slack-notification-release with: SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} @@ -300,51 +367,76 @@ jobs: BUILD_ZIP_PATH: ${{ env.BUILD_ZIP_PATH }} GITHUB_RELEASE_URL: ${{ env.RELEASE_URL }} SLACK_CHANNEL: ${{ inputs.slack_channel }} - WPORG_DEPLOYMENT_STATUS: 'skipped' + WPORG_DEPLOYMENT_STATUS: ${{ (inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true') && 'deployed' || 'skipped' }} - - name: Manual Upload Instructions + - name: Deployment Summary run: | if [ "${{ inputs.dry_run }}" == "true" ]; then - echo "🧪 **DRY RUN COMPLETE!**" + echo "🧪 **AUTOMATED RELEASE DRY RUN COMPLETE!**" echo "" echo "📋 **This was a test run - no actual release was created**" echo "" echo "🔍 **What would have happened:**" echo "1. Version would be bumped to: v${{ env.PACKAGE_VERSION }}" - echo "2. Hello Elementor theme would be built: ${{ env.BUILD_ZIP_PATH }}" + echo "2. Theme would be built: ${{ env.BUILD_ZIP_PATH }}" echo "3. GitHub release would be created: ${{ env.RELEASE_URL }}" - echo "4. Slack notification would be sent to #release" + echo "4. Slack notification would be sent to ${{ inputs.slack_channel }}" + if [ "${{ inputs.deploy_to_wporg }}" == "true" ] && [ "${{ env.AUTO_DEPLOY_ENABLED }}" == "true" ]; then + echo "5. WordPress.org SVN deployment would be executed" + echo " - Theme deployed to WordPress.org theme repository" + echo " - SVN trunk and tags updated automatically" + echo " - Manual upload process eliminated! 🎉" + elif [ "${{ inputs.deploy_to_wporg }}" == "false" ]; then + echo "5. WordPress.org deployment: ⚠️ Skipped (deploy_to_wporg: false)" + else + echo "5. WordPress.org deployment: ⚠️ Disabled in config (auto_deploy: false)" + fi echo "" echo "✅ **Dry run validation passed - ready for actual release!**" + echo " - Re-run this workflow with dry_run: false" else - bash .github/scripts/generate-upload-instructions-release.sh + echo "🚀 **AUTOMATED RELEASE DEPLOYMENT COMPLETE!**" + echo "" + echo "📦 **Release Details:**" + echo " - Theme: Hello Elementor v${{ env.PACKAGE_VERSION }}" + echo " - GitHub Release: ${{ env.RELEASE_URL }}" + echo " - Build Package: ${{ env.BUILD_ZIP_PATH }}" + if [ "${{ inputs.deploy_to_wporg }}" == "true" ] && [ "${{ env.AUTO_DEPLOY_ENABLED }}" == "true" ]; then + echo " - WordPress.org: ✅ Automatically deployed" + echo " - Theme Directory: https://wordpress.org/themes/${{ env.CONFIG_THEME_SLUG }}/" + echo " - Manual upload: ❌ No longer required!" + elif [ "${{ inputs.deploy_to_wporg }}" == "false" ]; then + echo " - WordPress.org: ⚠️ Skipped (deploy_to_wporg: false)" + else + echo " - WordPress.org: ⚠️ Disabled in config" + fi + echo "" + echo "✅ **Next Steps:**" + if [ "${{ inputs.deploy_to_wporg }}" == "true" ] && [ "${{ env.AUTO_DEPLOY_ENABLED }}" == "true" ]; then + echo " - Monitor WordPress.org theme directory (15-60 minutes)" + echo " - Test theme installation from WordPress admin" + fi + echo " - Update documentation and announce release" + echo " - Celebrate the automated deployment! 🎊" fi - # Error recovery: restore repository to clean state on any workflow failure - # Design principle: always return to original branch state for consistency - # This prevents partial updates and ensures repository remains in sync with branch + # Error recovery - name: Cleanup on Error if: ${{ always() && !inputs.dry_run && failure() }} run: | echo "🧹 Workflow failed - restoring to original state..." - # Restore all version-bumped files to their original branch state - # This maintains consistency between working directory and remote branch if ! git diff --quiet; then echo "⚠️ Found modified files, restoring original versions..." - - # Restore specific files that were version-bumped earlier in workflow git checkout -- package.json functions.php style.css readme.txt 2>/dev/null || true - git checkout -- assets/scss/style.scss 2>/dev/null || true - echo "✅ Files restored to original state" else echo "ℹ️ Working directory already clean" fi - # Remove temporary files generated during workflow execution rm -f temp-changelog-from-readme.txt 2>/dev/null || true rm -f *.bak 2>/dev/null || true echo "🔍 Final state check:" git status --porcelain || true + From fc61ffc13a30b58608b827a51607442eb6b21474 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 12:01:24 +0200 Subject: [PATCH 16/43] Dry run svn credentials (#567) (#569) --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f77fabb0..5bd2f004 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -277,6 +277,8 @@ jobs: dry-run: true env: SVN_URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }} + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} SLUG: ${{ env.CONFIG_THEME_SLUG }} VERSION: ${{ env.PACKAGE_VERSION }} BUILD_DIR: ./${{ env.CONFIG_THEME_SLUG }} From e6f7b69dcd335773a98be843e6e08000880ef601 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 09:31:00 +0200 Subject: [PATCH 17/43] Print svn status (#568) (#570) --- .github/workflows/release.yml | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5bd2f004..dba6a164 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -283,6 +283,110 @@ jobs: VERSION: ${{ env.PACKAGE_VERSION }} BUILD_DIR: ./${{ env.CONFIG_THEME_SLUG }} + - name: Show SVN Status (Dry Run) + if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + run: | + echo "📊 **SVN Status Check - Dry Run**" + echo "" + + SVN_TEMP_DIR="./svn-checkout-temp" + SVN_URL="https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" + BUILD_DIR="./${{ env.CONFIG_THEME_SLUG }}" + VERSION="${{ env.PACKAGE_VERSION }}" + + echo "🔍 Checking out SVN repository (read-only)..." + echo " - SVN URL: $SVN_URL" + echo " - Version: $VERSION" + echo "" + + if ! command -v svn &> /dev/null; then + echo "⚠️ SVN not installed - installing..." + sudo apt-get update && sudo apt-get install -y subversion + fi + + rm -rf "$SVN_TEMP_DIR" + svn checkout --depth immediates "$SVN_URL" "$SVN_TEMP_DIR" > /dev/null 2>&1 || { + echo "⚠️ Could not checkout full repository (may require auth for some operations)" + echo " Attempting trunk-only checkout..." + svn checkout --depth infinity "$SVN_URL/trunk" "$SVN_TEMP_DIR/trunk" > /dev/null 2>&1 || { + echo "❌ Could not checkout SVN repository" + echo " This is normal for private repositories - skipping SVN status check" + exit 0 + } + } + + echo "✅ SVN repository checked out" + echo "" + + if [ -d "$SVN_TEMP_DIR/trunk" ]; then + echo "📂 **Simulating deployment to SVN trunk...**" + echo "" + + cd "$SVN_TEMP_DIR/trunk" + echo " Current trunk status:" + svn status || echo " (Clean working copy)" + echo "" + + if [ -d "$BUILD_DIR" ]; then + echo " Copying build files to trunk (simulation)..." + cp -r "$BUILD_DIR"/* . 2>/dev/null || cp -r "$BUILD_DIR"/. . 2>/dev/null || true + + echo "" + echo "📊 **SVN Status After File Copy (what would be committed):**" + SVN_STATUS=$(svn status 2>/dev/null || echo "") + if [ -n "$SVN_STATUS" ]; then + echo "$SVN_STATUS" | head -50 + TOTAL_CHANGES=$(echo "$SVN_STATUS" | wc -l) + if [ "$TOTAL_CHANGES" -gt 50 ]; then + echo "" + echo " ... and $((TOTAL_CHANGES - 50)) more changes" + fi + echo "" + echo " Summary:" + echo "$SVN_STATUS" | grep "^A" | wc -l | xargs -I {} echo " Added (A): {} files" + echo "$SVN_STATUS" | grep "^M" | wc -l | xargs -I {} echo " Modified (M): {} files" + echo "$SVN_STATUS" | grep "^D" | wc -l | xargs -I {} echo " Deleted (D): {} files" + echo "$SVN_STATUS" | grep "^?" | wc -l | xargs -I {} echo " Untracked (?): {} files" + else + echo " (No changes detected)" + fi + fi + cd - > /dev/null + echo "" + fi + + if [ -d "$SVN_TEMP_DIR/tags/$VERSION" ]; then + echo "🏷️ **Tag $VERSION already exists in SVN:**" + ls -la "$SVN_TEMP_DIR/tags/$VERSION" | head -20 + echo "" + echo "⚠️ Warning: Tag v$VERSION already exists in SVN!" + else + echo "🏷️ **Tag $VERSION would be created**" + echo "" + fi + + echo "📋 **Build Files Summary:**" + echo " Build directory: $BUILD_DIR" + if [ -d "$BUILD_DIR" ]; then + FILE_COUNT=$(find "$BUILD_DIR" -type f | wc -l) + DIR_COUNT=$(find "$BUILD_DIR" -type d | wc -l) + echo " Total files: $FILE_COUNT" + echo " Total directories: $DIR_COUNT" + echo "" + echo " File structure (first 30 files):" + find "$BUILD_DIR" -type f | head -30 | sed 's|^| |' + if [ "$FILE_COUNT" -gt 30 ]; then + echo " ... and $((FILE_COUNT - 30)) more files" + fi + else + echo " ❌ Build directory not found!" + fi + + echo "" + echo "🧹 Cleaning up temporary SVN checkout..." + rm -rf "$SVN_TEMP_DIR" + echo "✅ SVN status check complete" + - name: Deploy to WordPress.org Theme Repository if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} uses: 10up/action-wordpress-plugin-deploy@stable From 19805749c3c3e348c161f0a1cdbfd7ddb2ae12f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:16:22 +0200 Subject: [PATCH 18/43] Internal: Create WordPress deploy action [TMZ-803] (#571) (#572) --- .github/USE-MAIN-WORKFLOW.md | 342 ------------------ .../actions/build-theme-release/action.yml | 44 +-- .../scripts/publish-theme-to-wordpress-org.sh | 178 +++++++++ .github/workflows/release.yml | 146 +++++--- 4 files changed, 305 insertions(+), 405 deletions(-) delete mode 100644 .github/USE-MAIN-WORKFLOW.md create mode 100755 .github/scripts/publish-theme-to-wordpress-org.sh diff --git a/.github/USE-MAIN-WORKFLOW.md b/.github/USE-MAIN-WORKFLOW.md deleted file mode 100644 index c9ef3ad8..00000000 --- a/.github/USE-MAIN-WORKFLOW.md +++ /dev/null @@ -1,342 +0,0 @@ -# USE MAIN WORKFLOW - HELLO THEME ANALYSIS - -## 🎯 OBJECTIVE -Analyze Hello Theme's workflow setup and trace what happens when version 3.4.4 is passed as input, examining how build files, workflow/action files, and test files are handled. - -## 📋 SCENARIO ANALYSIS: HELLO THEME VERSION 3.4.4 - -### 🔄 **FLOW OVERVIEW** -When version `hello_theme_version: "3.4.4"` is passed to the workflow, here's what happens: - -``` -Daily Matrix → Playwright Workflow → NO CHECKOUT → Build Process → Test Extraction - ↓ ↓ ↓ ↓ ↓ - 3.4.4 3.4.4 input main branch main source 3.4.4 tests -``` - ---- - -## 🚨 **CRITICAL DISCOVERY: HELLO THEME HAS NO PRESERVE/RESTORE PATTERN** - -### **Hello Theme's Unique Approach:** -Unlike Hello Biz, Hello Commerce, and Hello Plus, **Hello Theme does NOT implement any version checkout logic**. It uses a completely different strategy: - -1. **Always builds from main branch** (current source code) -2. **Only extracts tests** from the target version -3. **No preserve/restore pattern** needed - ---- - -## 🏗️ **PART 1: BUILD FILES (What gets built)** - -### **Build Process Flow:** -```yaml -# Lines 59-108: playwright-with-specific-elementor-version.yml -- name: Set version outputs - run: | - # Hello Theme version from current repo (like Hello Commerce pattern) - HT_VERSION=$(node -p "require('./package.json').version") # Gets 3.4.4 - - # Input version for reference (main, etc.) - HELLO_THEME_INPUT="${{ inputs.hello_theme_version || 'main' }}" # Gets "3.4.4" - -- name: Build Hello Theme - uses: ./.github/workflows/build-theme - with: - PACKAGE_VERSION: ${{ steps.set-versions.outputs.hello-theme-version }} # Uses 3.4.4 - BUILD_SCRIPT_PATH: "npm run build:prod" -``` - -### **Key Insight: Version Coincidence** -```yaml -# Lines 65-66: Version detection logic -HT_VERSION=$(node -p "require('./package.json').version") # Current: 3.4.4 -HELLO_THEME_INPUT="${{ inputs.hello_theme_version || 'main' }}" # Input: 3.4.4 -``` - -**Hello Theme works by coincidence**: The current main branch version (3.4.4) matches the requested test version (3.4.4). - -### **Result: Build Zip Contains:** -- ✅ **Source Code**: From Hello Theme main branch (current 3.4.4) - - `style.css` with version 3.4.4 header - - `package.json` with `"version": "3.4.4"` - - All PHP files, modules, assets from main branch - - Current dependencies from main branch `composer.json` -- ✅ **Build Assets**: Compiled from main branch source - - `assets/js/` compiled from main branch TypeScript/JavaScript - - `assets/css/` compiled from main branch SCSS - - Webpack output from main branch configuration - -**Key Point**: The build uses **main branch source code** (which happens to be version 3.4.4) with **main branch build tooling**. - ---- - -## ⚙️ **PART 2: WORKFLOW AND ACTION FILES (What executes the build)** - -### **Workflow Files Used:** -- ✅ **Source**: Always from `main` branch (current checkout) -- ✅ **Location**: `.github/workflows/` directory -- ✅ **Files**: All workflow YAML files from main branch -- ✅ **No Checkout**: No version-specific checkout happens - -### **Action Files Used:** -- ✅ **Source**: Always from `main` branch (current checkout) -- ✅ **Location**: `.github/workflows/*/action.yml` -- ✅ **Examples**: - - `.github/workflows/build-theme/action.yml` (main branch) - - All other actions from main branch - -### **Script Files Used:** -- ✅ **Source**: Always from `main` branch (current checkout) -- ✅ **Location**: `.github/scripts/` directory -- ✅ **Files**: - - `build-wp-env.js` (main branch - configures WordPress environment) - - All other scripts from main branch - -### **Critical Difference from Other Themes:** -```yaml -# Hello Theme: NO checkout step exists -# Lines 54-57: Only standard checkout -- name: Checkout Hello Theme - uses: actions/checkout@v4 - with: - fetch-depth: 0 -# No version-specific checkout follows -``` - -**Key Point**: Hello Theme **never checks out a different version**, so it always uses main branch for everything except tests. - ---- - -## 🧪 **PART 3: TEST FILES (What gets tested)** - -### **Test Extraction Process:** -```yaml -# Lines 450-524: Hybrid Test Setup - Extract tests from target version -TARGET_VERSION="${{ inputs.hello_theme_version || 'main' }}" # "3.4.4" - -# Extract tests from 3.4.4 tag -git archive "v3.4.4" tests/playwright/ | tar -x -``` - -### **Test Files Used:** -- ✅ **Source**: From Hello Theme v3.4.4 tag (version-specific) -- ✅ **Location**: `tests/playwright/` directory -- ✅ **Content**: Test files that match 3.4.4 functionality - - Test specs from 3.4.4 (`tests/playwright/tests/`) - - Page objects from 3.4.4 (`tests/playwright/pages/`) - - Test configuration from 3.4.4 (`tests/playwright/playwright.config.ts`) - -### **Hybrid Approach Logic:** -```bash -# Lines 453-455: Hybrid approach explanation -echo "🎯 HYBRID APPROACH: Always latest workflows + version-specific tests" -echo "📋 Workflow infrastructure: main branch (latest build-wp-env.js, scripts, etc.)" -echo "🧪 Test content: ${{ inputs.hello_theme_version || 'main' }} (matches theme functionality)" -``` - -### **Test Execution:** -- ✅ **Test Runner**: Uses main branch Playwright configuration and scripts -- ✅ **Test Content**: Uses 3.4.4-specific test files -- ✅ **WordPress Environment**: Built with main branch `build-wp-env.js` -- ✅ **Theme Under Test**: Hello Theme 3.4.4 build (from main branch) - -**Key Point**: Tests from 3.4.4 run against Hello Theme 3.4.4 functionality, but use main branch test infrastructure. - ---- - -## 📊 **COMPLETE VERSION MATRIX** - -| Component | Version Source | Actual Version | Purpose | -|-----------|----------------|----------------|---------| -| **Build Zip File** | main branch | 3.4.4 | Theme functionality to test | -| **Workflow Files** | main branch | Latest | Latest workflow definitions | -| **Action Files** | main branch | Latest | Latest build/deploy logic | -| **Script Files** | main branch | Latest | Latest automation scripts | -| **Test Files** | v3.4.4 tag | 3.4.4 | Tests matching theme functionality | -| **Test Infrastructure** | main branch | Latest | Latest test runner and environment | - ---- - -## 🔍 **DETAILED FLOW ANALYSIS** - -### **Step 1: Daily Matrix Triggers Workflow** -```bash -# Daily matrix generates combinations like: -{"combination":"ht-ga-el-main","name":"Hello Theme 3.4.4 (GA) + Elementor main","hello_theme_version":"3.4.4","elementor_version":"main"} -``` - -### **Step 2: Workflow Receives Input** -```yaml -# Lines 9-12: playwright-with-specific-elementor-version.yml -inputs: - hello_theme_version: - description: 'Hello Theme version to test (e.g., 3.4.4 or main)' - default: 'main' - # Receives: "3.4.4" -``` - -### **Step 3: Version Detection (No Checkout)** -```bash -# Lines 65-69: Set version variables -HT_VERSION=$(node -p "require('./package.json').version") # Gets 3.4.4 from main -HELLO_THEME_INPUT="3.4.4" # Input version - -# No checkout happens - stays on main branch -``` - -### **Step 4: Build Process** -```bash -# Lines 104-108: Build step -- name: Build Hello Theme - uses: ./.github/workflows/build-theme - with: - PACKAGE_VERSION: 3.4.4 # Uses current main branch version - BUILD_SCRIPT_PATH: "npm run build:prod" -``` - -### **Step 5: Test Extraction** -```bash -# Lines 487-489: Test extraction -echo "📥 Extracting tests directory from v3.4.4..." -rm -rf ./tests/playwright/ -git archive "v3.4.4" tests/playwright/ | tar -x -``` - -### **Step 6: Test Execution** -```bash -# Test runner uses: -# - Hello Theme 3.4.4 theme (built from main) -# - Tests from 3.4.4 (extracted) -# - Test infrastructure from main (latest) -``` - ---- - -## 🚨 **CRITICAL OBSERVATIONS** - -### **✅ What Works (By Coincidence):** -1. **Current Version Match**: Main branch is currently at 3.4.4 -2. **No Checkout Needed**: Since main = requested version -3. **Hybrid Test Approach**: Uses latest infrastructure with version-specific tests -4. **Simplified Logic**: No complex preserve/restore pattern needed - -### **⚠️ Critical Vulnerabilities:** -1. **Version Dependency**: Only works when main branch version = requested version -2. **Future Versions**: Will break when main branch advances to 3.4.5+ -3. **Past Versions**: Cannot test versions older than current main -4. **No Preserve/Restore**: Missing the pattern other themes have - -### **🔧 Comparison with Other Themes:** - -| Theme | Approach | Version Handling | Risk Level | -|-------|----------|------------------|------------| -| **Hello Biz** | Preserve/Restore | ✅ Any version | ✅ Low | -| **Hello Commerce** | Preserve/Restore | ✅ Any version | ✅ Low | -| **Hello Plus** | JavaScript Script | ✅ Any version | ✅ Low | -| **Hello Theme** | No Checkout | ❌ Current version only | 🚨 High | - ---- - -## 🎯 **HELLO THEME'S FUNDAMENTAL PROBLEM** - -### **The Issue:** -Hello Theme's approach **only works by coincidence** because: -- Main branch version: 3.4.4 -- Requested test version: 3.4.4 -- **They happen to match** - -### **What Happens When They Don't Match:** - -#### **Scenario A: Testing Hello Theme 3.4.3** -```bash -# Input: hello_theme_version: "3.4.3" -# Main branch: 3.4.4 -# Result: Builds 3.4.4 source, tests with 3.4.3 tests → Version mismatch! -``` - -#### **Scenario B: Main Branch Advances to 3.4.5** -```bash -# Input: hello_theme_version: "3.4.4" -# Main branch: 3.4.5 -# Result: Builds 3.4.5 source, tests with 3.4.4 tests → Version mismatch! -``` - -### **The Root Cause:** -Hello Theme **lacks the preserve/restore pattern** that other themes have implemented. - ---- - -## 🔧 **RECOMMENDED SOLUTION** - -### **Hello Theme Needs Preserve/Restore Pattern:** - -Hello Theme should implement the same preserve/restore pattern as Hello Biz and Hello Commerce: - -1. **Add version validation and preserve step** -2. **Add checkout specific version step** -3. **Add restore main branch actions step** -4. **Add cleanup steps** - -This would ensure: -- ✅ **Build**: Uses requested version source code (3.4.4) -- ✅ **Workflows/Actions**: Always uses main branch (latest) -- ✅ **Tests**: Uses version-specific tests (3.4.4) - ---- - -## 🤔 **CRITICAL QUESTIONS** - -### **1. Why Does Hello Theme Work Currently?** -**Answer**: Pure coincidence - main branch version matches requested version. - -### **2. What Happens When Versions Don't Match?** -**Answer**: Version mismatch - builds wrong version, tests with different version. - -### **3. Should Hello Theme Implement Preserve/Restore?** -**Answer**: Yes, to ensure consistent behavior across all themes. - -### **4. Is Hello Theme's Approach Intentional?** -**Answer**: Likely not - it appears to be missing the pattern other themes have. - ---- - -## 📋 **IMPLEMENTATION RECOMMENDATION** - -### **Hello Theme Should:** -1. **Implement preserve/restore pattern** like Hello Biz/Commerce -2. **Add version checkout logic** to handle any requested version -3. **Maintain hybrid test approach** (works well) -4. **Add proper error handling** for missing versions - -### **Benefits:** -- ✅ **Consistency**: Same pattern across all themes -- ✅ **Reliability**: Works for any version combination -- ✅ **Future-proof**: Won't break when main branch advances -- ✅ **Maintainability**: Predictable behavior - ---- - -## 🎯 **CONCLUSION** - -### **Hello Theme Version 3.4.4 Flow Summary:** - -1. **Build Zip**: Contains main branch source (happens to be 3.4.4) -2. **Workflow/Actions**: Always use main branch (current checkout) -3. **Tests**: Extract 3.4.4-specific tests but run with main branch infrastructure - -### **Key Insight:** -Hello Theme **works by pure coincidence** because the main branch version (3.4.4) matches the requested test version (3.4.4). This approach is **fundamentally fragile** and will break when versions don't align. - -### **The Pattern Works Currently Because:** -- ✅ **Source Code**: Happens to match the version being tested (3.4.4) -- ✅ **Build Tools**: Always latest (main branch) -- ✅ **Test Content**: Matches theme functionality (3.4.4) -- ✅ **Test Infrastructure**: Always latest (main branch) - -### **But It Will Break When:** -- ❌ **Main branch advances** to 3.4.5+ -- ❌ **Testing older versions** like 3.4.3 -- ❌ **Any version mismatch** occurs - -**Hello Theme needs the preserve/restore pattern to ensure reliable version testing like the other themes.** diff --git a/.github/actions/build-theme-release/action.yml b/.github/actions/build-theme-release/action.yml index 756e28ec..46e2553a 100644 --- a/.github/actions/build-theme-release/action.yml +++ b/.github/actions/build-theme-release/action.yml @@ -42,31 +42,31 @@ runs: bash "${{ inputs.BUILD_SCRIPT_PATH }}" fi - - name: Create theme build directory - shell: bash - run: | - mkdir -p /tmp/hello-theme-builds - - - name: Package theme - shell: bash - env: - PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} - run: | - # Create zip file with hello-theme naming (hardcoded, not from package.json) - zip -r "/tmp/hello-theme-builds/hello-theme-${PACKAGE_VERSION}.zip" . \ - -x "node_modules/*" "test-results/*" "tests/*" ".git/*" "*.zip" \ - "playwright-report/*" ".wp-env.json.*" ".wp-env" - - - name: Move build to workspace + - name: Set build directory and zip paths shell: bash env: PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} run: | - mv "/tmp/hello-theme-builds/hello-theme-${PACKAGE_VERSION}.zip" \ - "./hello-theme-${PACKAGE_VERSION}.zip" + set -e + BUILD_DIR="hello-elementor" + BUILD_ZIP_PATH="hello-elementor.${PACKAGE_VERSION}.zip" + + echo "Setting build paths:" + echo " BUILD_DIR: ${BUILD_DIR}" + echo " BUILD_ZIP_PATH: ${BUILD_ZIP_PATH}" + echo " PACKAGE_VERSION: ${PACKAGE_VERSION}" + + if [ ! -d "$BUILD_DIR" ]; then + echo "❌ Build directory not found: $BUILD_DIR" + echo "Available directories:" + ls -la | head -20 + exit 1 + fi + + echo "✅ Build directory found: $BUILD_DIR" + echo "✅ Zip file: $BUILD_ZIP_PATH" - echo "✅ Hello Elementor theme build complete: hello-theme-${PACKAGE_VERSION}.zip" - ls -la hello-theme-*.zip + echo "BUILD_DIR=${BUILD_DIR}" >> $GITHUB_ENV + echo "BUILD_ZIP_PATH=${BUILD_ZIP_PATH}" >> $GITHUB_ENV - # Set build path for downstream actions - echo "BUILD_ZIP_PATH=hello-theme-${PACKAGE_VERSION}.zip" >> $GITHUB_ENV + echo "✅ Environment variables set in GITHUB_ENV" diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh new file mode 100755 index 00000000..b13fc118 --- /dev/null +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -0,0 +1,178 @@ +#!/bin/bash +set -eo pipefail + +DRY_RUN=false +if [[ "$1" == "--dry-run" ]]; then + DRY_RUN=true + echo "🧪 DRY RUN MODE: Will simulate SVN operations without committing" +fi + +if [[ "$DRY_RUN" == "false" ]]; then + if [[ -z "$SVN_USERNAME" ]]; then + echo "Set the SVN_USERNAME secret" + exit 1 + fi + + if [[ -z "$SVN_PASSWORD" ]]; then + echo "Set the SVN_PASSWORD secret" + exit 1 + fi +fi + +if [[ -z "$THEME_VERSION" ]]; then + echo "Set the THEME_VERSION env var" + exit 1 +fi + +if [[ -z "$THEME_SLUG" ]]; then + echo "Set the THEME_SLUG env var" + exit 1 +fi + +if [[ -z "$BUILD_DIR" ]]; then + echo "Set the BUILD_DIR env var" + exit 1 +fi + +svn --version + +echo "SVN installed" + +echo "Publish theme version: ${THEME_VERSION}" +echo "Theme slug: ${THEME_SLUG}" +echo "Build directory: ${BUILD_DIR}" + +THEME_PATH="$GITHUB_WORKSPACE" +SVN_PATH="$GITHUB_WORKSPACE/svn" +SVN_URL="https://themes.svn.wordpress.org/${THEME_SLUG}" +VERSION_DIR="${THEME_VERSION}" + +cd $THEME_PATH +pwd +mkdir -p $SVN_PATH +cd $SVN_PATH + +echo "Checkout SVN repository root" +if [[ "$DRY_RUN" == "true" ]]; then + echo "🧪 DRY RUN: Checking out SVN repository (read-only)" + svn co --depth immediates "$SVN_URL" . 2>&1 | head -20 || { + echo "⚠️ Could not checkout repository (may require auth for some operations)" + echo " This is normal - simulating checkout for dry-run" + mkdir -p "$VERSION_DIR" + cd "$VERSION_DIR" + } +else + svn co --depth immediates "$SVN_URL" . +fi + +echo "Check if version folder already exists" +VERSION_EXISTS=false +if svn list "$SVN_URL/$VERSION_DIR" > /dev/null 2>&1; then + VERSION_EXISTS=true +fi + +if [[ "$VERSION_EXISTS" == "true" ]]; then + echo "❌ ERROR: Version folder $VERSION_DIR already exists in SVN!" + echo " SVN URL: $SVN_URL/$VERSION_DIR" + echo "" + echo " WordPress.org theme versions are immutable - you cannot update an existing version." + echo " If you need to make changes, create a new version (e.g., increment patch/minor/major)." + echo "" + if [[ "$DRY_RUN" == "true" ]]; then + echo "🧪 DRY RUN: Would fail here (version already exists)" + else + exit 1 + fi +fi + +echo "Version folder $VERSION_DIR does not exist - will create it" +mkdir -p "$VERSION_DIR" +cd "$VERSION_DIR" +if [[ "$DRY_RUN" == "false" ]]; then + cd .. + svn add "$VERSION_DIR" + cd "$VERSION_DIR" +fi + +echo "Copy files from build directory" +if [[ "$BUILD_DIR" == /* ]]; then + BUILD_SOURCE="$BUILD_DIR" +else + BUILD_SOURCE="$THEME_PATH/$BUILD_DIR" +fi + +if [ ! -d "$BUILD_SOURCE" ]; then + echo "❌ Build directory not found: $BUILD_SOURCE" + exit 1 +fi + +rsync -ah --progress "$BUILD_SOURCE/"* . || rsync -ah --progress "$BUILD_SOURCE/." . || true + +echo "Preparing files for SVN" +svn status + +echo "svn add new files" +if [[ "$DRY_RUN" == "false" ]]; then + svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | xargs -r svn add || true +else + echo "🧪 DRY RUN: Would add new files" + svn status 2>/dev/null | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | sed 's|^| Would add: |' || true +fi + +echo "" +echo "📊 **SVN Status Summary (what will be committed):**" +echo "==========================================" +SVN_STATUS=$(svn status 2>/dev/null || echo "") +TOTAL_CHANGES=0 +if [ -n "$SVN_STATUS" ]; then + echo "$SVN_STATUS" + echo "" + echo "Summary:" + ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" || echo "0") + MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" || echo "0") + UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" || echo "0") + + echo " Added (A): $ADDED_COUNT files" + if [ "$MODIFIED_COUNT" -gt 0 ]; then + echo " Modified (M): $MODIFIED_COUNT files" + fi + if [ "$UNTRACKED_COUNT" -gt 0 ]; then + echo " ⚠️ Untracked (?): $UNTRACKED_COUNT files (will be ignored)" + fi + echo "" + TOTAL_CHANGES=$((ADDED_COUNT + MODIFIED_COUNT)) + echo " Total files to commit: $TOTAL_CHANGES files" +else + echo " (No changes detected - files are up to date)" +fi +echo "==========================================" +echo "" + +if [[ "$DRY_RUN" == "true" ]]; then + if [ "$TOTAL_CHANGES" -gt 0 ]; then + echo "🧪 DRY RUN: Would commit $TOTAL_CHANGES files to version folder $VERSION_DIR" + echo " Commit message: Upload v${THEME_VERSION}" + else + echo "🧪 DRY RUN: No changes to commit (files are up to date)" + fi + echo " 🚫 No actual commit performed (dry-run mode)" +else + if [ "$TOTAL_CHANGES" -gt 0 ]; then + echo "Commit files to version folder $VERSION_DIR" + svn ci -m "Upload v${THEME_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD" + + cd $SVN_PATH + svn update + else + echo "⚠️ No changes to commit - files are already up to date" + fi +fi + +echo "Remove the SVN folder from the workspace" +rm -rf $SVN_PATH + +echo "Back to the workspace root" +cd $GITHUB_WORKSPACE + +echo "Theme deployment complete: v${THEME_VERSION}" + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dba6a164..6f250c6b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -216,6 +216,21 @@ jobs: with: PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }} BUILD_SCRIPT_PATH: "npm run package:zip" + + - name: Set Build Directory + if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + run: | + BUILD_DIR="hello-elementor" + + if [ ! -d "$BUILD_DIR" ]; then + echo "❌ Build directory not found: $BUILD_DIR" + echo "Available directories:" + ls -la + exit 1 + fi + + echo "BUILD_DIR=${BUILD_DIR}" >> $GITHUB_ENV + echo "✅ Build directory set: ${BUILD_DIR}" - name: Create GitHub Release (Dry Run) if: ${{ inputs.dry_run == true }} @@ -251,18 +266,32 @@ jobs: echo " - Theme: Hello Elementor" echo " - Version: ${{ env.PACKAGE_VERSION }}" echo " - SVN URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" - echo " - Build directory: ./${{ env.CONFIG_THEME_SLUG }}" echo " - Dry run: ${{ inputs.dry_run }}" + # Check if BUILD_DIR is set + if [ -z "${{ env.BUILD_DIR }}" ]; then + echo "❌ BUILD_DIR environment variable is not set" + echo " This means the build step may have failed or BUILD_DIR was not set correctly" + echo " Checking available directories:" + ls -la + echo "" + echo " Expected build directory name: hello-elementor (from package.json name)" + exit 1 + fi + + echo " - Build directory: ${{ env.BUILD_DIR }}" + # Validate build directory exists - if [ ! -d "./${{ env.CONFIG_THEME_SLUG }}" ]; then - echo "❌ Build directory not found: ./${{ env.CONFIG_THEME_SLUG }}" + if [ ! -d "${{ env.BUILD_DIR }}" ]; then + echo "❌ Build directory not found: ${{ env.BUILD_DIR }}" + echo " Available directories:" + ls -la exit 1 fi # Validate required theme files for file in style.css index.php functions.php readme.txt; do - if [ ! -f "./${{ env.CONFIG_THEME_SLUG }}/$file" ]; then + if [ ! -f "${{ env.BUILD_DIR }}/$file" ]; then echo "❌ Required file missing: $file" exit 1 fi @@ -270,18 +299,27 @@ jobs: echo "✅ Pre-flight validation passed" + - name: Install SVN (Dry Run) + if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + run: | + sudo apt-get update -y + sudo apt-get install -y subversion + svn --version + - name: Deploy to WordPress.org (Dry Run) if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - uses: 10up/action-wordpress-plugin-deploy@stable - with: - dry-run: true env: - SVN_URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }} - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - SLUG: ${{ env.CONFIG_THEME_SLUG }} - VERSION: ${{ env.PACKAGE_VERSION }} - BUILD_DIR: ./${{ env.CONFIG_THEME_SLUG }} + THEME_VERSION: ${{ env.PACKAGE_VERSION }} + THEME_SLUG: ${{ env.CONFIG_THEME_SLUG }} + BUILD_DIR: ${{ env.BUILD_DIR }} + run: | + echo "🧪 DRY RUN: Executing deployment script in dry-run mode" + echo " - Theme slug: ${{ env.CONFIG_THEME_SLUG }}" + echo " - Version: ${{ env.PACKAGE_VERSION }}" + echo " - Build directory: ${{ env.BUILD_DIR }}" + echo " - SVN URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" + echo "" + bash .github/scripts/publish-theme-to-wordpress-org.sh --dry-run - name: Show SVN Status (Dry Run) if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} @@ -291,12 +329,13 @@ jobs: SVN_TEMP_DIR="./svn-checkout-temp" SVN_URL="https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" - BUILD_DIR="./${{ env.CONFIG_THEME_SLUG }}" + BUILD_DIR="${{ env.BUILD_DIR }}" VERSION="${{ env.PACKAGE_VERSION }}" echo "🔍 Checking out SVN repository (read-only)..." echo " - SVN URL: $SVN_URL" echo " - Version: $VERSION" + echo " - Note: Themes use flat structure with version folders (no trunk/tags)" echo "" if ! command -v svn &> /dev/null; then @@ -306,29 +345,45 @@ jobs: rm -rf "$SVN_TEMP_DIR" svn checkout --depth immediates "$SVN_URL" "$SVN_TEMP_DIR" > /dev/null 2>&1 || { - echo "⚠️ Could not checkout full repository (may require auth for some operations)" - echo " Attempting trunk-only checkout..." - svn checkout --depth infinity "$SVN_URL/trunk" "$SVN_TEMP_DIR/trunk" > /dev/null 2>&1 || { - echo "❌ Could not checkout SVN repository" - echo " This is normal for private repositories - skipping SVN status check" - exit 0 - } + echo "⚠️ Could not checkout repository (may require auth for some operations)" + echo " This is normal for private repositories - skipping SVN status check" + exit 0 } echo "✅ SVN repository checked out" echo "" - if [ -d "$SVN_TEMP_DIR/trunk" ]; then - echo "📂 **Simulating deployment to SVN trunk...**" + echo "📂 **Existing version folders in SVN:**" + if [ -d "$SVN_TEMP_DIR" ]; then + EXISTING_VERSIONS=$(ls -1 "$SVN_TEMP_DIR" 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+' | sort -V || echo "") + if [ -n "$EXISTING_VERSIONS" ]; then + echo "$EXISTING_VERSIONS" | head -10 | sed 's|^| |' + VERSION_COUNT=$(echo "$EXISTING_VERSIONS" | wc -l) + if [ "$VERSION_COUNT" -gt 10 ]; then + echo " ... and $((VERSION_COUNT - 10)) more versions" + fi + else + echo " (No version folders found - new theme repository)" + fi + fi + echo "" + + if [ -d "$SVN_TEMP_DIR/$VERSION" ]; then + echo "⚠️ **Version $VERSION already exists in SVN:**" + ls -la "$SVN_TEMP_DIR/$VERSION" | head -20 + echo "" + echo "⚠️ Warning: Version $VERSION already exists in SVN!" + echo " This would update the existing version folder" echo "" - cd "$SVN_TEMP_DIR/trunk" - echo " Current trunk status:" - svn status || echo " (Clean working copy)" + echo "📊 **Simulating update to version folder $VERSION...**" + cd "$SVN_TEMP_DIR/$VERSION" + echo " Current version folder status:" + svn status 2>/dev/null || echo " (Clean working copy)" echo "" if [ -d "$BUILD_DIR" ]; then - echo " Copying build files to trunk (simulation)..." + echo " Copying build files to version folder (simulation)..." cp -r "$BUILD_DIR"/* . 2>/dev/null || cp -r "$BUILD_DIR"/. . 2>/dev/null || true echo "" @@ -352,18 +407,20 @@ jobs: fi fi cd - > /dev/null - echo "" - fi - - if [ -d "$SVN_TEMP_DIR/tags/$VERSION" ]; then - echo "🏷️ **Tag $VERSION already exists in SVN:**" - ls -la "$SVN_TEMP_DIR/tags/$VERSION" | head -20 - echo "" - echo "⚠️ Warning: Tag v$VERSION already exists in SVN!" else - echo "🏷️ **Tag $VERSION would be created**" + echo "📂 **Version $VERSION would be created**" + echo " New version folder: $SVN_URL/$VERSION" echo "" + + if [ -d "$BUILD_DIR" ]; then + echo "📊 **Files that would be uploaded:**" + FILE_COUNT=$(find "$BUILD_DIR" -type f | wc -l) + DIR_COUNT=$(find "$BUILD_DIR" -type d | wc -l) + echo " Total files: $FILE_COUNT" + echo " Total directories: $DIR_COUNT" + fi fi + echo "" echo "📋 **Build Files Summary:**" echo " Build directory: $BUILD_DIR" @@ -387,16 +444,23 @@ jobs: rm -rf "$SVN_TEMP_DIR" echo "✅ SVN status check complete" + - name: Install SVN + if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} + run: | + sudo apt-get update -y + sudo apt-get install -y subversion + svn --version + - name: Deploy to WordPress.org Theme Repository if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - uses: 10up/action-wordpress-plugin-deploy@stable env: - SVN_URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }} SVN_USERNAME: ${{ secrets.SVN_USERNAME }} SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - SLUG: ${{ env.CONFIG_THEME_SLUG }} - VERSION: ${{ env.PACKAGE_VERSION }} - BUILD_DIR: ./${{ env.CONFIG_THEME_SLUG }} + THEME_VERSION: ${{ env.PACKAGE_VERSION }} + THEME_SLUG: ${{ env.CONFIG_THEME_SLUG }} + BUILD_DIR: ${{ env.BUILD_DIR }} + run: | + bash .github/scripts/publish-theme-to-wordpress-org.sh - name: WordPress.org Deployment Status if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} From a78586255d30b1d4292bb4fdafc9a3fb1555102a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:39:52 +0200 Subject: [PATCH 19/43] Internal: Update wordpress deployment scripts [TMZ-803] (#573) (#574) --- .../publish-theme-to-wordpress-org-dry-run.sh | 122 +++++++++++++++ .../scripts/publish-theme-to-wordpress-org.sh | 147 ++++-------------- .github/workflows/release.yml | 8 +- 3 files changed, 151 insertions(+), 126 deletions(-) create mode 100755 .github/scripts/publish-theme-to-wordpress-org-dry-run.sh diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh new file mode 100755 index 00000000..772755eb --- /dev/null +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -0,0 +1,122 @@ +#!/bin/bash +set -eo pipefail + +echo "🧪 DRY RUN MODE: Will simulate SVN operations without committing" + +if [[ -z "$THEME_VERSION" ]]; then + echo "Set the THEME_VERSION env var" + exit 1 +fi + +if [[ -z "$THEME_SLUG" ]]; then + echo "Set the THEME_SLUG env var" + exit 1 +fi + +if [[ -z "$BUILD_DIR" ]]; then + echo "Set the BUILD_DIR env var" + exit 1 +fi + +# Ensure SVN is installed +svn --version + +echo "SVN installed" + +echo "Publish theme version: ${THEME_VERSION}" +echo "Theme slug: ${THEME_SLUG}" +echo "Build directory: ${BUILD_DIR}" + +THEME_PATH="$GITHUB_WORKSPACE" +SVN_PATH="$GITHUB_WORKSPACE/svn" +VERSION_DIR="${THEME_VERSION}" + +cd $THEME_PATH +pwd +mkdir -p $SVN_PATH +cd $SVN_PATH + +echo "🧪 DRY RUN: Checking out SVN repository (read-only)" +svn co --depth immediates "https://themes.svn.wordpress.org/${THEME_SLUG}" . 2>&1 | head -20 || { + echo "⚠️ Could not checkout repository (may require auth for some operations)" + echo " This is normal - simulating checkout for dry-run" + mkdir -p "$VERSION_DIR" + cd "$VERSION_DIR" +} + +echo "Check if version folder already exists" +VERSION_EXISTS=false +if svn list "https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR}" > /dev/null 2>&1; then + VERSION_EXISTS=true +fi + +if [[ "$VERSION_EXISTS" == "true" ]]; then + echo "❌ ERROR: Version folder $VERSION_DIR already exists in SVN! + SVN URL: https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR} + + WordPress.org theme versions are immutable - you cannot update an existing version. + If you need to make changes, create a new version (e.g., increment patch/minor/major). + +🧪 DRY RUN: Would fail here (version already exists)" + exit 0 +fi + +mkdir -p "$VERSION_DIR" +cd "$VERSION_DIR" + +echo "Copy files from build directory" +rsync -ah --progress "$THEME_PATH/$BUILD_DIR/"* . || rsync -ah --progress "$THEME_PATH/$BUILD_DIR/." . || true + +echo "Preparing files for SVN" +svn status 2>/dev/null || echo "" + +echo "svn add new files" +echo "🧪 DRY RUN: Would add new files" +svn status 2>/dev/null | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | sed 's|^| Would add: |' || true + +echo "" +echo "📊 **SVN Status Summary (what would be committed):**" +echo "==========================================" +SVN_STATUS=$(svn status 2>/dev/null || echo "") +TOTAL_CHANGES=0 +if [ -n "$SVN_STATUS" ]; then + echo "$SVN_STATUS" + echo "" + echo "Summary:" + ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" || echo "0") + MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" || echo "0") + UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" || echo "0") + + echo " Added (A): $ADDED_COUNT files" + if [ "$MODIFIED_COUNT" -gt 0 ]; then + echo " Modified (M): $MODIFIED_COUNT files" + fi + if [ "$UNTRACKED_COUNT" -gt 0 ]; then + echo " ⚠️ Untracked (?): $UNTRACKED_COUNT files (would be added)" + fi + echo "" + TOTAL_CHANGES=$((ADDED_COUNT + MODIFIED_COUNT)) + echo " Total files that would be committed: $TOTAL_CHANGES files" +else + echo " (No changes detected - files are up to date)" +fi +echo "==========================================" +echo "" + +if [ "$TOTAL_CHANGES" -gt 0 ]; then + echo "🧪 DRY RUN: Would commit $TOTAL_CHANGES files to version folder $VERSION_DIR" + echo " Commit message: Upload v${THEME_VERSION}" +else + echo "🧪 DRY RUN: No changes to commit (files are up to date)" +fi +echo " 🚫 No actual commit performed (dry-run mode)" + +echo "Remove the SVN folder from the workspace" +rm -rf $SVN_PATH + +echo "Back to the workspace root" +cd $GITHUB_WORKSPACE + +echo "✅ Dry-run complete: v${THEME_VERSION}" +echo " All checks passed - ready for actual deployment" + diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index b13fc118..d5311d6e 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -1,22 +1,14 @@ #!/bin/bash set -eo pipefail -DRY_RUN=false -if [[ "$1" == "--dry-run" ]]; then - DRY_RUN=true - echo "🧪 DRY RUN MODE: Will simulate SVN operations without committing" +if [[ -z "$SVN_USERNAME" ]]; then + echo "Set the SVN_USERNAME secret" + exit 1 fi -if [[ "$DRY_RUN" == "false" ]]; then - if [[ -z "$SVN_USERNAME" ]]; then - echo "Set the SVN_USERNAME secret" - exit 1 - fi - - if [[ -z "$SVN_PASSWORD" ]]; then - echo "Set the SVN_PASSWORD secret" - exit 1 - fi +if [[ -z "$SVN_PASSWORD" ]]; then + echo "Set the SVN_PASSWORD secret" + exit 1 fi if [[ -z "$THEME_VERSION" ]]; then @@ -34,17 +26,15 @@ if [[ -z "$BUILD_DIR" ]]; then exit 1 fi +# Ensure SVN is installed svn --version echo "SVN installed" echo "Publish theme version: ${THEME_VERSION}" -echo "Theme slug: ${THEME_SLUG}" -echo "Build directory: ${BUILD_DIR}" THEME_PATH="$GITHUB_WORKSPACE" SVN_PATH="$GITHUB_WORKSPACE/svn" -SVN_URL="https://themes.svn.wordpress.org/${THEME_SLUG}" VERSION_DIR="${THEME_VERSION}" cd $THEME_PATH @@ -52,121 +42,41 @@ pwd mkdir -p $SVN_PATH cd $SVN_PATH -echo "Checkout SVN repository root" -if [[ "$DRY_RUN" == "true" ]]; then - echo "🧪 DRY RUN: Checking out SVN repository (read-only)" - svn co --depth immediates "$SVN_URL" . 2>&1 | head -20 || { - echo "⚠️ Could not checkout repository (may require auth for some operations)" - echo " This is normal - simulating checkout for dry-run" - mkdir -p "$VERSION_DIR" - cd "$VERSION_DIR" - } -else - svn co --depth immediates "$SVN_URL" . -fi +echo "Checkout from SVN" +svn co --depth immediates "https://themes.svn.wordpress.org/${THEME_SLUG}" . echo "Check if version folder already exists" -VERSION_EXISTS=false -if svn list "$SVN_URL/$VERSION_DIR" > /dev/null 2>&1; then - VERSION_EXISTS=true -fi +if svn list "https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR}" > /dev/null 2>&1; then + echo "❌ ERROR: Version folder $VERSION_DIR already exists in SVN! + SVN URL: https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR} -if [[ "$VERSION_EXISTS" == "true" ]]; then - echo "❌ ERROR: Version folder $VERSION_DIR already exists in SVN!" - echo " SVN URL: $SVN_URL/$VERSION_DIR" - echo "" - echo " WordPress.org theme versions are immutable - you cannot update an existing version." - echo " If you need to make changes, create a new version (e.g., increment patch/minor/major)." - echo "" - if [[ "$DRY_RUN" == "true" ]]; then - echo "🧪 DRY RUN: Would fail here (version already exists)" - else - exit 1 - fi + WordPress.org theme versions are immutable - you cannot update an existing version. + If you need to make changes, create a new version (e.g., increment patch/minor/major)." + exit 1 fi -echo "Version folder $VERSION_DIR does not exist - will create it" mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" -if [[ "$DRY_RUN" == "false" ]]; then - cd .. - svn add "$VERSION_DIR" - cd "$VERSION_DIR" -fi +cd .. +svn add "$VERSION_DIR" +cd "$VERSION_DIR" -echo "Copy files from build directory" -if [[ "$BUILD_DIR" == /* ]]; then - BUILD_SOURCE="$BUILD_DIR" -else - BUILD_SOURCE="$THEME_PATH/$BUILD_DIR" -fi +echo "Copy files" +rsync -ah --progress "$THEME_PATH/$BUILD_DIR/"* . || rsync -ah --progress "$THEME_PATH/$BUILD_DIR/." . || true -if [ ! -d "$BUILD_SOURCE" ]; then - echo "❌ Build directory not found: $BUILD_SOURCE" - exit 1 -fi +echo "Preparing files" +cd "$VERSION_DIR" -rsync -ah --progress "$BUILD_SOURCE/"* . || rsync -ah --progress "$BUILD_SOURCE/." . || true +echo "svn add" +svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | xargs -r svn add || true -echo "Preparing files for SVN" svn status -echo "svn add new files" -if [[ "$DRY_RUN" == "false" ]]; then - svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | xargs -r svn add || true -else - echo "🧪 DRY RUN: Would add new files" - svn status 2>/dev/null | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | sed 's|^| Would add: |' || true -fi +echo "Commit files to version folder $VERSION_DIR" +svn ci -m "Upload v${THEME_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD" -echo "" -echo "📊 **SVN Status Summary (what will be committed):**" -echo "==========================================" -SVN_STATUS=$(svn status 2>/dev/null || echo "") -TOTAL_CHANGES=0 -if [ -n "$SVN_STATUS" ]; then - echo "$SVN_STATUS" - echo "" - echo "Summary:" - ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" || echo "0") - MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" || echo "0") - UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" || echo "0") - - echo " Added (A): $ADDED_COUNT files" - if [ "$MODIFIED_COUNT" -gt 0 ]; then - echo " Modified (M): $MODIFIED_COUNT files" - fi - if [ "$UNTRACKED_COUNT" -gt 0 ]; then - echo " ⚠️ Untracked (?): $UNTRACKED_COUNT files (will be ignored)" - fi - echo "" - TOTAL_CHANGES=$((ADDED_COUNT + MODIFIED_COUNT)) - echo " Total files to commit: $TOTAL_CHANGES files" -else - echo " (No changes detected - files are up to date)" -fi -echo "==========================================" -echo "" - -if [[ "$DRY_RUN" == "true" ]]; then - if [ "$TOTAL_CHANGES" -gt 0 ]; then - echo "🧪 DRY RUN: Would commit $TOTAL_CHANGES files to version folder $VERSION_DIR" - echo " Commit message: Upload v${THEME_VERSION}" - else - echo "🧪 DRY RUN: No changes to commit (files are up to date)" - fi - echo " 🚫 No actual commit performed (dry-run mode)" -else - if [ "$TOTAL_CHANGES" -gt 0 ]; then - echo "Commit files to version folder $VERSION_DIR" - svn ci -m "Upload v${THEME_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD" - - cd $SVN_PATH - svn update - else - echo "⚠️ No changes to commit - files are already up to date" - fi -fi +cd $SVN_PATH +svn update echo "Remove the SVN folder from the workspace" rm -rf $SVN_PATH @@ -175,4 +85,3 @@ echo "Back to the workspace root" cd $GITHUB_WORKSPACE echo "Theme deployment complete: v${THEME_VERSION}" - diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6f250c6b..70ca0a55 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -313,13 +313,7 @@ jobs: THEME_SLUG: ${{ env.CONFIG_THEME_SLUG }} BUILD_DIR: ${{ env.BUILD_DIR }} run: | - echo "🧪 DRY RUN: Executing deployment script in dry-run mode" - echo " - Theme slug: ${{ env.CONFIG_THEME_SLUG }}" - echo " - Version: ${{ env.PACKAGE_VERSION }}" - echo " - Build directory: ${{ env.BUILD_DIR }}" - echo " - SVN URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" - echo "" - bash .github/scripts/publish-theme-to-wordpress-org.sh --dry-run + bash .github/scripts/publish-theme-to-wordpress-org-dry-run.sh - name: Show SVN Status (Dry Run) if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} From 2a43d8c7927186c586ae560db0c4d074066d8adf Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin <94352322+hein-obox@users.noreply.github.com> Date: Wed, 26 Nov 2025 13:54:54 +0200 Subject: [PATCH 20/43] Add Slack Notifications - GA (#577) --- .../action.yml | 56 +++++++ .../action.yml | 153 ++++++++++-------- .github/scripts/send-slack-message.js | 55 +++++++ .github/workflows/daily-test-matrix.yml | 9 ++ .github/workflows/release.yml | 2 +- 5 files changed, 208 insertions(+), 67 deletions(-) create mode 100644 .github/actions/theme-slack-notification-daily-tests/action.yml create mode 100644 .github/scripts/send-slack-message.js diff --git a/.github/actions/theme-slack-notification-daily-tests/action.yml b/.github/actions/theme-slack-notification-daily-tests/action.yml new file mode 100644 index 00000000..cec85b0a --- /dev/null +++ b/.github/actions/theme-slack-notification-daily-tests/action.yml @@ -0,0 +1,56 @@ +name: 'Theme Slack Notification (Daily Tests)' +description: 'Send Slack notification for Hello Elementor daily test failures' +inputs: + CLOUD_SLACK_BOT_TOKEN: + required: true + description: 'Slack bot token' + WORKFLOW_URL: + required: true + description: 'GitHub workflow run URL' + SLACK_CHANNEL: + required: false + default: '#tmz-alerts' + description: 'Slack channel to send notification to' + +runs: + using: 'composite' + steps: + - name: Post to Slack + shell: bash + env: + CLOUD_SLACK_BOT_TOKEN: ${{ inputs.CLOUD_SLACK_BOT_TOKEN }} + WORKFLOW_URL: ${{ inputs.WORKFLOW_URL }} + SLACK_CHANNEL: ${{ inputs.SLACK_CHANNEL }} + run: | + node << 'NODE_SCRIPT' + const workflowUrl = process.env.WORKFLOW_URL || ''; + const slackChannel = process.env.SLACK_CHANNEL || '#tmz-alerts'; + + const payload = { + text: 'Failing test alert', + blocks: [ + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Failing test alert*\n\n*Theme:* Hello Elementor\n*Test report:* <' + workflowUrl + '|View Workflow Run>' + } + } + ] + }; + + process.env.SLACK_PAYLOAD = JSON.stringify(payload); + + const { execSync } = require('child_process'); + const path = require('path'); + const scriptPath = path.join(process.env.GITHUB_WORKSPACE, '.github/scripts/send-slack-message.js'); + execSync(`node "${scriptPath}"`, { stdio: 'inherit', env: process.env }); + NODE_SCRIPT + + - name: Notification summary + shell: bash + run: | + echo "📢 Slack notification sent!" + echo " - Channel: ${{ inputs.SLACK_CHANNEL }}" + echo " - Workflow: ${{ inputs.WORKFLOW_URL }}" + diff --git a/.github/actions/theme-slack-notification-release/action.yml b/.github/actions/theme-slack-notification-release/action.yml index a599ccbf..03c1a60f 100644 --- a/.github/actions/theme-slack-notification-release/action.yml +++ b/.github/actions/theme-slack-notification-release/action.yml @@ -1,7 +1,7 @@ name: 'Theme Slack Notification (Release)' description: 'Send Slack notification for Hello Elementor release' inputs: - SLACK_BOT_TOKEN: + CLOUD_SLACK_BOT_TOKEN: required: true description: 'Slack bot token' PACKAGE_VERSION: @@ -15,7 +15,7 @@ inputs: description: 'GitHub release URL' SLACK_CHANNEL: required: false - default: '#general' + default: '#tmz-hello-delivery' description: 'Slack channel to send notification to' WPORG_DEPLOYMENT_STATUS: required: false @@ -56,73 +56,94 @@ runs: fi - name: Post to Slack - uses: slackapi/slack-github-action@v1.23.0 - with: - channel-id: ${{ inputs.SLACK_CHANNEL }} - payload: | - { - "blocks": [ - { - "type": "header", - "text": { - "type": "plain_text", - "text": "🚀 Hello Elementor v${{ inputs.PACKAGE_VERSION }} Released!" - } - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "*Hello Elementor theme* has been successfully released and is ready for distribution." + shell: bash + env: + CLOUD_SLACK_BOT_TOKEN: ${{ inputs.CLOUD_SLACK_BOT_TOKEN }} + SLACK_CHANNEL: ${{ inputs.SLACK_CHANNEL }} + PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} + FILE_SIZE_MB: ${{ env.FILE_SIZE_MB }} + DEPLOYMENT_MESSAGE: ${{ env.DEPLOYMENT_MESSAGE }} + GITHUB_RELEASE_URL: ${{ inputs.GITHUB_RELEASE_URL }} + BUILD_ZIP_PATH: ${{ inputs.BUILD_ZIP_PATH }} + run: | + node << 'NODE_SCRIPT' + const slackChannel = process.env.SLACK_CHANNEL || '#tmz-hello-delivery'; + const packageVersion = process.env.PACKAGE_VERSION || ''; + const fileSizeMb = process.env.FILE_SIZE_MB || 'Unknown'; + const deploymentMessage = (process.env.DEPLOYMENT_MESSAGE || '').replace(/\\n/g, '\n'); + const githubReleaseUrl = process.env.GITHUB_RELEASE_URL || ''; + const buildZipPath = process.env.BUILD_ZIP_PATH || ''; + + const payload = { + text: `Hello Elementor v${packageVersion} Released!`, + blocks: [ + { + type: 'header', + text: { + type: 'plain_text', + text: `🚀 Hello Elementor v${packageVersion} Released!` + } + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: '*Hello Elementor theme* has been successfully released and is ready for distribution.' + } + }, + { + type: 'section', + fields: [ + { + type: 'mrkdwn', + text: `*Version:*\nv${packageVersion}` + }, + { + type: 'mrkdwn', + text: `*Package Size:*\n${fileSizeMb}` } - }, - { - "type": "section", - "fields": [ - { - "type": "mrkdwn", - "text": "*Version:*\nv${{ inputs.PACKAGE_VERSION }}" + ] + }, + { + type: 'section', + text: { + type: 'mrkdwn', + text: deploymentMessage + } + }, + { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: '📥 Download Release' }, - { - "type": "mrkdwn", - "text": "*Package Size:*\n${{ env.FILE_SIZE_MB }}" - } - ] - }, - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": "${{ env.DEPLOYMENT_MESSAGE }}" + url: githubReleaseUrl, + style: 'primary' } - }, - { - "type": "actions", - "elements": [ - { - "type": "button", - "text": { - "type": "plain_text", - "text": "📥 Download Release" - }, - "url": "${{ inputs.GITHUB_RELEASE_URL }}", - "style": "primary" - } - ] - }, - { - "type": "context", - "elements": [ - { - "type": "mrkdwn", - "text": "Build: ${{ inputs.BUILD_ZIP_PATH }}" - } - ] - } - ] - } - env: - SLACK_BOT_TOKEN: ${{ inputs.SLACK_BOT_TOKEN }} + ] + }, + { + type: 'context', + elements: [ + { + type: 'mrkdwn', + text: `Build: ${buildZipPath}` + } + ] + } + ] + }; + + process.env.SLACK_PAYLOAD = JSON.stringify(payload); + + const { execSync } = require('child_process'); + const path = require('path'); + const scriptPath = path.join(process.env.GITHUB_WORKSPACE, '.github/scripts/send-slack-message.js'); + execSync(`node "${scriptPath}"`, { stdio: 'inherit', env: process.env }); + NODE_SCRIPT - name: Notification summary shell: bash diff --git a/.github/scripts/send-slack-message.js b/.github/scripts/send-slack-message.js new file mode 100644 index 00000000..dbd9e5cc --- /dev/null +++ b/.github/scripts/send-slack-message.js @@ -0,0 +1,55 @@ +const https = require('https'); + +const slackToken = process.env.CLOUD_SLACK_BOT_TOKEN || ''; +const slackChannel = process.env.SLACK_CHANNEL || '#tmz-alerts'; +const payloadJson = process.env.SLACK_PAYLOAD || '{}'; + +if (!slackToken) { + console.log('⚠️ Slack token not provided, skipping notification'); + process.exit(0); +} + +let payload; +try { + payload = JSON.parse(payloadJson); + payload.channel = slackChannel; +} catch (error) { + console.error('Failed to parse payload:', error.message); + process.exit(1); +} + +const payloadStr = JSON.stringify(payload); +const data = Buffer.from(payloadStr, 'utf8'); + +const options = { + hostname: 'slack.com', + port: 443, + path: '/api/chat.postMessage', + method: 'POST', + headers: { + 'Authorization': `Bearer ${slackToken}`, + 'Content-Type': 'application/json', + 'Content-Length': data.length + } +}; + +const req = https.request(options, (res) => { + let responseData = ''; + res.on('data', (chunk) => { + responseData += chunk; + }); + res.on('end', () => { + const response = JSON.parse(responseData); + if (res.statusCode === 200 && response.ok) console.log('✅ Slack notification sent'); + process.exit(0); + }); +}); + +req.on('error', (error) => { + console.error('Failed to send Slack notification'); + process.exit(0); +}); + +req.write(data); +req.end(); + diff --git a/.github/workflows/daily-test-matrix.yml b/.github/workflows/daily-test-matrix.yml index eef76016..d693bec9 100644 --- a/.github/workflows/daily-test-matrix.yml +++ b/.github/workflows/daily-test-matrix.yml @@ -728,3 +728,12 @@ jobs: } else { console.log(`✅ Daily test matrix completed successfully: ${summary.success} passed out of ${summary.total} tests`); } + + - name: Send Slack notification on failure + if: failure() + continue-on-error: true + uses: ./.github/actions/theme-slack-notification-daily-tests + with: + CLOUD_SLACK_BOT_TOKEN: ${{ secrets.CLOUD_SLACK_BOT_TOKEN }} + WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + SLACK_CHANNEL: '#tmz-alerts' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 70ca0a55..1dcba52a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -526,7 +526,7 @@ jobs: if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true }} uses: ./.github/actions/theme-slack-notification-release with: - SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + CLOUD_SLACK_BOT_TOKEN: ${{ secrets.CLOUD_SLACK_BOT_TOKEN }} PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }} BUILD_ZIP_PATH: ${{ env.BUILD_ZIP_PATH }} GITHUB_RELEASE_URL: ${{ env.RELEASE_URL }} From 1c7e31912e10a81bfa05a65d4d7e89e4139fd044 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin <94352322+hein-obox@users.noreply.github.com> Date: Fri, 28 Nov 2025 12:22:39 +0200 Subject: [PATCH 21/43] Internal: Update release branch with main branch [TMZ-803] (#583) --- .cursor/rules/github-workflows.mdc | 77 ++++++ .../action.yml | 96 +------ .github/config/release.json | 40 --- .../cherry-picking/generate-branch-name.sh | 15 ++ .../cherry-picking/generate-pr-title.sh | 18 ++ .github/workflows/build.yml | 18 +- .github/workflows/cherry-pick-pr.yml | 236 ++---------------- 7 files changed, 135 insertions(+), 365 deletions(-) create mode 100644 .cursor/rules/github-workflows.mdc delete mode 100644 .github/config/release.json create mode 100755 .github/scripts/cherry-picking/generate-branch-name.sh create mode 100755 .github/scripts/cherry-picking/generate-pr-title.sh diff --git a/.cursor/rules/github-workflows.mdc b/.cursor/rules/github-workflows.mdc new file mode 100644 index 00000000..72f34a69 --- /dev/null +++ b/.cursor/rules/github-workflows.mdc @@ -0,0 +1,77 @@ +--- +description: GitHub Workflows and Actions YAML Rules for Hello Theme +globs: ["**/*.yml", "**/*.yaml"] +alwaysApply: true +--- + +# GitHub Workflows and Actions YAML Rules for Hello Theme + +## Core Principles + +### Assume Happy Path +- Remove defensive checks that add little value +- Assume branches exist, labels are correct, and operations succeed +- Let failures fail naturally rather than adding extensive error handling +- Focus on core functionality, not edge case handling + +### Keep Workflows Concise +- Target 50-100 lines per workflow file +- Extract complex logic to reusable scripts in `.github/scripts/` +- Inline simple logic (templates, simple string operations) +- Remove debugging and verbose logging + +### No Emojis +- Never use emojis in workflow files, PR titles, or messages +- Use plain text for all output and notifications + +## Script Extraction Guidelines + +### Extract to Scripts When: +- Logic is complex (5+ lines of bash) +- Logic is reused in multiple places +- Logic benefits from testing independently + +### Keep Inline When: +- Simple template strings +- Single-line operations +- Direct GitHub Actions expressions + +## Workflow Structure + +### Essential Steps Only +- Checkout repository +- Core workflow logic +- Error handling only for critical failures + +### Remove These Steps: +- Debugging/logging steps +- Redundant validation steps +- Conflict marker detection (redundant) + +## Code Style + +### YAML Formatting +- Use consistent indentation (2 spaces) +- Keep line length reasonable (max 120 characters) +- Use multi-line strings for readability when needed +- Empty line at end of file + +## Examples + +### Bad: Debugging Clutter +```yaml +- name: Log trigger and PR information + run: | + echo "Trigger: ${{ github.event.action }}" + echo "PR #${{ github.event.pull_request.number }}" + # ... more debugging output +``` + +### Bad: Unnecessary Validation +```yaml +if [ ! -f "style.css" ]; then + echo "::error:: Missing style.css" + continue +fi +# Assume happy path - these checks add little value +``` diff --git a/.github/actions/theme-slack-notification-release/action.yml b/.github/actions/theme-slack-notification-release/action.yml index 03c1a60f..690024d3 100644 --- a/.github/actions/theme-slack-notification-release/action.yml +++ b/.github/actions/theme-slack-notification-release/action.yml @@ -7,72 +7,24 @@ inputs: PACKAGE_VERSION: required: true description: 'Release version' - BUILD_ZIP_PATH: - required: true - description: 'Path to theme zip file' - GITHUB_RELEASE_URL: - required: true - description: 'GitHub release URL' SLACK_CHANNEL: required: false default: '#tmz-hello-delivery' description: 'Slack channel to send notification to' - WPORG_DEPLOYMENT_STATUS: - required: false - default: 'skipped' - description: 'WordPress.org deployment status (deployed|skipped|disabled)' runs: using: 'composite' steps: - - name: Prepare deployment message - id: deployment-message - shell: bash - run: | - case "${{ inputs.WPORG_DEPLOYMENT_STATUS }}" in - "deployed") - MESSAGE="📦 *WordPress.org Deployment*\\n• ✅ Automatically deployed to WordPress.org\\n• Theme available at: https://wordpress.org/themes/hello-elementor/\\n• No manual upload required! 🎉" - ;; - "disabled") - MESSAGE="📦 *WordPress.org Deployment*\\n• ⚠️ Disabled in configuration\\n• Manual upload required to WordPress.org\\n• Download zip from GitHub release below" - ;; - *) - MESSAGE="📦 *WordPress.org Deployment*\\n• ⚠️ Skipped (deploy_to_wporg: false)\\n• Manual upload required to WordPress.org\\n• Download zip from GitHub release below" - ;; - esac - echo "DEPLOYMENT_MESSAGE=$MESSAGE" >> $GITHUB_ENV - - - name: Get file info - id: file-info - shell: bash - run: | - if [ -f "${{ inputs.BUILD_ZIP_PATH }}" ]; then - FILE_SIZE=$(stat -c%s "${{ inputs.BUILD_ZIP_PATH }}" 2>/dev/null || stat -f%z "${{ inputs.BUILD_ZIP_PATH }}") - FILE_SIZE_MB=$(echo "scale=2; $FILE_SIZE / 1024 / 1024" | bc -l 2>/dev/null || echo "$((FILE_SIZE / 1024 / 1024)).0") - echo "FILE_SIZE=$FILE_SIZE" >> $GITHUB_ENV - echo "FILE_SIZE_MB=${FILE_SIZE_MB}MB" >> $GITHUB_ENV - else - echo "FILE_SIZE_MB=Unknown" >> $GITHUB_ENV - fi - - name: Post to Slack shell: bash env: CLOUD_SLACK_BOT_TOKEN: ${{ inputs.CLOUD_SLACK_BOT_TOKEN }} SLACK_CHANNEL: ${{ inputs.SLACK_CHANNEL }} PACKAGE_VERSION: ${{ inputs.PACKAGE_VERSION }} - FILE_SIZE_MB: ${{ env.FILE_SIZE_MB }} - DEPLOYMENT_MESSAGE: ${{ env.DEPLOYMENT_MESSAGE }} - GITHUB_RELEASE_URL: ${{ inputs.GITHUB_RELEASE_URL }} - BUILD_ZIP_PATH: ${{ inputs.BUILD_ZIP_PATH }} run: | node << 'NODE_SCRIPT' const slackChannel = process.env.SLACK_CHANNEL || '#tmz-hello-delivery'; const packageVersion = process.env.PACKAGE_VERSION || ''; - const fileSizeMb = process.env.FILE_SIZE_MB || 'Unknown'; - const deploymentMessage = (process.env.DEPLOYMENT_MESSAGE || '').replace(/\\n/g, '\n'); - const githubReleaseUrl = process.env.GITHUB_RELEASE_URL || ''; - const buildZipPath = process.env.BUILD_ZIP_PATH || ''; const payload = { text: `Hello Elementor v${packageVersion} Released!`, @@ -81,7 +33,7 @@ runs: type: 'header', text: { type: 'plain_text', - text: `🚀 Hello Elementor v${packageVersion} Released!` + text: `Hello Elementor v${packageVersion} Released!` } }, { @@ -97,40 +49,6 @@ runs: { type: 'mrkdwn', text: `*Version:*\nv${packageVersion}` - }, - { - type: 'mrkdwn', - text: `*Package Size:*\n${fileSizeMb}` - } - ] - }, - { - type: 'section', - text: { - type: 'mrkdwn', - text: deploymentMessage - } - }, - { - type: 'actions', - elements: [ - { - type: 'button', - text: { - type: 'plain_text', - text: '📥 Download Release' - }, - url: githubReleaseUrl, - style: 'primary' - } - ] - }, - { - type: 'context', - elements: [ - { - type: 'mrkdwn', - text: `Build: ${buildZipPath}` } ] } @@ -151,15 +69,3 @@ runs: echo "📢 Slack notification sent!" echo " - Channel: ${{ inputs.SLACK_CHANNEL }}" echo " - Version: v${{ inputs.PACKAGE_VERSION }}" - echo " - Release: ${{ inputs.GITHUB_RELEASE_URL }}" - case "${{ inputs.WPORG_DEPLOYMENT_STATUS }}" in - "deployed") - echo " - WordPress.org: ✅ Automatically deployed" - ;; - "disabled") - echo " - WordPress.org: ⚠️ Disabled in configuration" - ;; - *) - echo " - WordPress.org: ⚠️ Skipped (deploy_to_wporg: false)" - ;; - esac diff --git a/.github/config/release.json b/.github/config/release.json deleted file mode 100644 index 573ae792..00000000 --- a/.github/config/release.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "repository": { - "name": "hello-elementor", - "owner": "elementor", - "main_branch": "main", - "release_branches": ["3.4"] - }, - "versioning": { - "default_type": "patch", - "allowed_types": ["current", "patch", "minor", "major"] - }, - "release": { - "changelog_file": "readme.txt", - "changelog_section": "## Changelog", - "build_artifacts": ["hello-theme.zip"], - "wordpress_org": { - "auto_deploy": true, - "theme_slug": "hello-elementor", - "svn_url": "https://themes.svn.wordpress.org/hello-elementor/", - "skip_pre_releases": true, - "validation_required": true - } - }, - "notifications": { - "slack": { - "default_channel": "#release", - "enabled": true - } - }, - "security": { - "allowed_repositories": ["elementor/hello-theme"], - "blocked_actors": ["dependabot[bot]"] - }, - "environment": { - "node_version": "18", - "php_version": "7.4", - "composer_version": "2", - "ubuntu_version": "ubuntu-22.04" - } -} diff --git a/.github/scripts/cherry-picking/generate-branch-name.sh b/.github/scripts/cherry-picking/generate-branch-name.sh new file mode 100755 index 00000000..e6dc1b36 --- /dev/null +++ b/.github/scripts/cherry-picking/generate-branch-name.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -eo pipefail + +PR_NUMBER="$1" +TARGET="$2" +ORIGINAL_BRANCH="$3" + +CLEAN_BRANCH=$(echo "$ORIGINAL_BRANCH" | sed 's|^[^/]*/||g') +SANITIZED_BRANCH=$(echo "$CLEAN_BRANCH" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g') +SANITIZED_BRANCH=${SANITIZED_BRANCH:0:35} +TIMESTAMP=$(date +%s) +BRANCH="${SANITIZED_BRANCH}-cherry-pick-pr${PR_NUMBER}-${TIMESTAMP}" + +echo "$BRANCH" + diff --git a/.github/scripts/cherry-picking/generate-pr-title.sh b/.github/scripts/cherry-picking/generate-pr-title.sh new file mode 100755 index 00000000..3a6e5393 --- /dev/null +++ b/.github/scripts/cherry-picking/generate-pr-title.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -eo pipefail + +PR_TITLE="$1" +PR_NUMBER="$2" +TARGET="$3" + +PR_TICKETS=$(echo "$PR_TITLE" | grep -o '\[[A-Z]\{2,\}-[0-9]\+\]' | tr '\n' ' ' | sed 's/[[:space:]]*$//') + +if [ -n "$PR_TICKETS" ]; then + TITLE_WITHOUT_TICKETS=$(echo "$PR_TITLE" | sed 's/\[[A-Z]\{2,\}-[0-9]\+\]//g' | sed 's/[[:space:]]*$//') + CHERRY_PICK_TITLE="$TITLE_WITHOUT_TICKETS (CP #${PR_NUMBER}→${TARGET}) ${PR_TICKETS}" +else + CHERRY_PICK_TITLE="$PR_TITLE (CP #${PR_NUMBER}→${TARGET})" +fi + +echo "$CHERRY_PICK_TITLE" + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 43a01d1a..55df4a20 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,7 +1,9 @@ name: Build -on: [push, pull_request] - +on: + push: + pull_request: + workflow_call: jobs: build_plugin: @@ -41,7 +43,7 @@ jobs: echo "The Theme version is:" echo "${{ env.PACKAGE_VERSION }}" echo "The Theme slug is:" - echo "${{ env.THEME_SLUG }}" + echo "hello-elementor" echo "End debug Info" echo "exitcode=$?" >> $GITHUB_OUTPUT - name: Install Dependencies @@ -49,16 +51,6 @@ jobs: - name: Install Composer dependencies run: composer install --no-dev - - name: Bump version on push to release or develop - if: github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/release/') || github.ref == 'refs/heads/develop') - run: | - npm config set git-tag-version false - if [ "${GITHUB_REF:11}" == "develop" ]; - then npm version patch - fi - if [[ "${GITHUB_REF:11:7}" == "release" ]]; - then npm version minor - fi - name: Build run: npm run zip - name: Upload zip file to GitHub actions artifact diff --git a/.github/workflows/cherry-pick-pr.yml b/.github/workflows/cherry-pick-pr.yml index 9815f7d5..59419360 100644 --- a/.github/workflows/cherry-pick-pr.yml +++ b/.github/workflows/cherry-pick-pr.yml @@ -1,5 +1,4 @@ name: Cherry Pick Merged PR -# Add a test comment. on: pull_request_target: @@ -10,68 +9,15 @@ on: permissions: contents: write pull-requests: write + actions: write jobs: - load-config: - runs-on: ubuntu-latest - outputs: - ubuntu_version: ${{ steps.config.outputs.ubuntu_version }} - theme_name: ${{ steps.config.outputs.theme_name }} - main_branch: ${{ steps.config.outputs.main_branch }} - allowed_repos: ${{ steps.config.outputs.allowed_repos }} - blocked_actors: ${{ steps.config.outputs.blocked_actors }} - release_branches: ${{ steps.config.outputs.release_branches }} - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Load Release Configuration - id: config - run: | - echo "📋 Loading release configuration..." - CONFIG_FILE=".github/config/release.json" - - if [ ! -f "$CONFIG_FILE" ]; then - echo "❌ Error: Release configuration file not found: $CONFIG_FILE" - exit 1 - fi - - # Validate JSON syntax - if ! jq empty "$CONFIG_FILE" 2>/dev/null; then - echo "❌ Error: Invalid JSON in release configuration" - exit 1 - fi - - # Load configuration values (only what's needed for cherry-pick) - UBUNTU_VERSION=$(jq -r '.environment.ubuntu_version' "$CONFIG_FILE") - THEME_NAME=$(jq -r '.repository.name' "$CONFIG_FILE") - MAIN_BRANCH=$(jq -r '.repository.main_branch' "$CONFIG_FILE") - ALLOWED_REPOS=$(jq -r '.security.allowed_repositories[]' "$CONFIG_FILE" | tr '\n' ' ') - BLOCKED_ACTORS=$(jq -r '.security.blocked_actors[]' "$CONFIG_FILE" | tr '\n' ' ') - RELEASE_BRANCHES=$(jq -r '.repository.release_branches[]' "$CONFIG_FILE" | tr '\n' ' ') - - # Set outputs - echo "ubuntu_version=$UBUNTU_VERSION" >> "$GITHUB_OUTPUT" - echo "theme_name=$THEME_NAME" >> "$GITHUB_OUTPUT" - echo "main_branch=$MAIN_BRANCH" >> "$GITHUB_OUTPUT" - echo "allowed_repos=$ALLOWED_REPOS" >> "$GITHUB_OUTPUT" - echo "blocked_actors=$BLOCKED_ACTORS" >> "$GITHUB_OUTPUT" - echo "release_branches=$RELEASE_BRANCHES" >> "$GITHUB_OUTPUT" - - echo "✅ Release configuration loaded successfully" - echo "Theme: $THEME_NAME" - echo "Ubuntu: $UBUNTU_VERSION" - echo "Main branch: $MAIN_BRANCH" - echo "Release branches: $RELEASE_BRANCHES" - cherry-pick: - needs: load-config if: ${{ github.event.pull_request.merged == true && (github.event.action == 'closed' || (github.event.action == 'labeled' && startsWith(github.event.label.name, 'cp_'))) }} - runs-on: ${{ needs.load-config.outputs.ubuntu_version }} + runs-on: ubuntu-latest env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - HEAD_REF: ${{ github.event.pull_request.head.ref }} steps: - name: Checkout repository @@ -82,81 +28,6 @@ jobs: fetch-depth: 0 persist-credentials: true - - name: Set Configuration Variables - run: | - echo "📋 Setting configuration variables from load-config job..." - echo "UBUNTU_VERSION=${{ needs.load-config.outputs.ubuntu_version }}" >> $GITHUB_ENV - echo "THEME_NAME=${{ needs.load-config.outputs.theme_name }}" >> $GITHUB_ENV - echo "MAIN_BRANCH=${{ needs.load-config.outputs.main_branch }}" >> $GITHUB_ENV - echo "ALLOWED_REPOS=${{ needs.load-config.outputs.allowed_repos }}" >> $GITHUB_ENV - echo "BLOCKED_ACTORS=${{ needs.load-config.outputs.blocked_actors }}" >> $GITHUB_ENV - echo "RELEASE_BRANCHES=${{ needs.load-config.outputs.release_branches }}" >> $GITHUB_ENV - - echo "✅ Configuration variables set successfully" - echo "Theme: ${{ needs.load-config.outputs.theme_name }}" - echo "Ubuntu: ${{ needs.load-config.outputs.ubuntu_version }}" - echo "Main branch: ${{ needs.load-config.outputs.main_branch }}" - - - name: Security and Pre-flight Checks - run: | - echo "🔍 Security and pre-flight checks..." - echo "Repository: ${{ github.repository }}" - echo "Actor: ${{ github.actor }}" - echo "Base branch: ${{ github.event.pull_request.base.ref }}" - echo "Head branch: $HEAD_REF" - - # Repository permissions validation - REPO_ALLOWED=false - IFS=' ' read -ra ALLOWED_REPOS_ARRAY <<< "${{ env.ALLOWED_REPOS }}" - for allowed_repo in "${ALLOWED_REPOS_ARRAY[@]}"; do - if [ "${{ github.repository }}" = "$allowed_repo" ]; then - REPO_ALLOWED=true - break - fi - done - - if [ "$REPO_ALLOWED" != "true" ]; then - echo "⚠️ Warning: Cherry-pick attempted on unauthorized repository: ${{ github.repository }}" - echo "Allowed repositories: ${{ env.ALLOWED_REPOS }}" - fi - - # Check actor permissions (basic validation) - IFS=' ' read -ra BLOCKED_ACTORS_ARRAY <<< "${{ env.BLOCKED_ACTORS }}" - for blocked_actor in "${BLOCKED_ACTORS_ARRAY[@]}"; do - if [ "${{ github.actor }}" = "$blocked_actor" ]; then - echo "❌ Error: Blocked actor cannot create cherry-pick: ${{ github.actor }}" - exit 1 - fi - done - - # Validate that this is a legitimate cherry-pick operation - if [ "${{ github.event.pull_request.merged }}" != "true" ]; then - echo "❌ Error: Cherry-pick can only be performed on merged PRs" - exit 1 - fi - - echo "✅ Security and pre-flight checks passed" - - - name: Check if PR is from fork - id: check_fork - run: | - IS_FORK="${{ github.event.pull_request.head.repo.full_name != github.repository }}" - echo "is_fork=$IS_FORK" >> "$GITHUB_OUTPUT" - echo "Fork status: $IS_FORK" - shell: bash - - - name: Log trigger and PR information - run: | - echo "Trigger: ${{ github.event.action }}" - if [ "${{ github.event.action }}" = "labeled" ]; then - echo "Added label: ${{ github.event.label.name }}" - fi - echo "PR #${{ github.event.pull_request.number }} from: ${{ github.event.pull_request.head.repo.full_name }}" - echo "Target repository: ${{ github.repository }}" - echo "Is fork PR: ${{ steps.check_fork.outputs.is_fork }}" - echo "PR merged: ${{ github.event.pull_request.merged }}" - shell: bash - - name: Get branch labels id: get_labels run: | @@ -174,6 +45,7 @@ jobs: PR_TITLE: ${{ github.event.pull_request.title }} PR_USER_LOGIN: ${{ github.event.pull_request.user.login }} LABEL_NAME: ${{ github.event.label.name }} + SOURCE_REPO: ${{ github.event.pull_request.head.repo.full_name }} run: | PR_NUMBER="${{ github.event.pull_request.number }}" MERGE_SHA="${{ github.event.pull_request.merge_commit_sha }}" @@ -186,50 +58,39 @@ jobs: for lbl in "${BRANCHES[@]}"; do TARGET=${lbl#cp_} - # Create sanitized branch name from original branch name with timestamp for uniqueness ORIGINAL_BRANCH="${{ github.event.pull_request.head.ref }}" - # Strip any word followed by '/' to ensure ticket numbers appear at the beginning - CLEAN_BRANCH=$(echo "$ORIGINAL_BRANCH" | sed 's|^[^/]*/||g') - SANITIZED_BRANCH=$(echo "$CLEAN_BRANCH" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g') - # Limit length to 35 chars to leave room for PR number and timestamp suffix - SANITIZED_BRANCH=${SANITIZED_BRANCH:0:35} - TIMESTAMP=$(date +%s) - BRANCH="${SANITIZED_BRANCH}-cherry-pick-pr${PR_NUMBER}-${TIMESTAMP}" - - echo "🍒 Processing cherry-pick for branch: $TARGET" + BRANCH=$(bash "${GITHUB_WORKSPACE}/.github/scripts/cherry-picking/generate-branch-name.sh" "$PR_NUMBER" "$TARGET" "$ORIGINAL_BRANCH") + CONFLICT_BRANCH="${BRANCH}_conflicts" + + echo "Processing cherry-pick for branch: $TARGET" - # Create branch if ! git checkout -b "$BRANCH" "origin/$TARGET"; then echo "::warning:: Branch $TARGET does not exist - skipping" continue fi - # Cherry-pick if ! git cherry-pick -m 1 "$MERGE_SHA"; then echo "::error:: Cherry-pick conflicts detected for PR #${PR_NUMBER} on branch ${TARGET}" - # Create a conflict resolution branch - CONFLICT_BRANCH="${BRANCH}-conflicts" - - # Add conflict markers and create a commit for manual resolution git add . git commit -m "Cherry-pick PR #${PR_NUMBER} with conflicts - manual resolution needed" - # Push the conflict branch if git push --force-with-lease origin "$BRANCH:$CONFLICT_BRANCH"; then - # Create draft PR with conflict information if ! gh pr list --head "$CONFLICT_BRANCH" --base "$TARGET" --state open | grep -q .; then + CONFLICT_TITLE=$(bash "${GITHUB_WORKSPACE}/.github/scripts/cherry-picking/generate-pr-title.sh" "$PR_TITLE" "$PR_NUMBER" "$TARGET") + CONFLICT_TITLE="${CONFLICT_TITLE} with conflicts" + CONFLICT_TRIGGER_INFO="" if [ "${{ github.event.action }}" = "labeled" ]; then CONFLICT_TRIGGER_INFO=" **Trigger:** Label \`${LABEL_NAME}\` added to closed PR" fi - + gh pr create \ --base "$TARGET" \ --head "$CONFLICT_BRANCH" \ - --title "🔧 [CONFLICTS] Cherry-pick PR #${PR_NUMBER} → ${TARGET}: ${PR_TITLE}" \ - --body "⚠️ **Manual Resolution Required** + --title "$CONFLICT_TITLE" \ + --body "**Manual Resolution Required** This cherry-pick of [#${PR_NUMBER}](${ORIG_URL}) to \`${TARGET}\` branch has conflicts that need manual resolution. @@ -255,96 +116,37 @@ jobs: **Original PR:** [#${PR_NUMBER}](${ORIG_URL})${CONFLICT_TRIGGER_INFO}" \ --draft - - echo "::notice:: Created draft PR for manual conflict resolution: $CONFLICT_BRANCH" - else - echo "::notice:: Draft PR already exists for conflict resolution: $CONFLICT_BRANCH" fi else - echo "::warning:: Failed to push conflict branch $CONFLICT_BRANCH" git cherry-pick --abort fi continue - else - echo "✅ Cherry-pick successful for $TARGET" - fi - - # Basic theme structure validation (quick checks only) - echo "🔍 Basic theme structure validation..." - if [ ! -f "style.css" ]; then - echo "::error:: Missing style.css after cherry-pick" - continue - fi - if [ ! -f "functions.php" ]; then - echo "::error:: Missing functions.php after cherry-pick" - continue - fi - if [ ! -f "theme.json" ]; then - echo "::error:: Missing theme.json after cherry-pick" - continue fi - # Check for obvious conflict markers - if grep -q "<<<<<<< HEAD" style.css functions.php theme.json 2>/dev/null; then - echo "::warning:: Conflict markers detected - this should not happen in successful cherry-pick" - fi - - # Push (force push to handle existing branches) if ! git push --force-with-lease origin "$BRANCH"; then echo "::error:: Failed to push branch $BRANCH" exit 1 fi - # Create PR via gh CLI (token already in env: GH_TOKEN) - # Check if PR already exists if gh pr list --head "$BRANCH" --base "$TARGET" --state open | grep -q .; then echo "PR already exists for branch $BRANCH -> $TARGET, skipping creation" else + PR_TITLE_GENERATED=$(bash "${GITHUB_WORKSPACE}/.github/scripts/cherry-picking/generate-pr-title.sh" "$PR_TITLE" "$PR_NUMBER" "$TARGET") + TRIGGER_INFO="" if [ "${{ github.event.action }}" = "labeled" ]; then TRIGGER_INFO=" **Trigger:** Label \`${LABEL_NAME}\` added to closed PR" fi - # Extract tickets and add to title for Jira compatibility - PR_TICKETS=$(echo "$PR_TITLE" | grep -o '\[[A-Z]\{2,\}-[0-9]\+\]' | tr '\n' ' ' | sed 's/[[:space:]]*$//') - - # Create title with tickets at the end (remove duplicates if already present) - if [ -n "$PR_TICKETS" ]; then - # Remove existing tickets from title to avoid duplication - TITLE_WITHOUT_TICKETS=$(echo "$PR_TITLE" | sed 's/\[[A-Z]\{2,\}-[0-9]\+\]//g' | sed 's/[[:space:]]*$//') - CHERRY_PICK_TITLE="$TITLE_WITHOUT_TICKETS (🍒 CP #${PR_NUMBER}→${TARGET}) ${PR_TICKETS}" - else - CHERRY_PICK_TITLE="$PR_TITLE (🍒 CP #${PR_NUMBER}→${TARGET})" - fi - gh pr create \ --base "$TARGET" \ --head "$BRANCH" \ - --title "$CHERRY_PICK_TITLE" \ + --title "$PR_TITLE_GENERATED" \ --body "Automatic cherry-pick of [#${PR_NUMBER}](${ORIG_URL}) to \`${TARGET}\` branch. - **Theme Information:** - - **Theme:** ${THEME_NAME} - - **Source:** ${{ github.event.pull_request.head.repo.full_name }} - - **Original Author:** @${PR_USER_LOGIN}${TRIGGER_INFO} - - **Automatic Validation:** - The following workflows will run automatically to validate this cherry-pick: - - 🏗️ **Build validation** (\`build.yml\`) - Theme compilation and asset building - - 🧹 **JavaScript linting** (\`lint.yml\`) - Code quality checks - - ✅ **Cherry-pick validation** (\`cherry-pick-validation.yml\`) - Theme-specific validation - - 🔍 **Additional CI workflows** - As configured for the repository - - **Next Steps:** - - Wait for validation workflows to complete - - Review automated validation results - - Test theme functionality if needed - - Merge when all checks pass - - **Note:** Build and validation happen automatically via PR workflows, following the same process as regular PRs." + **Source:** ${SOURCE_REPO} + **Original Author:** @${PR_USER_LOGIN}${TRIGGER_INFO}" fi - - echo "✅ Successfully created cherry-pick PR for $TARGET" done - shell: bash + shell: bash From bfaa5f2287da06c6800e888634156359ddf11550 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 14:59:55 +0200 Subject: [PATCH 22/43] Internal: Create deploy workflow [TMZ-803] (#578) (#585) --- .../publish-theme-to-wordpress-org-dry-run.sh | 56 +- .../scripts/publish-theme-to-wordpress-org.sh | 20 +- .github/scripts/validate-changelog.sh | 19 + .github/workflows/deploy.yml | 63 ++ .github/workflows/release.yml | 606 ------------------ 5 files changed, 109 insertions(+), 655 deletions(-) create mode 100755 .github/scripts/validate-changelog.sh create mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index 772755eb..210cf108 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -1,31 +1,19 @@ #!/bin/bash set -eo pipefail -echo "🧪 DRY RUN MODE: Will simulate SVN operations without committing" +echo "DRY RUN MODE: Will simulate SVN operations without committing" if [[ -z "$THEME_VERSION" ]]; then echo "Set the THEME_VERSION env var" exit 1 fi -if [[ -z "$THEME_SLUG" ]]; then - echo "Set the THEME_SLUG env var" - exit 1 -fi - -if [[ -z "$BUILD_DIR" ]]; then - echo "Set the BUILD_DIR env var" - exit 1 -fi - # Ensure SVN is installed svn --version echo "SVN installed" echo "Publish theme version: ${THEME_VERSION}" -echo "Theme slug: ${THEME_SLUG}" -echo "Build directory: ${BUILD_DIR}" THEME_PATH="$GITHUB_WORKSPACE" SVN_PATH="$GITHUB_WORKSPACE/svn" @@ -36,28 +24,28 @@ pwd mkdir -p $SVN_PATH cd $SVN_PATH -echo "🧪 DRY RUN: Checking out SVN repository (read-only)" -svn co --depth immediates "https://themes.svn.wordpress.org/${THEME_SLUG}" . 2>&1 | head -20 || { - echo "⚠️ Could not checkout repository (may require auth for some operations)" - echo " This is normal - simulating checkout for dry-run" +echo "DRY RUN: Checking out SVN repository (read-only)" +svn co --depth immediates "https://themes.svn.wordpress.org/hello-elementor" . 2>&1 | head -20 || { + echo "Could not checkout repository (may require auth for some operations)" + echo "This is normal - simulating checkout for dry-run" mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" } echo "Check if version folder already exists" VERSION_EXISTS=false -if svn list "https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR}" > /dev/null 2>&1; then +if svn list "https://themes.svn.wordpress.org/hello-elementor/${VERSION_DIR}" > /dev/null 2>&1; then VERSION_EXISTS=true fi if [[ "$VERSION_EXISTS" == "true" ]]; then - echo "❌ ERROR: Version folder $VERSION_DIR already exists in SVN! - SVN URL: https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR} + echo "ERROR: Version folder $VERSION_DIR already exists in SVN! + SVN URL: https://themes.svn.wordpress.org/hello-elementor/${VERSION_DIR} WordPress.org theme versions are immutable - you cannot update an existing version. If you need to make changes, create a new version (e.g., increment patch/minor/major). -🧪 DRY RUN: Would fail here (version already exists)" + DRY RUN: Would fail here (version already exists)" exit 0 fi @@ -65,13 +53,13 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" -rsync -ah --progress "$THEME_PATH/$BUILD_DIR/"* . || rsync -ah --progress "$THEME_PATH/$BUILD_DIR/." . || true +rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true echo "Preparing files for SVN" svn status 2>/dev/null || echo "" echo "svn add new files" -echo "🧪 DRY RUN: Would add new files" +echo "DRY RUN: Would add new files" svn status 2>/dev/null | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | sed 's|^| Would add: |' || true echo "" @@ -87,29 +75,29 @@ if [ -n "$SVN_STATUS" ]; then MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" || echo "0") UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" || echo "0") - echo " Added (A): $ADDED_COUNT files" + echo "Added (A): $ADDED_COUNT files" if [ "$MODIFIED_COUNT" -gt 0 ]; then - echo " Modified (M): $MODIFIED_COUNT files" + echo "Modified (M): $MODIFIED_COUNT files" fi if [ "$UNTRACKED_COUNT" -gt 0 ]; then - echo " ⚠️ Untracked (?): $UNTRACKED_COUNT files (would be added)" + echo "Untracked (?): $UNTRACKED_COUNT files (would be added)" fi echo "" TOTAL_CHANGES=$((ADDED_COUNT + MODIFIED_COUNT)) - echo " Total files that would be committed: $TOTAL_CHANGES files" + echo "Total files that would be committed: $TOTAL_CHANGES files" else - echo " (No changes detected - files are up to date)" + echo "(No changes detected - files are up to date)" fi echo "==========================================" echo "" if [ "$TOTAL_CHANGES" -gt 0 ]; then - echo "🧪 DRY RUN: Would commit $TOTAL_CHANGES files to version folder $VERSION_DIR" - echo " Commit message: Upload v${THEME_VERSION}" + echo "DRY RUN: Would commit $TOTAL_CHANGES files to version folder $VERSION_DIR" + echo "Commit message: Upload v${THEME_VERSION}" else - echo "🧪 DRY RUN: No changes to commit (files are up to date)" + echo "DRY RUN: No changes to commit (files are up to date)" fi -echo " 🚫 No actual commit performed (dry-run mode)" +echo "No actual commit performed (dry-run mode)" echo "Remove the SVN folder from the workspace" rm -rf $SVN_PATH @@ -117,6 +105,6 @@ rm -rf $SVN_PATH echo "Back to the workspace root" cd $GITHUB_WORKSPACE -echo "✅ Dry-run complete: v${THEME_VERSION}" -echo " All checks passed - ready for actual deployment" +echo "Dry-run complete: v${THEME_VERSION}" +echo "All checks passed - ready for actual deployment" diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index d5311d6e..e16c8399 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -16,16 +16,6 @@ if [[ -z "$THEME_VERSION" ]]; then exit 1 fi -if [[ -z "$THEME_SLUG" ]]; then - echo "Set the THEME_SLUG env var" - exit 1 -fi - -if [[ -z "$BUILD_DIR" ]]; then - echo "Set the BUILD_DIR env var" - exit 1 -fi - # Ensure SVN is installed svn --version @@ -43,12 +33,12 @@ mkdir -p $SVN_PATH cd $SVN_PATH echo "Checkout from SVN" -svn co --depth immediates "https://themes.svn.wordpress.org/${THEME_SLUG}" . +svn co --depth immediates "https://themes.svn.wordpress.org/hello-elementor" . echo "Check if version folder already exists" -if svn list "https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR}" > /dev/null 2>&1; then - echo "❌ ERROR: Version folder $VERSION_DIR already exists in SVN! - SVN URL: https://themes.svn.wordpress.org/${THEME_SLUG}/${VERSION_DIR} +if svn list "https://themes.svn.wordpress.org/hello-elementor/${VERSION_DIR}" > /dev/null 2>&1; then + echo "ERROR: Version folder $VERSION_DIR already exists in SVN! + SVN URL: https://themes.svn.wordpress.org/hello-elementor/${VERSION_DIR} WordPress.org theme versions are immutable - you cannot update an existing version. If you need to make changes, create a new version (e.g., increment patch/minor/major)." @@ -62,7 +52,7 @@ svn add "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files" -rsync -ah --progress "$THEME_PATH/$BUILD_DIR/"* . || rsync -ah --progress "$THEME_PATH/$BUILD_DIR/." . || true +rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true echo "Preparing files" cd "$VERSION_DIR" diff --git a/.github/scripts/validate-changelog.sh b/.github/scripts/validate-changelog.sh new file mode 100755 index 00000000..833f35bf --- /dev/null +++ b/.github/scripts/validate-changelog.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -eo pipefail + +if [[ -z "$VERSION" ]]; then + echo "Set the VERSION env var" + exit 1 +fi + +if [[ ! -f "readme.txt" ]]; then + echo "readme.txt file does not exist" + exit 1 +fi + +if ! grep -q "= ${VERSION} -" readme.txt; then + echo "readme.txt file does not contain changelog entry for version: ${VERSION}" + echo "Expected format: = ${VERSION} - DATE" + exit 1 +fi + diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..95593f3b --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,63 @@ +name: Deploy + +permissions: + contents: read + actions: read + +on: + workflow_dispatch: + inputs: + dry_run: + type: boolean + description: 'Dry run mode (test without deploying)' + required: false + default: false + +jobs: + build: + if: ( github.actor == 'ManorHazaz' || github.actor == 'hein-obox' || github.actor == 'KingYes' || github.actor == 'arielk' || github.actor == 'nicoladj77' ) && startsWith( github.repository, 'elementor/' ) + uses: ./.github/workflows/build.yml + secrets: inherit + + deploy: + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Preparing envs + run: | + echo "THEME_VERSION=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: hello-elementor + - name: Validate changelog + env: + VERSION: ${{ env.THEME_VERSION }} + run: | + bash "${GITHUB_WORKSPACE}/.github/scripts/validate-changelog.sh" + - name: Install SVN + run: | + sudo apt-get update -y + sudo apt-get install -y subversion + which svn + svn --version + - name: Publish to WordPress.org SVN (Dry Run) + if: ${{ inputs.dry_run == true }} + run: | + bash "${GITHUB_WORKSPACE}/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh" + - name: Publish to WordPress.org SVN + if: ${{ inputs.dry_run == false }} + env: + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + run: | + bash "${GITHUB_WORKSPACE}/.github/scripts/publish-theme-to-wordpress-org.sh" + - name: Send Slack Notification + if: ${{ inputs.dry_run == false }} + uses: ./.github/actions/theme-slack-notification-release + with: + CLOUD_SLACK_BOT_TOKEN: ${{ secrets.CLOUD_SLACK_BOT_TOKEN }} + PACKAGE_VERSION: ${{ env.THEME_VERSION }} + SLACK_CHANNEL: "#tmz-hello-delivery" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 1dcba52a..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,606 +0,0 @@ -name: 'Automated Release' - -on: - workflow_dispatch: - inputs: - release_branch: - type: string - description: 'Branch to create release from (e.g., main, 3.4, feature/xyz)' - required: true - version_type: - required: true - type: choice - description: 'Version increment type' - options: - - current # For first release - keeps version as-is (3.4.4) - - patch # 3.4.4 → 3.4.5 - - minor # 3.4.4 → 3.5.0 - - major # 3.4.4 → 4.0.0 - dry_run: - type: boolean - description: 'Dry run (test without creating actual release)?' - required: false - default: true - deploy_to_wporg: - type: boolean - description: 'Deploy to WordPress.org theme repository?' - required: false - default: false - slack_channel: - type: string - description: 'Slack channel for notifications' - required: false - default: '#release' - -permissions: - contents: write - pull-requests: write - issues: write - -env: - NODE_VERSION: '18' - PHP_VERSION: '7.4' - COMPOSER_VERSION: '2' - -jobs: - release: - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - ref: ${{ inputs.release_branch }} - fetch-depth: 0 - - - name: Load Release Configuration - id: config - run: | - echo "📋 Loading release configuration..." - CONFIG_FILE=".github/config/release.json" - - if [ ! -f "$CONFIG_FILE" ]; then - echo "❌ Error: Release configuration file not found: $CONFIG_FILE" - exit 1 - fi - - # Validate JSON syntax - if ! jq empty "$CONFIG_FILE" 2>/dev/null; then - echo "❌ Error: Invalid JSON in release configuration" - exit 1 - fi - - # Load configuration values - ALLOWED_REPOS=$(jq -r '.security.allowed_repositories[]' "$CONFIG_FILE" | tr '\n' ' ') - BLOCKED_ACTORS=$(jq -r '.security.blocked_actors[]' "$CONFIG_FILE" | tr '\n' ' ') - RELEASE_BRANCHES=$(jq -r '.repository.release_branches[]' "$CONFIG_FILE" | tr '\n' ' ') - CONFIG_THEME_SLUG=$(jq -r '.release.wordpress_org.theme_slug' "$CONFIG_FILE") - AUTO_DEPLOY_ENABLED=$(jq -r '.release.wordpress_org.auto_deploy' "$CONFIG_FILE") - - echo "ALLOWED_REPOS=$ALLOWED_REPOS" >> $GITHUB_ENV - echo "BLOCKED_ACTORS=$BLOCKED_ACTORS" >> $GITHUB_ENV - echo "RELEASE_BRANCHES=$RELEASE_BRANCHES" >> $GITHUB_ENV - echo "CONFIG_THEME_SLUG=$CONFIG_THEME_SLUG" >> $GITHUB_ENV - echo "AUTO_DEPLOY_ENABLED=$AUTO_DEPLOY_ENABLED" >> $GITHUB_ENV - - echo "✅ Release configuration loaded successfully" - echo " - Theme slug: $CONFIG_THEME_SLUG" - echo " - Auto-deploy enabled: $AUTO_DEPLOY_ENABLED" - - - name: Pre-flight checks - run: | - echo "🔍 Pre-flight checks..." - echo "Release Branch: ${{ inputs.release_branch }}" - echo "Current Branch: ${{ github.ref_name }}" - echo "Version Type: ${{ inputs.version_type }}" - echo "Dry Run: ${{ inputs.dry_run }}" - echo "Deploy to WordPress.org: ${{ inputs.deploy_to_wporg }}" - echo "Repository: ${{ github.repository }}" - echo "Actor: ${{ github.actor }}" - - if [ "${{ inputs.dry_run }}" == "true" ]; then - echo "🧪 **DRY RUN MODE** - No actual release will be created" - fi - - # Repository permissions validation - REPO_ALLOWED=false - for allowed_repo in ${{ env.ALLOWED_REPOS }}; do - if [ "${{ github.repository }}" == "$allowed_repo" ]; then - REPO_ALLOWED=true - break - fi - done - - if [ "$REPO_ALLOWED" != "true" ]; then - echo "⚠️ Warning: Running on unauthorized repository: ${{ github.repository }}" - fi - - # Check actor permissions - for blocked_actor in ${{ env.BLOCKED_ACTORS }}; do - if [ "${{ github.actor }}" == "$blocked_actor" ]; then - echo "❌ Error: Blocked actor cannot create releases: ${{ github.actor }}" - exit 1 - fi - done - - # Check if the specified branch exists - if ! git show-ref --verify --quiet refs/remotes/origin/${{ inputs.release_branch }}; then - echo "❌ Error: Branch '${{ inputs.release_branch }}' does not exist" - echo "💡 Available branches:" - git branch -r --format='%(refname:short)' | sed 's/origin\///' | head -10 - exit 1 - fi - - # Check if selected release branch is allowed (if configured) - if [ -n "${{ env.RELEASE_BRANCHES }}" ]; then - BRANCH_ALLOWED=false - for release_branch in ${{ env.RELEASE_BRANCHES }}; do - if [ "${{ inputs.release_branch }}" == "$release_branch" ]; then - BRANCH_ALLOWED=true - break - fi - done - - if [ "$BRANCH_ALLOWED" != "true" ]; then - echo "⚠️ Warning: Branch '${{ inputs.release_branch }}' is not in configured release branches" - echo "📋 Configured release branches: ${{ env.RELEASE_BRANCHES }}" - echo "🔄 Continuing anyway - remove this branch from release.json if releases should be blocked" - fi - fi - - # Check for uncommitted changes - if ! git diff --quiet; then - echo "❌ Error: Uncommitted changes found" - exit 1 - fi - - echo "✅ Pre-flight checks passed" - - - name: Install Dependencies - uses: ./.github/actions/install-dependencies-release - with: - DEVOPS_TOKEN: ${{ secrets.DEVOPS_TOKEN }} - CLOUD_DEVOPS_TOKEN: ${{ secrets.CLOUD_DEVOPS_TOKEN }} - - - name: Get current version - id: current-version - run: | - PACKAGE_VERSION=$(node -p "require('./package.json').version") - echo "CLEAN_PACKAGE_VERSION=$PACKAGE_VERSION" >> $GITHUB_ENV - echo "Current version: $PACKAGE_VERSION" - - - name: Bump Theme Version (Dry Run) - if: ${{ inputs.dry_run == true }} - run: | - echo "🧪 DRY RUN: Would bump version from ${{ env.CLEAN_PACKAGE_VERSION }}" - - CURRENT_VERSION="${{ env.CLEAN_PACKAGE_VERSION }}" - IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" - - case "${{ inputs.version_type }}" in - "current") - NEW_VERSION="$CURRENT_VERSION" - ;; - "major") - NEW_MAJOR=$((MAJOR + 1)) - NEW_VERSION="$NEW_MAJOR.0.0" - ;; - "minor") - NEW_MINOR=$((MINOR + 1)) - NEW_VERSION="$MAJOR.$NEW_MINOR.0" - ;; - "patch") - NEW_PATCH=$((PATCH + 1)) - NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH" - ;; - esac - - echo "DRY_RUN_VERSION=$NEW_VERSION" >> $GITHUB_ENV - echo "PACKAGE_VERSION=$NEW_VERSION" >> $GITHUB_ENV - echo "🧪 DRY RUN: Version would be: $CURRENT_VERSION → $NEW_VERSION" - - - name: Bump Theme Version (Actual) - if: ${{ inputs.dry_run == false }} - uses: ./.github/actions/bump-theme-version-release - with: - CLEAN_PACKAGE_VERSION: ${{ env.CLEAN_PACKAGE_VERSION }} - VERSION_TYPE: ${{ inputs.version_type }} - - - name: Validate changelog for new version - uses: ./.github/actions/get-changelog-from-readme-release - with: - VERSION: ${{ env.PACKAGE_VERSION }} - - - name: Build Theme - id: build - uses: ./.github/actions/build-theme-release - with: - PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }} - BUILD_SCRIPT_PATH: "npm run package:zip" - - - name: Set Build Directory - if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - run: | - BUILD_DIR="hello-elementor" - - if [ ! -d "$BUILD_DIR" ]; then - echo "❌ Build directory not found: $BUILD_DIR" - echo "Available directories:" - ls -la - exit 1 - fi - - echo "BUILD_DIR=${BUILD_DIR}" >> $GITHUB_ENV - echo "✅ Build directory set: ${BUILD_DIR}" - - - name: Create GitHub Release (Dry Run) - if: ${{ inputs.dry_run == true }} - run: | - echo "🧪 DRY RUN: Would create GitHub release" - echo " - Tag: v${{ env.PACKAGE_VERSION }}" - echo " - Build file: ${{ env.BUILD_ZIP_PATH }}" - echo " - Changelog: ${{ env.CHANGELOG_FILE }}" - echo "RELEASE_URL=https://github.com/${{ github.repository }}/releases/tag/v${{ env.PACKAGE_VERSION }}" >> $GITHUB_ENV - - - name: Create GitHub Release (Actual) - if: ${{ inputs.dry_run == false }} - id: create-release - uses: softprops/action-gh-release@v1 - with: - tag_name: v${{ env.PACKAGE_VERSION }} - name: Hello Elementor v${{ env.PACKAGE_VERSION }} - body_path: ${{ env.CHANGELOG_FILE }} - files: ${{ env.BUILD_ZIP_PATH }} - prerelease: false - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Set Release URL - if: ${{ inputs.dry_run == false }} - run: | - echo "RELEASE_URL=${{ steps.create-release.outputs.html_url }}" >> $GITHUB_ENV - - # WordPress.org Deployment Section - - name: WordPress.org Deployment Validation - if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - run: | - echo "🔍 **WordPress.org Deployment Pre-flight**" - echo " - Theme: Hello Elementor" - echo " - Version: ${{ env.PACKAGE_VERSION }}" - echo " - SVN URL: https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" - echo " - Dry run: ${{ inputs.dry_run }}" - - # Check if BUILD_DIR is set - if [ -z "${{ env.BUILD_DIR }}" ]; then - echo "❌ BUILD_DIR environment variable is not set" - echo " This means the build step may have failed or BUILD_DIR was not set correctly" - echo " Checking available directories:" - ls -la - echo "" - echo " Expected build directory name: hello-elementor (from package.json name)" - exit 1 - fi - - echo " - Build directory: ${{ env.BUILD_DIR }}" - - # Validate build directory exists - if [ ! -d "${{ env.BUILD_DIR }}" ]; then - echo "❌ Build directory not found: ${{ env.BUILD_DIR }}" - echo " Available directories:" - ls -la - exit 1 - fi - - # Validate required theme files - for file in style.css index.php functions.php readme.txt; do - if [ ! -f "${{ env.BUILD_DIR }}/$file" ]; then - echo "❌ Required file missing: $file" - exit 1 - fi - done - - echo "✅ Pre-flight validation passed" - - - name: Install SVN (Dry Run) - if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - run: | - sudo apt-get update -y - sudo apt-get install -y subversion - svn --version - - - name: Deploy to WordPress.org (Dry Run) - if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - env: - THEME_VERSION: ${{ env.PACKAGE_VERSION }} - THEME_SLUG: ${{ env.CONFIG_THEME_SLUG }} - BUILD_DIR: ${{ env.BUILD_DIR }} - run: | - bash .github/scripts/publish-theme-to-wordpress-org-dry-run.sh - - - name: Show SVN Status (Dry Run) - if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - run: | - echo "📊 **SVN Status Check - Dry Run**" - echo "" - - SVN_TEMP_DIR="./svn-checkout-temp" - SVN_URL="https://themes.svn.wordpress.org/${{ env.CONFIG_THEME_SLUG }}" - BUILD_DIR="${{ env.BUILD_DIR }}" - VERSION="${{ env.PACKAGE_VERSION }}" - - echo "🔍 Checking out SVN repository (read-only)..." - echo " - SVN URL: $SVN_URL" - echo " - Version: $VERSION" - echo " - Note: Themes use flat structure with version folders (no trunk/tags)" - echo "" - - if ! command -v svn &> /dev/null; then - echo "⚠️ SVN not installed - installing..." - sudo apt-get update && sudo apt-get install -y subversion - fi - - rm -rf "$SVN_TEMP_DIR" - svn checkout --depth immediates "$SVN_URL" "$SVN_TEMP_DIR" > /dev/null 2>&1 || { - echo "⚠️ Could not checkout repository (may require auth for some operations)" - echo " This is normal for private repositories - skipping SVN status check" - exit 0 - } - - echo "✅ SVN repository checked out" - echo "" - - echo "📂 **Existing version folders in SVN:**" - if [ -d "$SVN_TEMP_DIR" ]; then - EXISTING_VERSIONS=$(ls -1 "$SVN_TEMP_DIR" 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+' | sort -V || echo "") - if [ -n "$EXISTING_VERSIONS" ]; then - echo "$EXISTING_VERSIONS" | head -10 | sed 's|^| |' - VERSION_COUNT=$(echo "$EXISTING_VERSIONS" | wc -l) - if [ "$VERSION_COUNT" -gt 10 ]; then - echo " ... and $((VERSION_COUNT - 10)) more versions" - fi - else - echo " (No version folders found - new theme repository)" - fi - fi - echo "" - - if [ -d "$SVN_TEMP_DIR/$VERSION" ]; then - echo "⚠️ **Version $VERSION already exists in SVN:**" - ls -la "$SVN_TEMP_DIR/$VERSION" | head -20 - echo "" - echo "⚠️ Warning: Version $VERSION already exists in SVN!" - echo " This would update the existing version folder" - echo "" - - echo "📊 **Simulating update to version folder $VERSION...**" - cd "$SVN_TEMP_DIR/$VERSION" - echo " Current version folder status:" - svn status 2>/dev/null || echo " (Clean working copy)" - echo "" - - if [ -d "$BUILD_DIR" ]; then - echo " Copying build files to version folder (simulation)..." - cp -r "$BUILD_DIR"/* . 2>/dev/null || cp -r "$BUILD_DIR"/. . 2>/dev/null || true - - echo "" - echo "📊 **SVN Status After File Copy (what would be committed):**" - SVN_STATUS=$(svn status 2>/dev/null || echo "") - if [ -n "$SVN_STATUS" ]; then - echo "$SVN_STATUS" | head -50 - TOTAL_CHANGES=$(echo "$SVN_STATUS" | wc -l) - if [ "$TOTAL_CHANGES" -gt 50 ]; then - echo "" - echo " ... and $((TOTAL_CHANGES - 50)) more changes" - fi - echo "" - echo " Summary:" - echo "$SVN_STATUS" | grep "^A" | wc -l | xargs -I {} echo " Added (A): {} files" - echo "$SVN_STATUS" | grep "^M" | wc -l | xargs -I {} echo " Modified (M): {} files" - echo "$SVN_STATUS" | grep "^D" | wc -l | xargs -I {} echo " Deleted (D): {} files" - echo "$SVN_STATUS" | grep "^?" | wc -l | xargs -I {} echo " Untracked (?): {} files" - else - echo " (No changes detected)" - fi - fi - cd - > /dev/null - else - echo "📂 **Version $VERSION would be created**" - echo " New version folder: $SVN_URL/$VERSION" - echo "" - - if [ -d "$BUILD_DIR" ]; then - echo "📊 **Files that would be uploaded:**" - FILE_COUNT=$(find "$BUILD_DIR" -type f | wc -l) - DIR_COUNT=$(find "$BUILD_DIR" -type d | wc -l) - echo " Total files: $FILE_COUNT" - echo " Total directories: $DIR_COUNT" - fi - fi - echo "" - - echo "📋 **Build Files Summary:**" - echo " Build directory: $BUILD_DIR" - if [ -d "$BUILD_DIR" ]; then - FILE_COUNT=$(find "$BUILD_DIR" -type f | wc -l) - DIR_COUNT=$(find "$BUILD_DIR" -type d | wc -l) - echo " Total files: $FILE_COUNT" - echo " Total directories: $DIR_COUNT" - echo "" - echo " File structure (first 30 files):" - find "$BUILD_DIR" -type f | head -30 | sed 's|^| |' - if [ "$FILE_COUNT" -gt 30 ]; then - echo " ... and $((FILE_COUNT - 30)) more files" - fi - else - echo " ❌ Build directory not found!" - fi - - echo "" - echo "🧹 Cleaning up temporary SVN checkout..." - rm -rf "$SVN_TEMP_DIR" - echo "✅ SVN status check complete" - - - name: Install SVN - if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - run: | - sudo apt-get update -y - sudo apt-get install -y subversion - svn --version - - - name: Deploy to WordPress.org Theme Repository - if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - env: - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - THEME_VERSION: ${{ env.PACKAGE_VERSION }} - THEME_SLUG: ${{ env.CONFIG_THEME_SLUG }} - BUILD_DIR: ${{ env.BUILD_DIR }} - run: | - bash .github/scripts/publish-theme-to-wordpress-org.sh - - - name: WordPress.org Deployment Status - if: ${{ inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true' }} - run: | - if [ "${{ inputs.dry_run }}" == "true" ]; then - echo "🧪 **WordPress.org SVN Dry Run Complete!**" - echo "" - echo "📋 **Validation Results:**" - echo " - SVN repository structure: ✅ Validated" - echo " - Theme files preparation: ✅ Validated" - echo " - File exclusions (build process): ✅ Applied correctly" - echo " - Version consistency: ✅ Verified" - echo " - WordPress.org compatibility: ✅ Confirmed" - echo "" - echo "🚀 **Ready for Production Deployment!**" - echo " - Re-run workflow with dry_run: false to deploy" - echo " - All validations passed successfully" - else - echo "🚀 **WordPress.org Theme Deployment Complete!**" - echo "" - echo "📦 **Deployment Details:**" - echo " - Theme: Hello Elementor" - echo " - Version: v${{ env.PACKAGE_VERSION }}" - echo " - SVN Repository: Updated" - echo " - Theme Directory: https://wordpress.org/themes/${{ env.CONFIG_THEME_SLUG }}/" - echo "" - echo "⏰ **Timeline:**" - echo " - SVN commit: Immediate ✅" - echo " - Theme directory update: 15-60 minutes ⏰" - echo " - WordPress admin visibility: 15-60 minutes ⏰" - echo "" - echo "✅ **Next Steps:**" - echo " - Monitor WordPress.org for theme availability" - echo " - Test installation from WordPress admin" - echo " - Update support documentation if needed" - fi - - # Repository maintenance - only for actual releases - - name: Create PR With Bumped Version - if: ${{ inputs.dry_run == false && inputs.version_type != 'current' }} - uses: ./.github/actions/create-pr-with-bumped-theme-version-release - with: - base_branch: ${{ inputs.release_branch }} - package_version: ${{ env.NEW_VERSION || env.CLEAN_PACKAGE_VERSION }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Update Main Branch Version - if: ${{ inputs.dry_run == false && inputs.version_type != 'current' }} - uses: ./.github/actions/update-main-branch-version-release - with: - new_version: ${{ env.NEW_VERSION }} - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Send Slack Notification (Dry Run) - if: ${{ inputs.dry_run == true && inputs.deploy_to_wporg == true }} - run: | - echo "🧪 DRY RUN: Would send Slack notification" - echo " - Channel: ${{ inputs.slack_channel }}" - echo " - Version: v${{ env.PACKAGE_VERSION }}" - echo " - Message: Release preparation complete (DRY RUN)" - - - name: Slack Notification Skipped - if: ${{ inputs.deploy_to_wporg == false }} - run: | - echo "📢 Slack notification skipped (deploy_to_wporg: false)" - echo " - Only WordPress.org deployments trigger Slack notifications" - - - name: Send Slack Notification (Actual) - if: ${{ inputs.dry_run == false && inputs.deploy_to_wporg == true }} - uses: ./.github/actions/theme-slack-notification-release - with: - CLOUD_SLACK_BOT_TOKEN: ${{ secrets.CLOUD_SLACK_BOT_TOKEN }} - PACKAGE_VERSION: ${{ env.PACKAGE_VERSION }} - BUILD_ZIP_PATH: ${{ env.BUILD_ZIP_PATH }} - GITHUB_RELEASE_URL: ${{ env.RELEASE_URL }} - SLACK_CHANNEL: ${{ inputs.slack_channel }} - WPORG_DEPLOYMENT_STATUS: ${{ (inputs.deploy_to_wporg == true && env.AUTO_DEPLOY_ENABLED == 'true') && 'deployed' || 'skipped' }} - - - name: Deployment Summary - run: | - if [ "${{ inputs.dry_run }}" == "true" ]; then - echo "🧪 **AUTOMATED RELEASE DRY RUN COMPLETE!**" - echo "" - echo "📋 **This was a test run - no actual release was created**" - echo "" - echo "🔍 **What would have happened:**" - echo "1. Version would be bumped to: v${{ env.PACKAGE_VERSION }}" - echo "2. Theme would be built: ${{ env.BUILD_ZIP_PATH }}" - echo "3. GitHub release would be created: ${{ env.RELEASE_URL }}" - echo "4. Slack notification would be sent to ${{ inputs.slack_channel }}" - if [ "${{ inputs.deploy_to_wporg }}" == "true" ] && [ "${{ env.AUTO_DEPLOY_ENABLED }}" == "true" ]; then - echo "5. WordPress.org SVN deployment would be executed" - echo " - Theme deployed to WordPress.org theme repository" - echo " - SVN trunk and tags updated automatically" - echo " - Manual upload process eliminated! 🎉" - elif [ "${{ inputs.deploy_to_wporg }}" == "false" ]; then - echo "5. WordPress.org deployment: ⚠️ Skipped (deploy_to_wporg: false)" - else - echo "5. WordPress.org deployment: ⚠️ Disabled in config (auto_deploy: false)" - fi - echo "" - echo "✅ **Dry run validation passed - ready for actual release!**" - echo " - Re-run this workflow with dry_run: false" - else - echo "🚀 **AUTOMATED RELEASE DEPLOYMENT COMPLETE!**" - echo "" - echo "📦 **Release Details:**" - echo " - Theme: Hello Elementor v${{ env.PACKAGE_VERSION }}" - echo " - GitHub Release: ${{ env.RELEASE_URL }}" - echo " - Build Package: ${{ env.BUILD_ZIP_PATH }}" - if [ "${{ inputs.deploy_to_wporg }}" == "true" ] && [ "${{ env.AUTO_DEPLOY_ENABLED }}" == "true" ]; then - echo " - WordPress.org: ✅ Automatically deployed" - echo " - Theme Directory: https://wordpress.org/themes/${{ env.CONFIG_THEME_SLUG }}/" - echo " - Manual upload: ❌ No longer required!" - elif [ "${{ inputs.deploy_to_wporg }}" == "false" ]; then - echo " - WordPress.org: ⚠️ Skipped (deploy_to_wporg: false)" - else - echo " - WordPress.org: ⚠️ Disabled in config" - fi - echo "" - echo "✅ **Next Steps:**" - if [ "${{ inputs.deploy_to_wporg }}" == "true" ] && [ "${{ env.AUTO_DEPLOY_ENABLED }}" == "true" ]; then - echo " - Monitor WordPress.org theme directory (15-60 minutes)" - echo " - Test theme installation from WordPress admin" - fi - echo " - Update documentation and announce release" - echo " - Celebrate the automated deployment! 🎊" - fi - - # Error recovery - - name: Cleanup on Error - if: ${{ always() && !inputs.dry_run && failure() }} - run: | - echo "🧹 Workflow failed - restoring to original state..." - - if ! git diff --quiet; then - echo "⚠️ Found modified files, restoring original versions..." - git checkout -- package.json functions.php style.css readme.txt 2>/dev/null || true - echo "✅ Files restored to original state" - else - echo "ℹ️ Working directory already clean" - fi - - rm -f temp-changelog-from-readme.txt 2>/dev/null || true - rm -f *.bak 2>/dev/null || true - - echo "🔍 Final state check:" - git status --porcelain || true - From 9e9b756ec1d12a8c935d3a37a96eefe83b33ac09 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:00:33 +0200 Subject: [PATCH 23/43] Test new deployment --- functions.php | 2 +- package.json | 2 +- readme.txt | 3 +++ style.css | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/functions.php b/functions.php index f9bfe47b..ba14b6ba 100644 --- a/functions.php +++ b/functions.php @@ -9,7 +9,7 @@ exit; // Exit if accessed directly. } -define( 'HELLO_ELEMENTOR_VERSION', '3.4.5' ); +define( 'HELLO_ELEMENTOR_VERSION', '3.4.6' ); define( 'EHP_THEME_SLUG', 'hello-elementor' ); define( 'HELLO_THEME_PATH', get_template_directory() ); diff --git a/package.json b/package.json index 4a4a21ee..5a39f75a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "slug": "elementor-hello-theme", "homepage": "https://elementor.com/", "description": "A sample theme for Elementor.", - "version": "3.4.5", + "version": "3.4.6", "last_beta_version": "2.4.0-beta3", "scripts": { "start": "wp-scripts start", diff --git a/readme.txt b/readme.txt index a571a150..7a6c0476 100644 --- a/readme.txt +++ b/readme.txt @@ -36,6 +36,9 @@ Source: https://stocksnap.io/photo/4B83RD7BV9 == Changelog == += 3.4.6 - 2025-12-1 +* Tweak: Test 3.4.6 deployment + = 3.4.5 - 2025-10-27 * New: Add theme home to Finder * Tweak: Improve banner behavior after clicking on action button diff --git a/style.css b/style.css index b3e1b59d..0dd763d3 100644 --- a/style.css +++ b/style.css @@ -4,8 +4,8 @@ Description: Hello Elementor is a lightweight and minimalist WordPress theme that was built specifically to work seamlessly with the Elementor site builder plugin. The theme is free, open-source, and designed for users who want a flexible, easy-to-use, and customizable website. The theme, which is optimized for performance, provides a solid foundation for users to build their own unique designs using the Elementor drag-and-drop site builder. Its simplicity and flexibility make it a great choice for both beginners and experienced Web Creators. Author: Elementor Team Author URI: https://elementor.com/?utm_source=wp-themes&utm_campaign=author-uri&utm_medium=wp-dash - Version: 3.4.5 - Stable tag: 3.4.5 + Version: 3.4.6 + Stable tag: 3.4.6 Requires at least: 6.0 Tested up to: 6.8 Requires PHP: 7.4 From 2edd533b8395916c851c8cdf665d71309fe7c42a Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:14:18 +0200 Subject: [PATCH 24/43] Fix workflow --- .../publish-theme-to-wordpress-org-dry-run.sh | 21 ++++++++++++++++--- .../scripts/publish-theme-to-wordpress-org.sh | 11 ++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index 210cf108..d3ae7306 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -53,6 +53,17 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" +if [ ! -d "$THEME_PATH/hello-elementor" ]; then + echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" + echo "Current directory: $(pwd)" + echo "THEME_PATH: $THEME_PATH" + echo "Available files and directories:" + ls -la "$THEME_PATH" | head -30 + echo "" + echo "Checking for zip files that might need extraction:" + find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" + exit 1 +fi rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true echo "Preparing files for SVN" @@ -71,9 +82,13 @@ if [ -n "$SVN_STATUS" ]; then echo "$SVN_STATUS" echo "" echo "Summary:" - ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" || echo "0") - MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" || echo "0") - UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" || echo "0") + ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" 2>/dev/null || echo "0") + MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" 2>/dev/null || echo "0") + UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" 2>/dev/null || echo "0") + + ADDED_COUNT=${ADDED_COUNT:-0} + MODIFIED_COUNT=${MODIFIED_COUNT:-0} + UNTRACKED_COUNT=${UNTRACKED_COUNT:-0} echo "Added (A): $ADDED_COUNT files" if [ "$MODIFIED_COUNT" -gt 0 ]; then diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index e16c8399..26ef3524 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -52,6 +52,17 @@ svn add "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files" +if [ ! -d "$THEME_PATH/hello-elementor" ]; then + echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" + echo "Current directory: $(pwd)" + echo "THEME_PATH: $THEME_PATH" + echo "Available files and directories:" + ls -la "$THEME_PATH" | head -30 + echo "" + echo "Checking for zip files that might need extraction:" + find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" + exit 1 +fi rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true echo "Preparing files" From 0a5b1a24385083e3edda354eb77c6672f3bcda6f Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:32:10 +0200 Subject: [PATCH 25/43] wip --- .../publish-theme-to-wordpress-org-dry-run.sh | 30 ++++++++++++++++--- .../scripts/publish-theme-to-wordpress-org.sh | 30 ++++++++++++++++--- .github/workflows/deploy.yml | 16 ++++++++++ 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index d3ae7306..56f7a0a0 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -53,18 +53,40 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" -if [ ! -d "$THEME_PATH/hello-elementor" ]; then - echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" +BUILD_DIR="" +if [ -d "$THEME_PATH/hello-elementor" ]; then + BUILD_DIR="$THEME_PATH/hello-elementor" +elif [ -d "hello-elementor" ]; then + BUILD_DIR="hello-elementor" +else + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f | head -1) + if [ -n "$ZIP_FILE" ]; then + echo "Found zip file, extracting: $ZIP_FILE" + unzip -q "$ZIP_FILE" -d "$THEME_PATH" + if [ -d "$THEME_PATH/hello-elementor" ]; then + BUILD_DIR="$THEME_PATH/hello-elementor" + fi + fi +fi + +if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then + echo "ERROR: Build directory not found" echo "Current directory: $(pwd)" echo "THEME_PATH: $THEME_PATH" + echo "Searched locations:" + echo " - $THEME_PATH/hello-elementor" + echo " - hello-elementor" + echo "" echo "Available files and directories:" ls -la "$THEME_PATH" | head -30 echo "" - echo "Checking for zip files that might need extraction:" + echo "Checking for zip files:" find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" exit 1 fi -rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true + +echo "Using build directory: $BUILD_DIR" +rsync -ah --progress "$BUILD_DIR/"* . || rsync -ah --progress "$BUILD_DIR/." . || true echo "Preparing files for SVN" svn status 2>/dev/null || echo "" diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index 26ef3524..43ae9809 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -52,18 +52,40 @@ svn add "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files" -if [ ! -d "$THEME_PATH/hello-elementor" ]; then - echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" +BUILD_DIR="" +if [ -d "$THEME_PATH/hello-elementor" ]; then + BUILD_DIR="$THEME_PATH/hello-elementor" +elif [ -d "hello-elementor" ]; then + BUILD_DIR="hello-elementor" +else + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f | head -1) + if [ -n "$ZIP_FILE" ]; then + echo "Found zip file, extracting: $ZIP_FILE" + unzip -q "$ZIP_FILE" -d "$THEME_PATH" + if [ -d "$THEME_PATH/hello-elementor" ]; then + BUILD_DIR="$THEME_PATH/hello-elementor" + fi + fi +fi + +if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then + echo "ERROR: Build directory not found" echo "Current directory: $(pwd)" echo "THEME_PATH: $THEME_PATH" + echo "Searched locations:" + echo " - $THEME_PATH/hello-elementor" + echo " - hello-elementor" + echo "" echo "Available files and directories:" ls -la "$THEME_PATH" | head -30 echo "" - echo "Checking for zip files that might need extraction:" + echo "Checking for zip files:" find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" exit 1 fi -rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true + +echo "Using build directory: $BUILD_DIR" +rsync -ah --progress "$BUILD_DIR/"* . || rsync -ah --progress "$BUILD_DIR/." . || true echo "Preparing files" cd "$VERSION_DIR" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 95593f3b..265f4ed6 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,6 +32,22 @@ jobs: uses: actions/download-artifact@v4 with: name: hello-elementor + - name: Verify artifact structure + run: | + echo "Verifying artifact download..." + echo "Current directory: $(pwd)" + echo "Workspace contents:" + ls -la | head -20 + echo "" + if [ -d "hello-elementor" ]; then + echo "✅ hello-elementor directory found in workspace root" + ls -la hello-elementor | head -10 + elif [ -d "$GITHUB_WORKSPACE/hello-elementor" ]; then + echo "✅ hello-elementor directory found at workspace path" + else + echo "⚠️ hello-elementor directory not found, checking for zip files..." + find . -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" + fi - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From c270954e6fb00f24718f9dfc94ae8469a6b989bc Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:34:57 +0200 Subject: [PATCH 26/43] wip --- .github/workflows/deploy.yml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 265f4ed6..95593f3b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,22 +32,6 @@ jobs: uses: actions/download-artifact@v4 with: name: hello-elementor - - name: Verify artifact structure - run: | - echo "Verifying artifact download..." - echo "Current directory: $(pwd)" - echo "Workspace contents:" - ls -la | head -20 - echo "" - if [ -d "hello-elementor" ]; then - echo "✅ hello-elementor directory found in workspace root" - ls -la hello-elementor | head -10 - elif [ -d "$GITHUB_WORKSPACE/hello-elementor" ]; then - echo "✅ hello-elementor directory found at workspace path" - else - echo "⚠️ hello-elementor directory not found, checking for zip files..." - find . -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" - fi - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From e3a235d434df8cd8aa2f5fa34863356eb5b5de10 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:39:25 +0200 Subject: [PATCH 27/43] wip --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 95593f3b..0209b893 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,6 +32,7 @@ jobs: uses: actions/download-artifact@v4 with: name: hello-elementor + path: . - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From 7577b1577fbab1b280268ffc25ce4e2c03938704 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:42:54 +0200 Subject: [PATCH 28/43] wip --- .../publish-theme-to-wordpress-org-dry-run.sh | 19 ++++++++++++++++--- .../scripts/publish-theme-to-wordpress-org.sh | 19 ++++++++++++++++--- .github/workflows/deploy.yml | 1 - 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index 56f7a0a0..1318c661 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -59,12 +59,25 @@ if [ -d "$THEME_PATH/hello-elementor" ]; then elif [ -d "hello-elementor" ]; then BUILD_DIR="hello-elementor" else - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f | head -1) + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 -name "hello-elementor*.zip" -type f | head -1) if [ -n "$ZIP_FILE" ]; then echo "Found zip file, extracting: $ZIP_FILE" - unzip -q "$ZIP_FILE" -d "$THEME_PATH" - if [ -d "$THEME_PATH/hello-elementor" ]; then + TEMP_DIR=$(mktemp -d) + unzip -q "$ZIP_FILE" -d "$TEMP_DIR" + if [ -d "$TEMP_DIR/hello-elementor" ]; then + mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" BUILD_DIR="$THEME_PATH/hello-elementor" + elif [ -f "$TEMP_DIR/style.css" ] && [ -f "$TEMP_DIR/functions.php" ]; then + mkdir -p "$THEME_PATH/hello-elementor" + mv "$TEMP_DIR"/* "$THEME_PATH/hello-elementor/" 2>/dev/null || true + BUILD_DIR="$THEME_PATH/hello-elementor" + fi + rm -rf "$TEMP_DIR" + fi + if [ -z "$BUILD_DIR" ]; then + ARTIFACT_DIR=$(find "$THEME_PATH" -type d -name "hello-elementor" 2>/dev/null | head -1) + if [ -n "$ARTIFACT_DIR" ] && [ -f "$ARTIFACT_DIR/style.css" ]; then + BUILD_DIR="$ARTIFACT_DIR" fi fi fi diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index 43ae9809..c7f4dd9a 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -58,12 +58,25 @@ if [ -d "$THEME_PATH/hello-elementor" ]; then elif [ -d "hello-elementor" ]; then BUILD_DIR="hello-elementor" else - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f | head -1) + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 -name "hello-elementor*.zip" -type f | head -1) if [ -n "$ZIP_FILE" ]; then echo "Found zip file, extracting: $ZIP_FILE" - unzip -q "$ZIP_FILE" -d "$THEME_PATH" - if [ -d "$THEME_PATH/hello-elementor" ]; then + TEMP_DIR=$(mktemp -d) + unzip -q "$ZIP_FILE" -d "$TEMP_DIR" + if [ -d "$TEMP_DIR/hello-elementor" ]; then + mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" BUILD_DIR="$THEME_PATH/hello-elementor" + elif [ -f "$TEMP_DIR/style.css" ] && [ -f "$TEMP_DIR/functions.php" ]; then + mkdir -p "$THEME_PATH/hello-elementor" + mv "$TEMP_DIR"/* "$THEME_PATH/hello-elementor/" 2>/dev/null || true + BUILD_DIR="$THEME_PATH/hello-elementor" + fi + rm -rf "$TEMP_DIR" + fi + if [ -z "$BUILD_DIR" ]; then + ARTIFACT_DIR=$(find "$THEME_PATH" -type d -name "hello-elementor" 2>/dev/null | head -1) + if [ -n "$ARTIFACT_DIR" ] && [ -f "$ARTIFACT_DIR/style.css" ]; then + BUILD_DIR="$ARTIFACT_DIR" fi fi fi diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0209b893..95593f3b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,7 +32,6 @@ jobs: uses: actions/download-artifact@v4 with: name: hello-elementor - path: . - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From 1c8aa50b88e32060cc4499ec9c131a6dd20b5d59 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:49:58 +0200 Subject: [PATCH 29/43] debug --- .../publish-theme-to-wordpress-org-dry-run.sh | 70 +++++++++++++++++-- .../scripts/publish-theme-to-wordpress-org.sh | 70 +++++++++++++++++-- 2 files changed, 128 insertions(+), 12 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index 1318c661..01423b10 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -53,48 +53,106 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" +echo "DEBUG: Current directory: $(pwd)" +echo "DEBUG: THEME_PATH: $THEME_PATH" +echo "DEBUG: GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" +echo "" +echo "DEBUG: Checking workspace root structure:" +ls -la "$THEME_PATH" | head -20 +echo "" +echo "DEBUG: Searching for hello-elementor directory:" +find "$THEME_PATH" -maxdepth 3 -type d -name "hello-elementor" 2>/dev/null | head -10 || echo "No hello-elementor directories found" +echo "" +echo "DEBUG: Searching for zip files:" +find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -10 || echo "No zip files found" +echo "" +echo "DEBUG: Checking for style.css files (theme indicator):" +find "$THEME_PATH" -maxdepth 3 -name "style.css" -type f 2>/dev/null | head -10 || echo "No style.css files found" +echo "" +echo "DEBUG: Checking artifact download location (if exists):" +if [ -d "$THEME_PATH/hello-elementor" ]; then + echo "Found: $THEME_PATH/hello-elementor" + ls -la "$THEME_PATH/hello-elementor" | head -10 +elif [ -d "hello-elementor" ]; then + echo "Found: hello-elementor (relative)" + ls -la "hello-elementor" | head -10 +else + echo "hello-elementor directory not found in expected locations" +fi +echo "" + BUILD_DIR="" if [ -d "$THEME_PATH/hello-elementor" ]; then BUILD_DIR="$THEME_PATH/hello-elementor" + echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (absolute path)" elif [ -d "hello-elementor" ]; then BUILD_DIR="hello-elementor" + echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (relative path)" else - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 -name "hello-elementor*.zip" -type f | head -1) + echo "DEBUG: hello-elementor not found in standard locations, searching for zip files..." + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -1) if [ -n "$ZIP_FILE" ]; then - echo "Found zip file, extracting: $ZIP_FILE" + echo "DEBUG: Found zip file: $ZIP_FILE" TEMP_DIR=$(mktemp -d) + echo "DEBUG: Extracting to temp directory: $TEMP_DIR" unzip -q "$ZIP_FILE" -d "$TEMP_DIR" + echo "DEBUG: Temp directory contents after extraction:" + ls -la "$TEMP_DIR" | head -10 if [ -d "$TEMP_DIR/hello-elementor" ]; then + echo "DEBUG: Found hello-elementor directory in zip" mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" BUILD_DIR="$THEME_PATH/hello-elementor" elif [ -f "$TEMP_DIR/style.css" ] && [ -f "$TEMP_DIR/functions.php" ]; then + echo "DEBUG: Found theme files directly in zip root, creating hello-elementor directory" mkdir -p "$THEME_PATH/hello-elementor" mv "$TEMP_DIR"/* "$THEME_PATH/hello-elementor/" 2>/dev/null || true BUILD_DIR="$THEME_PATH/hello-elementor" + else + echo "DEBUG: Zip contents don't match expected structure" fi rm -rf "$TEMP_DIR" fi if [ -z "$BUILD_DIR" ]; then + echo "DEBUG: Searching recursively for hello-elementor directory..." ARTIFACT_DIR=$(find "$THEME_PATH" -type d -name "hello-elementor" 2>/dev/null | head -1) if [ -n "$ARTIFACT_DIR" ] && [ -f "$ARTIFACT_DIR/style.css" ]; then + echo "DEBUG: Found hello-elementor directory at: $ARTIFACT_DIR" BUILD_DIR="$ARTIFACT_DIR" + else + echo "DEBUG: No valid hello-elementor directory found recursively" fi fi fi if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then + echo "" echo "ERROR: Build directory not found" echo "Current directory: $(pwd)" echo "THEME_PATH: $THEME_PATH" + echo "BUILD_DIR: ${BUILD_DIR:-not set}" + echo "" echo "Searched locations:" echo " - $THEME_PATH/hello-elementor" echo " - hello-elementor" + echo " - Recursive search in $THEME_PATH" + echo "" + echo "DEBUG: Full workspace structure (first 50 items):" + find "$THEME_PATH" -maxdepth 2 -type d 2>/dev/null | head -50 + echo "" + echo "DEBUG: All files in workspace root:" + ls -la "$THEME_PATH" + echo "" + echo "DEBUG: Checking if artifact was downloaded at all:" + if [ -f "$THEME_PATH/.github/workflows/deploy.yml" ]; then + echo "Repository files present (checkout successful)" + else + echo "WARNING: Repository files not found - checkout may have failed" + fi echo "" - echo "Available files and directories:" - ls -la "$THEME_PATH" | head -30 + echo "DEBUG: Environment variables:" + echo " GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" + echo " THEME_PATH: $THEME_PATH" echo "" - echo "Checking for zip files:" - find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" exit 1 fi diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index c7f4dd9a..454b0150 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -52,48 +52,106 @@ svn add "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files" +echo "DEBUG: Current directory: $(pwd)" +echo "DEBUG: THEME_PATH: $THEME_PATH" +echo "DEBUG: GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" +echo "" +echo "DEBUG: Checking workspace root structure:" +ls -la "$THEME_PATH" | head -20 +echo "" +echo "DEBUG: Searching for hello-elementor directory:" +find "$THEME_PATH" -maxdepth 3 -type d -name "hello-elementor" 2>/dev/null | head -10 || echo "No hello-elementor directories found" +echo "" +echo "DEBUG: Searching for zip files:" +find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -10 || echo "No zip files found" +echo "" +echo "DEBUG: Checking for style.css files (theme indicator):" +find "$THEME_PATH" -maxdepth 3 -name "style.css" -type f 2>/dev/null | head -10 || echo "No style.css files found" +echo "" +echo "DEBUG: Checking artifact download location (if exists):" +if [ -d "$THEME_PATH/hello-elementor" ]; then + echo "Found: $THEME_PATH/hello-elementor" + ls -la "$THEME_PATH/hello-elementor" | head -10 +elif [ -d "hello-elementor" ]; then + echo "Found: hello-elementor (relative)" + ls -la "hello-elementor" | head -10 +else + echo "hello-elementor directory not found in expected locations" +fi +echo "" + BUILD_DIR="" if [ -d "$THEME_PATH/hello-elementor" ]; then BUILD_DIR="$THEME_PATH/hello-elementor" + echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (absolute path)" elif [ -d "hello-elementor" ]; then BUILD_DIR="hello-elementor" + echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (relative path)" else - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 -name "hello-elementor*.zip" -type f | head -1) + echo "DEBUG: hello-elementor not found in standard locations, searching for zip files..." + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -1) if [ -n "$ZIP_FILE" ]; then - echo "Found zip file, extracting: $ZIP_FILE" + echo "DEBUG: Found zip file: $ZIP_FILE" TEMP_DIR=$(mktemp -d) + echo "DEBUG: Extracting to temp directory: $TEMP_DIR" unzip -q "$ZIP_FILE" -d "$TEMP_DIR" + echo "DEBUG: Temp directory contents after extraction:" + ls -la "$TEMP_DIR" | head -10 if [ -d "$TEMP_DIR/hello-elementor" ]; then + echo "DEBUG: Found hello-elementor directory in zip" mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" BUILD_DIR="$THEME_PATH/hello-elementor" elif [ -f "$TEMP_DIR/style.css" ] && [ -f "$TEMP_DIR/functions.php" ]; then + echo "DEBUG: Found theme files directly in zip root, creating hello-elementor directory" mkdir -p "$THEME_PATH/hello-elementor" mv "$TEMP_DIR"/* "$THEME_PATH/hello-elementor/" 2>/dev/null || true BUILD_DIR="$THEME_PATH/hello-elementor" + else + echo "DEBUG: Zip contents don't match expected structure" fi rm -rf "$TEMP_DIR" fi if [ -z "$BUILD_DIR" ]; then + echo "DEBUG: Searching recursively for hello-elementor directory..." ARTIFACT_DIR=$(find "$THEME_PATH" -type d -name "hello-elementor" 2>/dev/null | head -1) if [ -n "$ARTIFACT_DIR" ] && [ -f "$ARTIFACT_DIR/style.css" ]; then + echo "DEBUG: Found hello-elementor directory at: $ARTIFACT_DIR" BUILD_DIR="$ARTIFACT_DIR" + else + echo "DEBUG: No valid hello-elementor directory found recursively" fi fi fi if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then + echo "" echo "ERROR: Build directory not found" echo "Current directory: $(pwd)" echo "THEME_PATH: $THEME_PATH" + echo "BUILD_DIR: ${BUILD_DIR:-not set}" + echo "" echo "Searched locations:" echo " - $THEME_PATH/hello-elementor" echo " - hello-elementor" + echo " - Recursive search in $THEME_PATH" + echo "" + echo "DEBUG: Full workspace structure (first 50 items):" + find "$THEME_PATH" -maxdepth 2 -type d 2>/dev/null | head -50 + echo "" + echo "DEBUG: All files in workspace root:" + ls -la "$THEME_PATH" + echo "" + echo "DEBUG: Checking if artifact was downloaded at all:" + if [ -f "$THEME_PATH/.github/workflows/deploy.yml" ]; then + echo "Repository files present (checkout successful)" + else + echo "WARNING: Repository files not found - checkout may have failed" + fi echo "" - echo "Available files and directories:" - ls -la "$THEME_PATH" | head -30 + echo "DEBUG: Environment variables:" + echo " GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" + echo " THEME_PATH: $THEME_PATH" echo "" - echo "Checking for zip files:" - find "$THEME_PATH" -maxdepth 1 -name "hello-elementor*.zip" -type f || echo "No zip files found" exit 1 fi From 4a7394e51140fa77855047a9414ea6a36db0dfae Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 15:58:33 +0200 Subject: [PATCH 30/43] wip --- .github/workflows/deploy.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 95593f3b..0fb44b05 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,10 +21,19 @@ jobs: deploy: needs: build + if: needs.build.result == 'success' runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 + - name: Check build job status + run: | + echo "Build job result: ${{ needs.build.result }}" + if [ "${{ needs.build.result }}" != "success" ]; then + echo "ERROR: Build job did not complete successfully. Result: ${{ needs.build.result }}" + echo "Build job may have been skipped due to conditional check." + exit 1 + fi - name: Preparing envs run: | echo "THEME_VERSION=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV From 78fbcee63b96947a50ffab806707d21e5e01f019 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 16:07:03 +0200 Subject: [PATCH 31/43] wip --- .github/workflows/deploy.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0fb44b05..1ac330dc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -38,9 +38,31 @@ jobs: run: | echo "THEME_VERSION=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV - name: Download Artifact + id: download-artifact uses: actions/download-artifact@v4 with: name: hello-elementor + continue-on-error: true + - name: Verify artifact download + run: | + echo "Artifact download exit code: ${{ steps.download-artifact.outcome }}" + echo "Current directory: $(pwd)" + echo "Workspace contents after download:" + ls -la | head -30 + echo "" + echo "Searching for hello-elementor:" + find . -maxdepth 2 -type d -name "hello-elementor" 2>/dev/null || echo "Not found" + echo "" + echo "Searching for zip files:" + find . -maxdepth 2 -name "hello-elementor*.zip" 2>/dev/null || echo "No zip files found" + if [ "${{ steps.download-artifact.outcome }}" != "success" ]; then + echo "ERROR: Artifact download failed or artifact not found" + echo "This usually means:" + echo " 1. Build job didn't run (check conditional)" + echo " 2. Build job ran but didn't create artifact" + echo " 3. Artifact name mismatch" + exit 1 + fi - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From 9b35394b309e17236e2d2fa257e47841d9a1c9c3 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 16:14:44 +0200 Subject: [PATCH 32/43] wip --- .github/workflows/deploy.yml | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1ac330dc..352b8fb2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -45,24 +45,37 @@ jobs: continue-on-error: true - name: Verify artifact download run: | - echo "Artifact download exit code: ${{ steps.download-artifact.outcome }}" + echo "Artifact download outcome: ${{ steps.download-artifact.outcome }}" echo "Current directory: $(pwd)" echo "Workspace contents after download:" ls -la | head -30 echo "" - echo "Searching for hello-elementor:" + echo "Searching for hello-elementor directory:" find . -maxdepth 2 -type d -name "hello-elementor" 2>/dev/null || echo "Not found" echo "" echo "Searching for zip files:" find . -maxdepth 2 -name "hello-elementor*.zip" 2>/dev/null || echo "No zip files found" + echo "" if [ "${{ steps.download-artifact.outcome }}" != "success" ]; then - echo "ERROR: Artifact download failed or artifact not found" - echo "This usually means:" - echo " 1. Build job didn't run (check conditional)" - echo " 2. Build job ran but didn't create artifact" - echo " 3. Artifact name mismatch" + echo "ERROR: Artifact download step failed" + echo "This usually means the artifact doesn't exist or wasn't created by the build job" + echo "Check the build job logs to verify the artifact was uploaded" + exit 1 + fi + if [ ! -d "hello-elementor" ] && [ ! -d "$GITHUB_WORKSPACE/hello-elementor" ]; then + echo "ERROR: Artifact download succeeded but hello-elementor directory not found" + echo "This means:" + echo " 1. Artifact was downloaded but is empty" + echo " 2. Artifact structure is different than expected" + echo " 3. Artifact was created but directory structure doesn't match" + echo "" + echo "Check build job logs to verify:" + echo " - npm run zip created hello-elementor directory" + echo " - Artifact upload step succeeded" + echo " - Artifact name matches: hello-elementor" exit 1 fi + echo "SUCCESS: hello-elementor directory found" - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From d39ca5a32262c45f824800f91ceb9c2925437c83 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 16:32:45 +0200 Subject: [PATCH 33/43] wip --- .github/workflows/build.yml | 2 +- .github/workflows/deploy.yml | 50 +++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55df4a20..62305404 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,5 +57,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: hello-elementor - path: hello-elementor + path: hello-elementor-*.zip retention-days: 7 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 352b8fb2..20de8d92 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -43,39 +43,41 @@ jobs: with: name: hello-elementor continue-on-error: true - - name: Verify artifact download + - name: Extract artifact run: | echo "Artifact download outcome: ${{ steps.download-artifact.outcome }}" + if [ "${{ steps.download-artifact.outcome }}" != "success" ]; then + echo "ERROR: Artifact download failed" + echo "Check the build job logs to verify the artifact was uploaded" + exit 1 + fi echo "Current directory: $(pwd)" echo "Workspace contents after download:" - ls -la | head -30 - echo "" - echo "Searching for hello-elementor directory:" - find . -maxdepth 2 -type d -name "hello-elementor" 2>/dev/null || echo "Not found" + ls -la echo "" - echo "Searching for zip files:" - find . -maxdepth 2 -name "hello-elementor*.zip" 2>/dev/null || echo "No zip files found" - echo "" - if [ "${{ steps.download-artifact.outcome }}" != "success" ]; then - echo "ERROR: Artifact download step failed" - echo "This usually means the artifact doesn't exist or wasn't created by the build job" - echo "Check the build job logs to verify the artifact was uploaded" + echo "Searching for zip file:" + HT_ZIP=$(find . -maxdepth 2 -name "hello-elementor-*.zip" -type f | head -1) + if [ -z "$HT_ZIP" ]; then + echo "ERROR: Zip file not found after artifact download" + echo "Available files:" + find . -maxdepth 2 -type f | head -20 exit 1 fi - if [ ! -d "hello-elementor" ] && [ ! -d "$GITHUB_WORKSPACE/hello-elementor" ]; then - echo "ERROR: Artifact download succeeded but hello-elementor directory not found" - echo "This means:" - echo " 1. Artifact was downloaded but is empty" - echo " 2. Artifact structure is different than expected" - echo " 3. Artifact was created but directory structure doesn't match" - echo "" - echo "Check build job logs to verify:" - echo " - npm run zip created hello-elementor directory" - echo " - Artifact upload step succeeded" - echo " - Artifact name matches: hello-elementor" + echo "Found zip file: $HT_ZIP" + echo "Extracting zip file..." + unzip -q "$HT_ZIP" -d . + echo "Extraction complete" + echo "" + echo "Verifying hello-elementor directory:" + if [ -d "hello-elementor" ]; then + echo "SUCCESS: hello-elementor directory found" + ls -la hello-elementor | head -10 + else + echo "ERROR: hello-elementor directory not found after extraction" + echo "Zip file contents:" + unzip -l "$HT_ZIP" | head -20 exit 1 fi - echo "SUCCESS: hello-elementor directory found" - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From 468106d1ae85c221a9910e556b40028a7a7427f9 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 16:37:33 +0200 Subject: [PATCH 34/43] wip --- .github/workflows/build.yml | 2 +- .github/workflows/deploy.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62305404..df5ac550 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,5 +57,5 @@ jobs: uses: actions/upload-artifact@v4 with: name: hello-elementor - path: hello-elementor-*.zip + path: hello-elementor.*.zip retention-days: 7 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 20de8d92..abd6b4ec 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -56,7 +56,7 @@ jobs: ls -la echo "" echo "Searching for zip file:" - HT_ZIP=$(find . -maxdepth 2 -name "hello-elementor-*.zip" -type f | head -1) + HT_ZIP=$(find . -maxdepth 2 -name "hello-elementor.*.zip" -type f | head -1) if [ -z "$HT_ZIP" ]; then echo "ERROR: Zip file not found after artifact download" echo "Available files:" From d68daf41b3c70d08271c659baca58c5dece69689 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 16:46:09 +0200 Subject: [PATCH 35/43] wip --- .../publish-theme-to-wordpress-org-dry-run.sh | 88 +------------------ .../scripts/publish-theme-to-wordpress-org.sh | 86 +----------------- .github/workflows/deploy.yml | 56 +++--------- 3 files changed, 18 insertions(+), 212 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index 01423b10..d56a068c 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -53,110 +53,28 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" -echo "DEBUG: Current directory: $(pwd)" -echo "DEBUG: THEME_PATH: $THEME_PATH" -echo "DEBUG: GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" -echo "" -echo "DEBUG: Checking workspace root structure:" -ls -la "$THEME_PATH" | head -20 -echo "" -echo "DEBUG: Searching for hello-elementor directory:" -find "$THEME_PATH" -maxdepth 3 -type d -name "hello-elementor" 2>/dev/null | head -10 || echo "No hello-elementor directories found" -echo "" -echo "DEBUG: Searching for zip files:" -find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -10 || echo "No zip files found" -echo "" -echo "DEBUG: Checking for style.css files (theme indicator):" -find "$THEME_PATH" -maxdepth 3 -name "style.css" -type f 2>/dev/null | head -10 || echo "No style.css files found" -echo "" -echo "DEBUG: Checking artifact download location (if exists):" -if [ -d "$THEME_PATH/hello-elementor" ]; then - echo "Found: $THEME_PATH/hello-elementor" - ls -la "$THEME_PATH/hello-elementor" | head -10 -elif [ -d "hello-elementor" ]; then - echo "Found: hello-elementor (relative)" - ls -la "hello-elementor" | head -10 -else - echo "hello-elementor directory not found in expected locations" -fi -echo "" - BUILD_DIR="" if [ -d "$THEME_PATH/hello-elementor" ]; then BUILD_DIR="$THEME_PATH/hello-elementor" - echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (absolute path)" elif [ -d "hello-elementor" ]; then BUILD_DIR="hello-elementor" - echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (relative path)" else - echo "DEBUG: hello-elementor not found in standard locations, searching for zip files..." - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -1) + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 \( -name "hello-elementor-*.zip" -o -name "hello-elementor.*.zip" \) -type f | head -1) if [ -n "$ZIP_FILE" ]; then - echo "DEBUG: Found zip file: $ZIP_FILE" TEMP_DIR=$(mktemp -d) - echo "DEBUG: Extracting to temp directory: $TEMP_DIR" unzip -q "$ZIP_FILE" -d "$TEMP_DIR" - echo "DEBUG: Temp directory contents after extraction:" - ls -la "$TEMP_DIR" | head -10 if [ -d "$TEMP_DIR/hello-elementor" ]; then - echo "DEBUG: Found hello-elementor directory in zip" mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" BUILD_DIR="$THEME_PATH/hello-elementor" - elif [ -f "$TEMP_DIR/style.css" ] && [ -f "$TEMP_DIR/functions.php" ]; then - echo "DEBUG: Found theme files directly in zip root, creating hello-elementor directory" - mkdir -p "$THEME_PATH/hello-elementor" - mv "$TEMP_DIR"/* "$THEME_PATH/hello-elementor/" 2>/dev/null || true - BUILD_DIR="$THEME_PATH/hello-elementor" - else - echo "DEBUG: Zip contents don't match expected structure" fi rm -rf "$TEMP_DIR" fi - if [ -z "$BUILD_DIR" ]; then - echo "DEBUG: Searching recursively for hello-elementor directory..." - ARTIFACT_DIR=$(find "$THEME_PATH" -type d -name "hello-elementor" 2>/dev/null | head -1) - if [ -n "$ARTIFACT_DIR" ] && [ -f "$ARTIFACT_DIR/style.css" ]; then - echo "DEBUG: Found hello-elementor directory at: $ARTIFACT_DIR" - BUILD_DIR="$ARTIFACT_DIR" - else - echo "DEBUG: No valid hello-elementor directory found recursively" - fi - fi fi if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then - echo "" - echo "ERROR: Build directory not found" - echo "Current directory: $(pwd)" - echo "THEME_PATH: $THEME_PATH" - echo "BUILD_DIR: ${BUILD_DIR:-not set}" - echo "" - echo "Searched locations:" - echo " - $THEME_PATH/hello-elementor" - echo " - hello-elementor" - echo " - Recursive search in $THEME_PATH" - echo "" - echo "DEBUG: Full workspace structure (first 50 items):" - find "$THEME_PATH" -maxdepth 2 -type d 2>/dev/null | head -50 - echo "" - echo "DEBUG: All files in workspace root:" - ls -la "$THEME_PATH" - echo "" - echo "DEBUG: Checking if artifact was downloaded at all:" - if [ -f "$THEME_PATH/.github/workflows/deploy.yml" ]; then - echo "Repository files present (checkout successful)" - else - echo "WARNING: Repository files not found - checkout may have failed" - fi - echo "" - echo "DEBUG: Environment variables:" - echo " GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" - echo " THEME_PATH: $THEME_PATH" - echo "" + echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" exit 1 fi - -echo "Using build directory: $BUILD_DIR" rsync -ah --progress "$BUILD_DIR/"* . || rsync -ah --progress "$BUILD_DIR/." . || true echo "Preparing files for SVN" @@ -167,7 +85,7 @@ echo "DRY RUN: Would add new files" svn status 2>/dev/null | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | sed 's|^| Would add: |' || true echo "" -echo "📊 **SVN Status Summary (what would be committed):**" +echo "SVN Status Summary (what would be committed):" echo "==========================================" SVN_STATUS=$(svn status 2>/dev/null || echo "") TOTAL_CHANGES=0 diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index 454b0150..2d8ca87c 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -52,110 +52,28 @@ svn add "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files" -echo "DEBUG: Current directory: $(pwd)" -echo "DEBUG: THEME_PATH: $THEME_PATH" -echo "DEBUG: GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" -echo "" -echo "DEBUG: Checking workspace root structure:" -ls -la "$THEME_PATH" | head -20 -echo "" -echo "DEBUG: Searching for hello-elementor directory:" -find "$THEME_PATH" -maxdepth 3 -type d -name "hello-elementor" 2>/dev/null | head -10 || echo "No hello-elementor directories found" -echo "" -echo "DEBUG: Searching for zip files:" -find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -10 || echo "No zip files found" -echo "" -echo "DEBUG: Checking for style.css files (theme indicator):" -find "$THEME_PATH" -maxdepth 3 -name "style.css" -type f 2>/dev/null | head -10 || echo "No style.css files found" -echo "" -echo "DEBUG: Checking artifact download location (if exists):" -if [ -d "$THEME_PATH/hello-elementor" ]; then - echo "Found: $THEME_PATH/hello-elementor" - ls -la "$THEME_PATH/hello-elementor" | head -10 -elif [ -d "hello-elementor" ]; then - echo "Found: hello-elementor (relative)" - ls -la "hello-elementor" | head -10 -else - echo "hello-elementor directory not found in expected locations" -fi -echo "" - BUILD_DIR="" if [ -d "$THEME_PATH/hello-elementor" ]; then BUILD_DIR="$THEME_PATH/hello-elementor" - echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (absolute path)" elif [ -d "hello-elementor" ]; then BUILD_DIR="hello-elementor" - echo "DEBUG: Using BUILD_DIR=$BUILD_DIR (relative path)" else - echo "DEBUG: hello-elementor not found in standard locations, searching for zip files..." - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 3 -name "hello-elementor*.zip" -type f 2>/dev/null | head -1) + ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 \( -name "hello-elementor-*.zip" -o -name "hello-elementor.*.zip" \) -type f | head -1) if [ -n "$ZIP_FILE" ]; then - echo "DEBUG: Found zip file: $ZIP_FILE" TEMP_DIR=$(mktemp -d) - echo "DEBUG: Extracting to temp directory: $TEMP_DIR" unzip -q "$ZIP_FILE" -d "$TEMP_DIR" - echo "DEBUG: Temp directory contents after extraction:" - ls -la "$TEMP_DIR" | head -10 if [ -d "$TEMP_DIR/hello-elementor" ]; then - echo "DEBUG: Found hello-elementor directory in zip" mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" BUILD_DIR="$THEME_PATH/hello-elementor" - elif [ -f "$TEMP_DIR/style.css" ] && [ -f "$TEMP_DIR/functions.php" ]; then - echo "DEBUG: Found theme files directly in zip root, creating hello-elementor directory" - mkdir -p "$THEME_PATH/hello-elementor" - mv "$TEMP_DIR"/* "$THEME_PATH/hello-elementor/" 2>/dev/null || true - BUILD_DIR="$THEME_PATH/hello-elementor" - else - echo "DEBUG: Zip contents don't match expected structure" fi rm -rf "$TEMP_DIR" fi - if [ -z "$BUILD_DIR" ]; then - echo "DEBUG: Searching recursively for hello-elementor directory..." - ARTIFACT_DIR=$(find "$THEME_PATH" -type d -name "hello-elementor" 2>/dev/null | head -1) - if [ -n "$ARTIFACT_DIR" ] && [ -f "$ARTIFACT_DIR/style.css" ]; then - echo "DEBUG: Found hello-elementor directory at: $ARTIFACT_DIR" - BUILD_DIR="$ARTIFACT_DIR" - else - echo "DEBUG: No valid hello-elementor directory found recursively" - fi - fi fi if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then - echo "" - echo "ERROR: Build directory not found" - echo "Current directory: $(pwd)" - echo "THEME_PATH: $THEME_PATH" - echo "BUILD_DIR: ${BUILD_DIR:-not set}" - echo "" - echo "Searched locations:" - echo " - $THEME_PATH/hello-elementor" - echo " - hello-elementor" - echo " - Recursive search in $THEME_PATH" - echo "" - echo "DEBUG: Full workspace structure (first 50 items):" - find "$THEME_PATH" -maxdepth 2 -type d 2>/dev/null | head -50 - echo "" - echo "DEBUG: All files in workspace root:" - ls -la "$THEME_PATH" - echo "" - echo "DEBUG: Checking if artifact was downloaded at all:" - if [ -f "$THEME_PATH/.github/workflows/deploy.yml" ]; then - echo "Repository files present (checkout successful)" - else - echo "WARNING: Repository files not found - checkout may have failed" - fi - echo "" - echo "DEBUG: Environment variables:" - echo " GITHUB_WORKSPACE: ${GITHUB_WORKSPACE:-not set}" - echo " THEME_PATH: $THEME_PATH" - echo "" + echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" exit 1 fi - -echo "Using build directory: $BUILD_DIR" rsync -ah --progress "$BUILD_DIR/"* . || rsync -ah --progress "$BUILD_DIR/." . || true echo "Preparing files" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index abd6b4ec..94078e11 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -26,57 +26,27 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Check build job status - run: | - echo "Build job result: ${{ needs.build.result }}" - if [ "${{ needs.build.result }}" != "success" ]; then - echo "ERROR: Build job did not complete successfully. Result: ${{ needs.build.result }}" - echo "Build job may have been skipped due to conditional check." - exit 1 - fi - name: Preparing envs run: | echo "THEME_VERSION=$(cat package.json | jq -r '.version')" >> $GITHUB_ENV - name: Download Artifact - id: download-artifact uses: actions/download-artifact@v4 with: name: hello-elementor - continue-on-error: true - - name: Extract artifact + - name: Extract Hello Theme build run: | - echo "Artifact download outcome: ${{ steps.download-artifact.outcome }}" - if [ "${{ steps.download-artifact.outcome }}" != "success" ]; then - echo "ERROR: Artifact download failed" - echo "Check the build job logs to verify the artifact was uploaded" - exit 1 - fi - echo "Current directory: $(pwd)" - echo "Workspace contents after download:" - ls -la - echo "" - echo "Searching for zip file:" - HT_ZIP=$(find . -maxdepth 2 -name "hello-elementor.*.zip" -type f | head -1) - if [ -z "$HT_ZIP" ]; then - echo "ERROR: Zip file not found after artifact download" - echo "Available files:" - find . -maxdepth 2 -type f | head -20 - exit 1 - fi - echo "Found zip file: $HT_ZIP" - echo "Extracting zip file..." - unzip -q "$HT_ZIP" -d . - echo "Extraction complete" - echo "" - echo "Verifying hello-elementor directory:" - if [ -d "hello-elementor" ]; then - echo "SUCCESS: hello-elementor directory found" - ls -la hello-elementor | head -10 - else - echo "ERROR: hello-elementor directory not found after extraction" - echo "Zip file contents:" - unzip -l "$HT_ZIP" | head -20 - exit 1 + HT_ZIP=$(find . -name "hello-elementor-*.zip" -o -name "hello-elementor.*.zip" -type f | head -1) + if [ -n "$HT_ZIP" ]; then + mkdir -p ./tmp + unzip -q "$HT_ZIP" -d ./tmp/ + if [ -d "./tmp/hello-elementor" ]; then + mv ./tmp/hello-elementor ./hello-elementor + elif [ -d "./tmp" ] && [ "$(ls -A ./tmp/)" ]; then + mkdir -p ./hello-elementor-temp + mv ./tmp/* ./hello-elementor-temp/ 2>/dev/null || true + mv ./hello-elementor-temp ./hello-elementor + fi + rm -rf ./tmp fi - name: Validate changelog env: From 3896631aef1462646343dfc0bb5d6ff9a952ca0e Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Mon, 1 Dec 2025 16:52:58 +0200 Subject: [PATCH 36/43] wip --- .../publish-theme-to-wordpress-org-dry-run.sh | 34 +++---------------- .../scripts/publish-theme-to-wordpress-org.sh | 24 +------------ .github/workflows/deploy.yml | 15 ++------ 3 files changed, 8 insertions(+), 65 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index d56a068c..6ef19d73 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -53,29 +53,7 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" -BUILD_DIR="" -if [ -d "$THEME_PATH/hello-elementor" ]; then - BUILD_DIR="$THEME_PATH/hello-elementor" -elif [ -d "hello-elementor" ]; then - BUILD_DIR="hello-elementor" -else - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 \( -name "hello-elementor-*.zip" -o -name "hello-elementor.*.zip" \) -type f | head -1) - if [ -n "$ZIP_FILE" ]; then - TEMP_DIR=$(mktemp -d) - unzip -q "$ZIP_FILE" -d "$TEMP_DIR" - if [ -d "$TEMP_DIR/hello-elementor" ]; then - mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" - BUILD_DIR="$THEME_PATH/hello-elementor" - fi - rm -rf "$TEMP_DIR" - fi -fi - -if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then - echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" - exit 1 -fi -rsync -ah --progress "$BUILD_DIR/"* . || rsync -ah --progress "$BUILD_DIR/." . || true +rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true echo "Preparing files for SVN" svn status 2>/dev/null || echo "" @@ -93,13 +71,9 @@ if [ -n "$SVN_STATUS" ]; then echo "$SVN_STATUS" echo "" echo "Summary:" - ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" 2>/dev/null || echo "0") - MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" 2>/dev/null || echo "0") - UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" 2>/dev/null || echo "0") - - ADDED_COUNT=${ADDED_COUNT:-0} - MODIFIED_COUNT=${MODIFIED_COUNT:-0} - UNTRACKED_COUNT=${UNTRACKED_COUNT:-0} + ADDED_COUNT=$(echo "$SVN_STATUS" | grep -c "^A" || echo "0") + MODIFIED_COUNT=$(echo "$SVN_STATUS" | grep -c "^M" || echo "0") + UNTRACKED_COUNT=$(echo "$SVN_STATUS" | grep -c "^?" || echo "0") echo "Added (A): $ADDED_COUNT files" if [ "$MODIFIED_COUNT" -gt 0 ]; then diff --git a/.github/scripts/publish-theme-to-wordpress-org.sh b/.github/scripts/publish-theme-to-wordpress-org.sh index 2d8ca87c..e16c8399 100755 --- a/.github/scripts/publish-theme-to-wordpress-org.sh +++ b/.github/scripts/publish-theme-to-wordpress-org.sh @@ -52,29 +52,7 @@ svn add "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files" -BUILD_DIR="" -if [ -d "$THEME_PATH/hello-elementor" ]; then - BUILD_DIR="$THEME_PATH/hello-elementor" -elif [ -d "hello-elementor" ]; then - BUILD_DIR="hello-elementor" -else - ZIP_FILE=$(find "$THEME_PATH" -maxdepth 2 \( -name "hello-elementor-*.zip" -o -name "hello-elementor.*.zip" \) -type f | head -1) - if [ -n "$ZIP_FILE" ]; then - TEMP_DIR=$(mktemp -d) - unzip -q "$ZIP_FILE" -d "$TEMP_DIR" - if [ -d "$TEMP_DIR/hello-elementor" ]; then - mv "$TEMP_DIR/hello-elementor" "$THEME_PATH/hello-elementor" - BUILD_DIR="$THEME_PATH/hello-elementor" - fi - rm -rf "$TEMP_DIR" - fi -fi - -if [ -z "$BUILD_DIR" ] || [ ! -d "$BUILD_DIR" ]; then - echo "ERROR: Build directory not found: $THEME_PATH/hello-elementor" - exit 1 -fi -rsync -ah --progress "$BUILD_DIR/"* . || rsync -ah --progress "$BUILD_DIR/." . || true +rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true echo "Preparing files" cd "$VERSION_DIR" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 94078e11..0991312c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -36,18 +36,9 @@ jobs: - name: Extract Hello Theme build run: | HT_ZIP=$(find . -name "hello-elementor-*.zip" -o -name "hello-elementor.*.zip" -type f | head -1) - if [ -n "$HT_ZIP" ]; then - mkdir -p ./tmp - unzip -q "$HT_ZIP" -d ./tmp/ - if [ -d "./tmp/hello-elementor" ]; then - mv ./tmp/hello-elementor ./hello-elementor - elif [ -d "./tmp" ] && [ "$(ls -A ./tmp/)" ]; then - mkdir -p ./hello-elementor-temp - mv ./tmp/* ./hello-elementor-temp/ 2>/dev/null || true - mv ./hello-elementor-temp ./hello-elementor - fi - rm -rf ./tmp - fi + unzip -q "$HT_ZIP" -d ./tmp/ + mv ./tmp/hello-elementor ./hello-elementor + rm -rf ./tmp - name: Validate changelog env: VERSION: ${{ env.THEME_VERSION }} From ad62a659f9dfec0b7e1dc90cb5e7638d7c942f33 Mon Sep 17 00:00:00 2001 From: Hein van Vlastuin Date: Tue, 2 Dec 2025 17:36:48 +0200 Subject: [PATCH 37/43] svn status --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index fe39ea27..eabb501d 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -55,6 +55,9 @@ cd "$VERSION_DIR" echo "Copy files from build directory" rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true +echo "Print SVN Status changes" +svn status + echo "Preparing files for SVN" SVN_STATUS=$(svn status 2>/dev/null | grep -v '^\?[ \t]*\.$' || echo "") From 98708c7f370a135c0d29e428dd547b4542a67621 Mon Sep 17 00:00:00 2001 From: Yakir Sitbon Date: Mon, 8 Dec 2025 13:41:07 +0200 Subject: [PATCH 38/43] Refactor publish script for WordPress theme Updated rsync command and added SVN delete and add commands. --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index eabb501d..30f2f951 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -53,7 +53,13 @@ mkdir -p "$VERSION_DIR" cd "$VERSION_DIR" echo "Copy files from build directory" -rsync -ah --progress "$THEME_PATH/hello-elementor/"* . || rsync -ah --progress "$THEME_PATH/hello-elementor/." . || true +rsync -ah --progress "$THEME_PATH/hello-elementor/"* . + +echo "svn delete" +svn status | grep -v '^.[ \t]*\\..*' | { grep '^!' || true; } | awk '{print $2}' | xargs -r svn delete; + +echo "svn add" +svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | xargs -r svn add; echo "Print SVN Status changes" svn status From 329f2a0cfcd3021c3d343721cf2e28a5977013e4 Mon Sep 17 00:00:00 2001 From: Yakir Sitbon Date: Mon, 8 Dec 2025 13:44:25 +0200 Subject: [PATCH 39/43] Fix formatting issues in publish-theme script --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index 30f2f951..a76a55b8 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -64,6 +64,8 @@ svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' echo "Print SVN Status changes" svn status + + echo "Preparing files for SVN" SVN_STATUS=$(svn status 2>/dev/null | grep -v '^\?[ \t]*\.$' || echo "") From 0fdc3c471bf9adc8952ec5f76c132d7e828a7660 Mon Sep 17 00:00:00 2001 From: Yakir Sitbon Date: Mon, 8 Dec 2025 13:44:49 +0200 Subject: [PATCH 40/43] Add pwd command to SVN publish script --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index a76a55b8..f666dbaf 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -64,7 +64,7 @@ svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' echo "Print SVN Status changes" svn status - +pwd echo "Preparing files for SVN" SVN_STATUS=$(svn status 2>/dev/null | grep -v '^\?[ \t]*\.$' || echo "") From b19b4acb10033b3a7819e8cf65e9a3a7d5ba8784 Mon Sep 17 00:00:00 2001 From: Yakir Sitbon Date: Mon, 8 Dec 2025 13:49:30 +0200 Subject: [PATCH 41/43] Refactor publish-theme script for better directory management Updated script to change directory handling and rsync command. --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index f666dbaf..a6f8ab0e 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -49,11 +49,13 @@ if [[ "$VERSION_EXISTS" == "true" ]]; then exit 0 fi -mkdir -p "$VERSION_DIR" -cd "$VERSION_DIR" +#mkdir -p "$VERSION_DIR" +#cd "$VERSION_DIR" echo "Copy files from build directory" -rsync -ah --progress "$THEME_PATH/hello-elementor/"* . +rsync -ah --progress "$THEME_PATH/hello-elementor/*" $VERSION_DIR + +cd "$VERSION_DIR" echo "svn delete" svn status | grep -v '^.[ \t]*\\..*' | { grep '^!' || true; } | awk '{print $2}' | xargs -r svn delete; From 919181a16aa7e1ae21503a62481091746923aefd Mon Sep 17 00:00:00 2001 From: Yakir Sitbon Date: Mon, 8 Dec 2025 13:52:10 +0200 Subject: [PATCH 42/43] Fix rsync command and clean up script Updated rsync command to copy files correctly and removed commented mkdir and cd commands. --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index a6f8ab0e..c41f7f56 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -49,11 +49,10 @@ if [[ "$VERSION_EXISTS" == "true" ]]; then exit 0 fi -#mkdir -p "$VERSION_DIR" -#cd "$VERSION_DIR" +mkdir -p "$VERSION_DIR" echo "Copy files from build directory" -rsync -ah --progress "$THEME_PATH/hello-elementor/*" $VERSION_DIR +rsync -ah --progress "$THEME_PATH/hello-elementor/"* $VERSION_DIR cd "$VERSION_DIR" From e82b8126d1a8aed5f826e0c7b4c8d379b0e7412b Mon Sep 17 00:00:00 2001 From: Manor Hazaz Date: Mon, 8 Dec 2025 13:12:40 +0000 Subject: [PATCH 43/43] Update publish-theme-to-wordpress-org-dry-run.sh --- .github/scripts/publish-theme-to-wordpress-org-dry-run.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh index c41f7f56..99904a02 100755 --- a/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh +++ b/.github/scripts/publish-theme-to-wordpress-org-dry-run.sh @@ -65,8 +65,6 @@ svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' echo "Print SVN Status changes" svn status -pwd - echo "Preparing files for SVN" SVN_STATUS=$(svn status 2>/dev/null | grep -v '^\?[ \t]*\.$' || echo "")