From 37b86913bd1ed0e5a141bf899fbc272eb205da2a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20de=20la=20Pen=CC=83a?=
Date: Fri, 30 Oct 2026 19:18:22 +0000
Subject: [PATCH 1/2] feat: Hide sensitive columns from find and replace
Ports this package's find-replace exclusion and its test from develop.
The tables and columns it names exist on this branch too.
Requires nails/module-find-replace dev-feature/pre-new-admin for the
exclusion interface in tests and static analysis.
Co-Authored-By: Claude Opus 5.5
---
composer.json | 1 +
src/FindReplace/Exclusion/Package.php | 31 ++++++++++++++
tests/FindReplace/Exclusion/PackageTest.php | 45 +++++++++++++++++++++
3 files changed, 77 insertions(+)
create mode 100644 src/FindReplace/Exclusion/Package.php
create mode 100644 tests/FindReplace/Exclusion/PackageTest.php
diff --git a/composer.json b/composer.json
index 287df5f..8cce577 100644
--- a/composer.json
+++ b/composer.json
@@ -35,6 +35,7 @@
"nails/module-redirect": "dev-feature/pre-new-admin"
},
"require-dev": {
+ "nails/module-find-replace": "dev-feature/pre-new-admin",
"phpunit/phpunit": "^12.0",
"phpstan/phpstan": "^2.0"
},
diff --git a/src/FindReplace/Exclusion/Package.php b/src/FindReplace/Exclusion/Package.php
new file mode 100644
index 0000000..01570ef
--- /dev/null
+++ b/src/FindReplace/Exclusion/Package.php
@@ -0,0 +1,31 @@
+hidden()
+ );
+ }
+
+ public function testReadOnly(): void
+ {
+ self::assertSame(
+ [
+ NAILS_DB_PREFIX . 'cms_page.draft_slug',
+ NAILS_DB_PREFIX . 'cms_page.draft_slug_end',
+ NAILS_DB_PREFIX . 'cms_page.published_slug',
+ NAILS_DB_PREFIX . 'cms_page.published_slug_end',
+ NAILS_DB_PREFIX . 'cms_page.draft_template',
+ NAILS_DB_PREFIX . 'cms_page.published_template',
+ NAILS_DB_PREFIX . 'cms_menu_item.url',
+ ],
+ (new Package())->readOnly()
+ );
+ }
+}
From 787fc10b5976ca0c47c02591a75ed1a221f628c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20de=20la=20Pen=CC=83a?=
Date: Fri, 30 Oct 2026 15:18:33 +0000
Subject: [PATCH 2/2] fix: Tighten CMS find-replace exclusions
- Remove cms_menu_item.url from readOnly() so menu URLs can be
updated when moving a domain or path.
- Add cms_page.draft_breadcrumbs and cms_page.published_breadcrumbs
to readOnly(); both are generated from parent page titles, so a
direct edit is overwritten or goes stale.
Co-Authored-By: Claude Sonnet 5
(cherry picked from commit 7ecfde56b5d78354a77c5e400ca607d448c788ee)
---
src/FindReplace/Exclusion/Package.php | 4 +++-
tests/FindReplace/Exclusion/PackageTest.php | 3 ++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/src/FindReplace/Exclusion/Package.php b/src/FindReplace/Exclusion/Package.php
index 01570ef..a7f1ff6 100644
--- a/src/FindReplace/Exclusion/Package.php
+++ b/src/FindReplace/Exclusion/Package.php
@@ -25,7 +25,9 @@ public function readOnly(): array
NAILS_DB_PREFIX . 'cms_page.published_slug_end',
NAILS_DB_PREFIX . 'cms_page.draft_template',
NAILS_DB_PREFIX . 'cms_page.published_template',
- NAILS_DB_PREFIX . 'cms_menu_item.url',
+ // Built from parent page titles; a direct edit is overwritten or goes stale.
+ NAILS_DB_PREFIX . 'cms_page.draft_breadcrumbs',
+ NAILS_DB_PREFIX . 'cms_page.published_breadcrumbs',
];
}
}
diff --git a/tests/FindReplace/Exclusion/PackageTest.php b/tests/FindReplace/Exclusion/PackageTest.php
index 4255e0e..bce3513 100644
--- a/tests/FindReplace/Exclusion/PackageTest.php
+++ b/tests/FindReplace/Exclusion/PackageTest.php
@@ -37,7 +37,8 @@ public function testReadOnly(): void
NAILS_DB_PREFIX . 'cms_page.published_slug_end',
NAILS_DB_PREFIX . 'cms_page.draft_template',
NAILS_DB_PREFIX . 'cms_page.published_template',
- NAILS_DB_PREFIX . 'cms_menu_item.url',
+ NAILS_DB_PREFIX . 'cms_page.draft_breadcrumbs',
+ NAILS_DB_PREFIX . 'cms_page.published_breadcrumbs',
],
(new Package())->readOnly()
);