Skip to content

Commit

Permalink
Synced Newspack Blocks: Update to 4.5.2 (#40636)
Browse files Browse the repository at this point in the history
* Sync newspack-blocks to 4.5.2

* Update script to auto-add textdomain to block.json

* Update script to detect potential ENT_COMPAT needs

* Script tweaks

* More script tweaks

* Add .phpcs.dir.xml via script

* Finish up 4.5.2 block sync

* Update baseline

* Update Phan baseline in script

* Commit changes from script

* Add ENT_COMPAT again

* Add changelog

* Add .phpcsignore

* Commit synced blocks with PHPCS lint disabled

* Allow one to resync current version

* Update eslint and phpcbf calls

* Commit less-linted JS/TS files

* Clean up paths

* Once again apply ENT_COMPAT changes

* Update README

* Update index.php version number via script

* Don't run Phan on synced files

* Remove Phan from README

* Simplify PHP textdomain fix

* Catch additional textdomain cases

* Adjust docs wording

Co-authored-by: Brad Jorsch <[email protected]>

* Remove `ENT_COMPAT` step

---------

Co-authored-by: Brad Jorsch <[email protected]>
  • Loading branch information
tbradsha and anomiex authored Dec 19, 2024
1 parent 338a296 commit 0e02080
Show file tree
Hide file tree
Showing 34 changed files with 729 additions and 738 deletions.
41 changes: 9 additions & 32 deletions projects/packages/jetpack-mu-wpcom/.phan/baseline.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,46 +9,31 @@
*/
return [
// # Issue statistics:
// PhanTypeMismatchArgument : 35+ occurrences
// PhanPluginDuplicateConditionalNullCoalescing : 20+ occurrences
// PhanUndeclaredClassMethod : 20+ occurrences
// PhanTypeMismatchArgument : 15+ occurrences
// PhanTypeMismatchArgumentProbablyReal : 15+ occurrences
// PhanTypeMismatchReturnProbablyReal : 10+ occurrences
// PhanUndeclaredFunction : 10+ occurrences
// PhanTypeMismatchReturn : 8 occurrences
// PhanUndeclaredConstant : 7 occurrences
// PhanTypeArraySuspiciousNullable : 6 occurrences
// PhanPluginDuplicateConditionalNullCoalescing : 8 occurrences
// PhanTypeMismatchReturn : 6 occurrences
// PhanUndeclaredClassMethod : 6 occurrences
// PhanNoopNew : 5 occurrences
// PhanParamTooMany : 4 occurrences
// PhanUnextractableAnnotationSuffix : 4 occurrences
// PhanDeprecatedProperty : 3 occurrences
// PhanPluginDuplicateExpressionAssignmentOperation : 3 occurrences
// PhanTypeMismatchArgumentInternal : 4 occurrences
// PhanTypeMismatchReturnProbablyReal : 4 occurrences
// PhanTypePossiblyInvalidDimOffset : 3 occurrences
// PhanTypeSuspiciousNonTraversableForeach : 3 occurrences
// PhanUndeclaredClassReference : 3 occurrences
// PhanUndeclaredGlobalVariable : 3 occurrences
// PhanEmptyFQSENInCallable : 2 occurrences
// PhanPluginMixedKeyNoKey : 2 occurrences
// PhanParamTooMany : 2 occurrences
// PhanTypeArraySuspicious : 2 occurrences
// PhanTypeMismatchArgumentInternal : 2 occurrences
// PhanTypeArraySuspiciousNullable : 2 occurrences
// PhanTypeMismatchDefault : 2 occurrences
// PhanTypeMissingReturn : 2 occurrences
// PhanUndeclaredFunction : 2 occurrences
// PhanDeprecatedFunction : 1 occurrence
// PhanImpossibleTypeComparison : 1 occurrence
// PhanNonClassMethodCall : 1 occurrence
// PhanNoopArrayAccess : 1 occurrence
// PhanPluginRedundantAssignment : 1 occurrence
// PhanPluginSimplifyExpressionBool : 1 occurrence
// PhanPossiblyUndeclaredVariable : 1 occurrence
// PhanRedefineFunction : 1 occurrence
// PhanRedundantCondition : 1 occurrence
// PhanTypeComparisonToArray : 1 occurrence
// PhanTypeInvalidLeftOperandOfBitwiseOp : 1 occurrence
// PhanTypeInvalidRightOperandOfBitwiseOp : 1 occurrence
// PhanTypeMismatchArgumentNullable : 1 occurrence
// PhanTypeMismatchArgumentNullableInternal : 1 occurrence
// PhanTypeMismatchDimFetch : 1 occurrence
// PhanTypeMismatchProperty : 1 occurrence
// PhanTypeMismatchReturnNullable : 1 occurrence
// PhanTypeNonVarPassByRef : 1 occurrence
// PhanTypeVoidArgument : 1 occurrence
Expand All @@ -68,14 +53,6 @@
'src/features/launchpad/launchpad.php' => ['PhanTypeArraySuspiciousNullable', 'PhanTypeMismatchArgument', 'PhanTypeMismatchReturn', 'PhanTypeMismatchReturnProbablyReal'],
'src/features/marketplace-products-updater/class-marketplace-products-updater.php' => ['PhanTypeMismatchDimFetch', 'PhanTypeMismatchReturn'],
'src/features/media/heif-support.php' => ['PhanPluginSimplifyExpressionBool'],
'src/features/newspack-blocks/synced-newspack-blocks/blocks/carousel/view.php' => ['PhanParamTooMany', 'PhanPluginDuplicateConditionalNullCoalescing', 'PhanPossiblyUndeclaredVariable', 'PhanTypeMismatchArgument', 'PhanTypeMismatchReturnProbablyReal'],
'src/features/newspack-blocks/synced-newspack-blocks/blocks/homepage-articles/class-wp-rest-newspack-articles-controller.php' => ['PhanTypeArraySuspiciousNullable'],
'src/features/newspack-blocks/synced-newspack-blocks/blocks/homepage-articles/templates/article.php' => ['PhanTypeMismatchArgument', 'PhanUndeclaredGlobalVariable'],
'src/features/newspack-blocks/synced-newspack-blocks/blocks/homepage-articles/templates/articles-list.php' => ['PhanUndeclaredGlobalVariable'],
'src/features/newspack-blocks/synced-newspack-blocks/blocks/homepage-articles/templates/articles-loop.php' => ['PhanUndeclaredGlobalVariable'],
'src/features/newspack-blocks/synced-newspack-blocks/blocks/homepage-articles/view.php' => ['PhanPluginDuplicateExpressionAssignmentOperation', 'PhanTypeArraySuspiciousNullable', 'PhanTypeMismatchArgumentNullableInternal', 'PhanTypeMismatchReturnProbablyReal', 'PhanUndeclaredClassMethod'],
'src/features/newspack-blocks/synced-newspack-blocks/class-newspack-blocks-api.php' => ['PhanParamTooMany', 'PhanTypeMismatchArgument', 'PhanTypeMismatchReturn', 'PhanTypeMismatchReturnProbablyReal', 'PhanUndeclaredClassMethod', 'PhanUndeclaredFunction', 'PhanUnextractableAnnotationSuffix'],
'src/features/newspack-blocks/synced-newspack-blocks/class-newspack-blocks.php' => ['PhanDeprecatedProperty', 'PhanPluginDuplicateConditionalNullCoalescing', 'PhanPluginDuplicateExpressionAssignmentOperation', 'PhanPluginMixedKeyNoKey', 'PhanPluginRedundantAssignment', 'PhanTypeInvalidLeftOperandOfBitwiseOp', 'PhanTypeInvalidRightOperandOfBitwiseOp', 'PhanTypeMismatchArgument', 'PhanTypeMismatchArgumentNullable', 'PhanTypeMismatchProperty', 'PhanTypeMismatchReturn', 'PhanTypeMismatchReturnProbablyReal', 'PhanTypeSuspiciousNonTraversableForeach', 'PhanUndeclaredClassMethod', 'PhanUndeclaredClassReference', 'PhanUndeclaredConstant', 'PhanUndeclaredFunction'],
'src/features/verbum-comments/class-verbum-comments.php' => ['PhanImpossibleTypeComparison', 'PhanNoopNew', 'PhanParamTooMany', 'PhanTypeMismatchArgumentProbablyReal', 'PhanUndeclaredFunction'],
'src/features/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-launchpad.php' => ['PhanPluginDuplicateConditionalNullCoalescing'],
'src/features/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-site-migration-migrate-guru-key.php' => ['PhanUndeclaredClassMethod'],
Expand Down
2 changes: 2 additions & 0 deletions projects/packages/jetpack-mu-wpcom/.phan/config.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
// This file breaks analysis, Phan gets lost recursing in trying to figure out some types.
// @todo Add type declarations so Phan won't have to do it itself. Or update to a modern less lib.
'src/features/custom-css/custom-css/preprocessors/lessc.inc.php',
// This is synced from the Newspack Blocks repo.
'src/features/newspack-blocks/synced-newspack-blocks/',
),
)
);
1 change: 1 addition & 0 deletions projects/packages/jetpack-mu-wpcom/.phpcsignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
src/features/newspack-blocks/synced-newspack-blocks
105 changes: 80 additions & 25 deletions projects/packages/jetpack-mu-wpcom/bin/sync-newspack-blocks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ fi

# pick up value considering that the argument
# has the --key=value shape.
key_value=$(echo ${1} | cut -d'=' -f 2)
key_value=$(echo "${1}" | cut -d'=' -f 2)
# Set mode depending on first argument
if [[ $1 =~ ^--release= ]]
then
Expand Down Expand Up @@ -44,15 +44,14 @@ then
echo --branch=master
echo "--nodemodules (to use defined in package.json)"
echo "--path=/path/to/newspack-blocks"
echo --release=v2.0.0
echo --release=v4.0.0
echo
echo You can find the latest release ID on https://github.com/Automattic/newspack-blocks/releases/latest
echo
exit 1
fi

TARGET=./src/features/newspack-blocks/synced-newspack-blocks
ENTRY=./src/features/newspack-blocks/index.php

if [[ ( "$MODE" != "path" ) && ( "$MODE" != "npm" ) ]];
then
Expand All @@ -62,20 +61,23 @@ then

if [[ "$CURRENT_VERSION" == "$NAME" ]]; then
echo "The current version $CURRENT_VERSION of the newspack-blocks is synced."
exit 0
read -rp "Do you want to proceed anyway? (y/N): " proceed
if [[ ! "$proceed" =~ ^[Yy]$ ]]; then
exit 0
fi
fi
fi

# make a temp directory
TEMP_DIR=`mktemp -d`
TEMP_DIR=$(mktemp -d)
CODE=$TEMP_DIR/code

# download zip file
echo Downloading $MODE $NAME into $TEMP_DIR
(cd $TEMP_DIR && curl -L --fail -s -O $URL)
echo "Downloading $MODE $NAME into $TEMP_DIR"
(cd "$TEMP_DIR" && curl -L --fail -s -O "$URL")

# handle download error
ZIPS=( $TEMP_DIR/*.zip )
ZIPS=( "$TEMP_DIR"/*.zip )
ZIP=${ZIPS[0]}
if [ ! -f "$ZIP" ]; then
echo "Tried to download $URL"
Expand All @@ -90,13 +92,13 @@ then
fi

# extract zip
echo Extracting into $CODE
mkdir -p $CODE
unzip -q $ZIP -d $CODE
echo "Extracting into $CODE"
mkdir -p "$CODE"
unzip -q "$ZIP" -d "$CODE"

# find the main file and use its directory as the root of our source dir
MAIN_FILE=`find $CODE -name "newspack-blocks.php"`
CODE=`dirname $MAIN_FILE`
MAIN_FILE=$(find "$CODE" -name "newspack-blocks.php")
CODE=$(dirname "$MAIN_FILE")

# handle unzip error
if [ ! -f "$CODE/newspack-blocks.php" ]; then
Expand Down Expand Up @@ -127,31 +129,84 @@ mkdir -p $TARGET/components
mkdir -p $TARGET/shared
mkdir -p $TARGET/types

# copy files and directories
NEW_VERSION=v`jq -r .version $CODE/package.json`
# Update Newspack Blocks version number in the package.
NEW_VERSION=v$(jq -r .version "$CODE"/package.json)
echo "$NEW_VERSION" > $TARGET/version.txt
cp $CODE/includes/class-newspack-blocks-api.php $TARGET/
cp $CODE/includes/class-newspack-blocks.php $TARGET/
cp -R $CODE/src/blocks/homepage-articles $TARGET/blocks/
cp -R $CODE/src/blocks/carousel $TARGET/blocks/
cp -R $CODE/src/shared $TARGET/
cp -R $CODE/src/components $TARGET/
sed -E -i.bak "s|^define\( 'NEWSPACK_BLOCKS__VERSION', '.*' \);$|define( 'NEWSPACK_BLOCKS__VERSION', '$NEW_VERSION' );|" "$TARGET"/../index.php
rm "$TARGET"/../index.php.bak

# copy files and directories
cp "$CODE"/includes/class-newspack-blocks-api.php $TARGET/
cp "$CODE"/includes/class-newspack-blocks.php $TARGET/
cp -R "$CODE"/src/blocks/homepage-articles $TARGET/blocks/
cp -R "$CODE"/src/blocks/carousel $TARGET/blocks/
cp -R "$CODE"/src/shared $TARGET/
cp -R "$CODE"/src/components $TARGET/

# Get Typescript working by copying the main type defs over.
cp $CODE/src/types/index.d.ts $TARGET/types/
cp "$CODE"/src/types/index.d.ts $TARGET/types/
# Function types need to be capitalized in our system. We only match " function"
# beginning with a space to avoid matching it as a substring. (Not perfect, but
# imperfections will be caught by CI with failing tsc, etc.)
sed "${sedi[@]}" -e "s| function| Function|g" "$TARGET/types/index.d.ts"

# Note: I would have used eslint-nibble, but it doesn't support autofixing via the CLI.
echo "Changing JS textdomain to match jetpack-mu-wpcom..."
pnpm [email protected] dlx eslint --no-ignore --rule '"@wordpress/i18n-text-domain":["error",{"allowedTextDomain":"jetpack-mu-wpcom"}]' --fix $TARGET > /dev/null
BASE=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../../../.. && pwd)
FULLTARGET="$PWD/$TARGET"

# Add a temporary single-rule eslint.config.mjs file.
cat > "$TARGET/eslint.config.mjs" <<EOF
import makeBaseConfig from 'jetpack-js-tools/eslintrc/base.mjs';
// This directory is copy-pasted from elsewhere, but we still need to run this one rule over it.
export default [
// Import base config, but no rules.
...makeBaseConfig( import.meta.url ).map( block => ( { ...block, rules: {} } ) ),
// Enable just this one rule.
{
rules: {
"@wordpress/i18n-text-domain": [ "error", { allowedTextDomain: "jetpack-mu-wpcom" } ],
}
},
];
EOF
( cd "$BASE" && pnpm run lint-file --no-inline-config --no-ignore --fix "$FULLTARGET" )
rm "$TARGET/eslint.config.mjs"

echo "Changing JS translation function call to avoid bad minification..."
pnpm --package=jscodeshift dlx jscodeshift -t ./bin/sync-newspack-blocks-formatter.js --extensions=js $TARGET

# Add temporary PHPCS config file.
PHPCSSTANDARDFILE="$TARGET/phpcs.tmp.xml"
cat > "$PHPCSSTANDARDFILE" <<EOF
<?xml version="1.0"?>
<ruleset>
<rule ref="Jetpack.Functions.I18n">
<properties>
<property name="text_domain" value="jetpack-mu-wpcom" />
</properties>
</rule>
<rule ref="WordPress.Utils.I18nTextDomainFixer">
<properties>
<property name="old_text_domain" type="array">
<element value="newspack-blocks" />
</property>
<property name="new_text_domain" value="jetpack-mu-wpcom" />
</properties>
</rule>
</ruleset>
EOF
echo "Changing PHP textdomain to match jetpack-mu-wpcom..."
../../../vendor/bin/phpcbf --standard=./.phpcs.dir.xml --filter=../../../vendor/automattic/jetpack-phpcs-filter/src/PhpcsFilter.php --runtime-set jetpack-filter-no-ignore -q $TARGET

"$BASE"/vendor/bin/phpcbf --standard="$PHPCSSTANDARDFILE" "$TARGET"
rm "$PHPCSSTANDARDFILE"

# Add textdomain to block.json
echo "Adding textdomain to all block.json files..."
for block_json_file in "$TARGET"/blocks/*/block.json; do
TMPFILE=$(mktemp)
jq --tab '. += {"textdomain": "jetpack-mu-wpcom"}' "$block_json_file" > "$TMPFILE"
mv "$TMPFILE" "$block_json_file"
done
echo Sync done.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Significance: minor
Type: changed

Newspack Blocks: Updated to version 4.5.2.
Original file line number Diff line number Diff line change
@@ -1,56 +1,56 @@
# Newspack Blocks

Some of the Newspack blocks were added to this repository in order to make it available to other parts of the FSE plugin, such as Starter Page Templates where these blocks will be used.
Some of the Newspack blocks were added to this repository so they would be available to other parts of the FSE plugin where these blocks will be used, such as Starter Page Templates.

## Block Posts Block

This block allows you to list your posts in various layouts and filter them by criteria like category, tag or author.

It originally comes from the [Newspack Blocks collection](https://github.com/automattic/newspack-blocks) and the block is still being developed there.
It originally comes from the [Newspack Blocks collection](https://github.com/automattic/newspack-blocks) and the block is still being developed there as the `homepage-articles` block.

## Post Carousel Block
## Carousel Block

This block allows you to create a carousel of post's featured images and filter them by criteria like category, tag or author.
This block allows you to create a carousel of post featured images and filter them by criteria (e.g. category, tag or author).

It originally comes from the [Newspack Blocks collection](https://github.com/automattic/newspack-blocks) and the block is still being developed there.
It originally comes from the [Newspack Blocks collection](https://github.com/automattic/newspack-blocks) and the block is still being developed there as the `carousel` block.

## Structure

```
index.php — main entry file, registers the blocks on backend
blog-posts-block-editor.min.js — assets for the blog-posts-block editor
blog-posts-block-view.min.js — assets for the blog-posts-block rendered on frontend
carousel-block-editor.min.js — assets for the carousel-block editor
carousel-block-view.min.js — assets for the carousel-block rendered on frontend
synced-newspack-blocks/** — source code synced from the Newspack Blocks repository, not tracked in Jetpack git repo
blog-posts/ — assets for the blog-posts block frontend and editor
carousel/ — assets for the carousel block frontend and editor
synced-newspack-blocks/ — source code synced from the Newspack Blocks repository
```

`blog-posts-block-editor.min.js`, `blog-posts-block-view.min.js`, `carousel-block-editor.min.js`, `carousel-block-view.min.js` and `index.php` are files written in order to bridge the parent plugin with the Newspack Blocks. It changes the block names to an `a8c/` namespace and does things like registering REST fields or styles and scripts. In these files we are free to do all those changes because they are not shared with Newspack and only live here in this repository.
Other than the `synced-newspack-blocks` directory, the above are files written in order to bridge the parent plugin with Newspack Blocks. They change the block names to an `a8c/` namespace and register REST fields, styles, and scripts. In these files we are free to make changes because they are not shared with Newspack and only live here in this repository.


### Synchronizing the code

You can see that `synced-newspack-blocks` is being synced with the Newspack Blocks repository. Please make all improvements and additions on the Newspack side. Please don't make any direct changes to files in this directory as the next synchronization will overwrite them. Synced files are not being tracked in git and they are always downloaded fresh using the sync script explained further in this document.
The `synced-newspack-blocks` is synced with the Newspack Blocks repository. *Please make all improvements and additions upstream in the Newspack Blocks repo. Do not make any direct changes to files in this directory, as the next synchronization will overwrite them.*

Once your changes land on the Newspack side, coordinate with the team (over issues/PRs) to [make a new release](https://github.com/Automattic/newspack-blocks/releases) and once you have the release ID, you can pull the code into here.
Once your changes land in the Newspack Blocks repo, coordinate with the team (over issues/PRs) to [make a new release](https://github.com/Automattic/newspack-blocks/releases). Once you have the release ID (e.g. `v4.0.0`, you start a sync.

While being in `projects/packages/jetpack-mu-wpcom` directory, you can run:
While in the `projects/packages/jetpack-mu-wpcom` directory, run the following:

```
pnpm run sync:newspack-blocks --release=<THE RELEASE ID>
```

This will pull the code from the release and integrate it into this repository. Please:
1. Review changes
2. Keep the PHPCS config if still necessary
3. Ensure [htmlentities uses ENT_COMPAT](https://github.com/Automattic/jetpack/pull/38873/commits/16f57e6f01b6eed98a19cd0299261ce5ac075b8e)
4. Update the phan baseline with `jetpack phan --update-baseline packages/jetpack-mu-wpcom`
4. Update `NEWSPACK_BLOCKS__VERSION` in [index.php](./index.php)
5. Ensure that the blocks `block.json` has `"textdomain": "jetpack-mu-wpcom"`
6. Commit.
This will pull the code from the release into this repository and perform the following tasks:
* Copies TypeScript types into place.
* Changes JS and PHP textdomain refs to `jetpack-mu-wpcom`.
* Adjusts JS translation function calls to avoid minification issues.
* Checks for potential places where `ENT_COMPAT` should be used.

Once the script has completed:
1. Ensure the changes shown match the changes in the release.
2. Commit.

### Local development

Sometimes, probably, you will need to sync the NHA code straight in your local environment. It means you will get working on both projects at the same time. For this situation, you'd like to reference the code source through the `path` bin script argument.
Sometimes, probably, you will need to sync the code straight in your local environment. It means you will get working on both projects at the same time. For this situation, you'd like to reference the code source through the `path` bin script argument.

```
pnpm run sync:newspack-blocks --path=/Absolute/path/of/newspack-blocks/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

define( 'NEWSPACK_BLOCKS__BLOCKS_DIRECTORY', Jetpack_Mu_Wpcom::BASE_DIR . 'build/' );
define( 'NEWSPACK_BLOCKS__PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
define( 'NEWSPACK_BLOCKS__VERSION', '4.0.1' );
define( 'NEWSPACK_BLOCKS__VERSION', 'v4.5.2' );

require_once __DIR__ . '/../../utils.php';
require_once __DIR__ . '/synced-newspack-blocks/class-newspack-blocks.php';
Expand Down

This file was deleted.

Loading

0 comments on commit 0e02080

Please sign in to comment.