Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions src/lib/get-wordpress-version-url.ts

This file was deleted.

102 changes: 102 additions & 0 deletions src/lib/tests/wordpress-version-utils.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import {
getWordPressVersionUrl,
isWordPressDevVersion,
isWordPressBetaVersion,
} from '../wordpress-version-utils';

describe( 'isWordPressDevVersion', () => {
test( 'should identify WordPress development versions', () => {
expect( isWordPressDevVersion( '6.8-beta2-59979' ) ).toBe( true );
expect( isWordPressDevVersion( '6.8-59979' ) ).toBe( true );
expect( isWordPressDevVersion( '6.8.3-59979' ) ).toBe( true );
expect( isWordPressDevVersion( '6.8-alpha1-12345' ) ).toBe( true );
expect( isWordPressDevVersion( '6.8-RC1-59979' ) ).toBe( true );
} );

test( 'should return false for regular WordPress versions', () => {
expect( isWordPressDevVersion( '6.2' ) ).toBe( false );
expect( isWordPressDevVersion( '6.2.1' ) ).toBe( false );
expect( isWordPressDevVersion( '6.3-beta1' ) ).toBe( false );
expect( isWordPressDevVersion( '6.3-RC1' ) ).toBe( false );
} );

test( 'should return false for invalid or empty versions', () => {
expect( isWordPressDevVersion( '' ) ).toBe( false );
expect( isWordPressDevVersion( 'latest' ) ).toBe( false );
expect( isWordPressDevVersion( '6.8-beta2' ) ).toBe( false );
expect( isWordPressDevVersion( '6.8-ABCD' ) ).toBe( false );
expect( isWordPressDevVersion( 'not-a-version' ) ).toBe( false );
} );
} );

describe( 'isWordPressBetaVersion', () => {
test( 'should identify beta and RC versions', () => {
// Beta versions
expect( isWordPressBetaVersion( '6.3-beta1' ) ).toBe( true );
expect( isWordPressBetaVersion( '6.3-beta2' ) ).toBe( true );
expect( isWordPressBetaVersion( '6.3.1-beta1' ) ).toBe( true );

// RC versions
expect( isWordPressBetaVersion( '6.3-RC1' ) ).toBe( true );
expect( isWordPressBetaVersion( '6.3-RC2' ) ).toBe( true );
expect( isWordPressBetaVersion( '6.3.1-RC1' ) ).toBe( true );

// Dev versions with beta/RC
expect( isWordPressBetaVersion( '6.8-beta2-59979' ) ).toBe( true );
expect( isWordPressBetaVersion( '6.8-RC1-59979' ) ).toBe( true );
} );

test( 'should return false for non-beta/RC versions', () => {
// Regular versions
expect( isWordPressBetaVersion( '6.2' ) ).toBe( false );
expect( isWordPressBetaVersion( '6.2.1' ) ).toBe( false );

// Alpha and other dev versions
expect( isWordPressBetaVersion( '6.8-alpha1-12345' ) ).toBe( false );
expect( isWordPressBetaVersion( '6.8-59979' ) ).toBe( false );
} );

test( 'should return false for invalid or empty versions', () => {
expect( isWordPressBetaVersion( '' ) ).toBe( false );
expect( isWordPressBetaVersion( 'latest' ) ).toBe( false );
expect( isWordPressBetaVersion( '6.8-ABCD' ) ).toBe( false );
expect( isWordPressBetaVersion( 'not-a-version' ) ).toBe( false );
} );
} );

describe( 'getWordPressVersionUrl', () => {
test( 'should return nightly build URL for development versions', () => {
expect( getWordPressVersionUrl( '6.8-59979' ) ).toBe(
'https://wordpress.org/nightly-builds/wordpress-latest.zip'
);
expect( getWordPressVersionUrl( '6.9-12345' ) ).toBe(
'https://wordpress.org/nightly-builds/wordpress-latest.zip'
);
expect( getWordPressVersionUrl( '6.8-beta3-600046' ) ).toBe(
'https://wordpress.org/nightly-builds/wordpress-latest.zip'
);
expect( getWordPressVersionUrl( '6.8-RC1-59979' ) ).toBe(
'https://wordpress.org/nightly-builds/wordpress-latest.zip'
);
} );

test( 'should return correct URL for normal versions', () => {
expect( getWordPressVersionUrl( '6.2' ) ).toBe( 'https://wordpress.org/wordpress-6.2.zip' );
expect( getWordPressVersionUrl( '6.2.1' ) ).toBe( 'https://wordpress.org/wordpress-6.2.1.zip' );
expect( getWordPressVersionUrl( '6.3-beta1' ) ).toBe(
'https://wordpress.org/wordpress-6.3-beta1.zip'
);
} );

test( 'should throw error for invalid versions', () => {
expect( () => getWordPressVersionUrl( 'invalid' ) ).toThrow(
'Unrecognized WordPress version. Please use "latest" or numeric versions such as "6.2", "6.0.1", "6.2-beta1", or "6.2-RC1"'
);
expect( () => getWordPressVersionUrl( '6.invalid' ) ).toThrow();
expect( () => getWordPressVersionUrl( '' ) ).toThrow();
} );

test( 'should use default version when none provided', () => {
expect( () => getWordPressVersionUrl() ).not.toThrow();
} );
} );
10 changes: 10 additions & 0 deletions src/lib/version-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,13 @@
export function isDevRelease( version: string ): boolean {
return /-dev\..*|-dev\d+/.test( version );
}

/**
* Checks if a version string represents a WordPress development version
* Matches patterns like "6.8-beta2-59979"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we sure the nightly version follows this pattern even when there are no betas?
I think we shouldn't mix functions that check Studio versions and WordPress versions.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice one!
I updated the check to allow for more scenarios, let me know what you think.
Also moved all WordPress version functions to a new lib file.

@sejas sejas Mar 20, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bcotrim , I don't see this change. Did you already push the commit?
BTW, the image of Edit Site in the description doesn't belong to the modal.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry I sent the comment before I wanted to.
It should be good to review now.

* @param version The version string to check
* @returns boolean indicating if this is a WordPress development version
*/
export function isWordPressDevVersion( version: string ): boolean {
return /^\d+\.\d+-[a-zA-Z0-9]+-\d+$/.test( version );
}
25 changes: 25 additions & 0 deletions src/lib/wordpress-version-utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { DEFAULT_WORDPRESS_VERSION } from 'vendor/wp-now/src/constants';
import { isValidWordPressVersion } from 'vendor/wp-now/src/wp-playground-wordpress/is-valid-wordpress-version';

export function isWordPressDevVersion( version: string ): boolean {
// Match nightly build patterns that end with a build number
// Examples: 6.8-alpha1-12345, 6.8-beta2-59979, 6.8-dev-12345, 6.8-59979
return /^\d+\.\d+(?:\.\d+)?(?:-[a-zA-Z0-9]+)*-\d+$/.test( version );
}

export function isWordPressBetaVersion( version: string ): boolean {
return version.includes( 'beta' ) || version.includes( 'RC' );
}

export function getWordPressVersionUrl( version = DEFAULT_WORDPRESS_VERSION ) {
if ( isWordPressDevVersion( version ) ) {
return 'https://wordpress.org/nightly-builds/wordpress-latest.zip';
}

if ( ! isValidWordPressVersion( version ) ) {
throw new Error(
'Unrecognized WordPress version. Please use "latest" or numeric versions such as "6.2", "6.0.1", "6.2-beta1", or "6.2-RC1"'
);
}
return `https://wordpress.org/wordpress-${ version }.zip`;
}
2 changes: 1 addition & 1 deletion src/modules/site-settings/edit-site-details.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { useOffline } from 'src/hooks/use-offline';
import { useSiteDetails } from 'src/hooks/use-site-details';
import { cx } from 'src/lib/cx';
import { getIpcApi } from 'src/lib/get-ipc-api';
import { getWordPressVersionUrl } from 'src/lib/get-wordpress-version-url';
import { getWordPressVersionUrl } from 'src/lib/wordpress-version-utils';
import { useRootSelector } from 'src/stores';
import { wordpressVersionsSelectors } from 'src/stores/wordpress-versions-slice';
import {
Expand Down
Loading