From 3f3af8c9ac915635a03bfa18bf48ff36b6552252 Mon Sep 17 00:00:00 2001 From: cubegao Date: Thu, 20 Aug 2026 09:35:09 +0800 Subject: [PATCH 1/2] fix: correct email validation regex pattern Fix the email validation function by correcting the regex escape pattern. The previous implementation used an escaped `$` in a raw string, which caused the regex to match a literal `$` character instead of the end-of-string anchor. Update the regex pattern to properly validate email formats. --- packages/genui/lib/src/catalog/basic_functions.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/genui/lib/src/catalog/basic_functions.dart b/packages/genui/lib/src/catalog/basic_functions.dart index be27861cc..2971bca8d 100644 --- a/packages/genui/lib/src/catalog/basic_functions.dart +++ b/packages/genui/lib/src/catalog/basic_functions.dart @@ -309,7 +309,7 @@ class EmailFunction extends SynchronousClientFunction { Object? executeSync(JsonMap args, ExecutionContext _) { final Object? value = args['value']; if (value is! String) return false; - final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+\$'); + final emailRegex = RegExp(r'^[^@]+@[^@]+\.[^@]+$'); return emailRegex.hasMatch(value); } } From 06e12c4f1f31686c29901809260bf9a466a0f355 Mon Sep 17 00:00:00 2001 From: cubegao Date: Thu, 20 Aug 2026 09:48:09 +0800 Subject: [PATCH 2/2] Add email validation tests to basic_functions_test --- .../test/catalog/basic_functions_test.dart | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/packages/genui/test/catalog/basic_functions_test.dart b/packages/genui/test/catalog/basic_functions_test.dart index 3410d947b..9b9aed45c 100644 --- a/packages/genui/test/catalog/basic_functions_test.dart +++ b/packages/genui/test/catalog/basic_functions_test.dart @@ -72,6 +72,29 @@ void main() { expect(await run(func, {'value': null}), 0); }); + test('email', () async { + final EmailFunction func = BasicFunctions.emailFunction; + + // Valid emails (Gmail) + expect(await run(func, {'value': 'zhangsan@gmail.com'}), isTrue); + expect(await run(func, {'value': 'a@gmail.c'}), isTrue); + expect(await run(func, {'value': 'first.last@gmail.com'}), isTrue); + expect(await run(func, {'value': 'user+tag@gmail.com'}), isTrue); + + // Invalid emails + expect(await run(func, {'value': ''}), isFalse); + expect(await run(func, {'value': 'plainaddress'}), isFalse); + expect(await run(func, {'value': '@gmail.com'}), isFalse); + expect(await run(func, {'value': 'no-domain@'}), isFalse); + expect(await run(func, {'value': 'no-tld@gmail'}), isFalse); + expect(await run(func, {'value': 'a@gmail@gmail.com'}), isFalse); + + // Non-string values return false + expect(await run(func, {'value': null}), isFalse); + expect(await run(func, {'value': 123}), isFalse); + expect(await run(func, {}), isFalse); + }); + test('and', () async { final AndFunction func = BasicFunctions.andFunction; expect(