@rachelallyson/hero-hook-form 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [2.8.0] - 2026-01-22
6
+
7
+ ### Added
8
+
9
+ - **Field Array Memory Leak Fixes**: Comprehensive solution for Cypress Electron renderer memory issues
10
+ - `FormFieldHelpers.conditionalFieldArray()` - Memory-safe conditional field arrays that prevent register/unregister cycles
11
+ - `alwaysRegistered` prop for `FieldArrayField` - Keeps fields registered but conditionally renders UI
12
+ - `useLazyFieldRegistration` and `useLazyFieldArrayRegistration` hooks - Lazy registration for better initial memory usage
13
+ - `fieldArrayMemory` utilities - Memory cleanup helpers with garbage collection hints
14
+ - Cypress memory optimizations - `experimentalMemoryManagement` and reduced memory retention
15
+
16
+ - **Performance Monitoring**: Enhanced field array performance tracking
17
+ - Memory usage monitoring for field array operations
18
+ - Performance metrics collection for long-running tests
19
+ - Garbage collection suggestions for memory-intensive operations
20
+
21
+ ### Fixed
22
+
23
+ - **Critical Bug Fix: Input Name Attributes**: Fixed missing `name` prop forwarding in `InputField` component
24
+ - `CoercedInput` now properly passes `name={field.name}` to HeroUI Input components
25
+ - Fixes accessibility issues where form inputs had no name attribute in DOM
26
+ - Critical for form automation tools, accessibility compliance, and proper form submission
27
+ - Affects all input types (text, email, password, tel, number, etc.) in ZodForm
28
+
29
+ ### Internal
30
+
31
+ - **Architecture Cleanup: Simplified HeroUI Integration**: Removed redundant dual-build system and `/react` subpath
32
+ - Eliminated duplicate `react/fields/` components and `tsconfig.react.json`
33
+ - Streamlined to single `#ui` alias approach that works with both individual `@heroui/*` packages and `@heroui/react`
34
+ - `@heroui/react` re-exports all components, making separate configurations unnecessary
35
+ - Cleaner codebase with same functionality and flexibility for users
36
+
37
+ ## [2.7.2] - 2026-01-21
38
+
39
+ ### Fixed
40
+
41
+ - **Critical Bug Fix: Input Name Attributes**: Fixed missing `name` prop forwarding in `InputField` component
42
+ - `CoercedInput` now properly passes `name={field.name}` to HeroUI Input components
43
+ - Fixes accessibility issues where form inputs had no name attribute in DOM
44
+ - Critical for form automation tools, accessibility compliance, and proper form submission
45
+ - Affects all input types (text, email, password, tel, number, etc.) in ZodForm
46
+
47
+ ### Internal
48
+
49
+ - **Architecture Cleanup: Simplified HeroUI Integration**: Removed redundant dual-build system and `/react` subpath
50
+ - Eliminated duplicate `react/fields/` components and `tsconfig.react.json`
51
+ - Streamlined to single `#ui` alias approach that works with both individual `@heroui/*` packages and `@heroui/react`
52
+ - `@heroui/react` re-exports all components, making separate configurations unnecessary
53
+ - Cleaner codebase with same functionality and flexibility for users
54
+
5
55
  ## [2.7.0] - 2026-01-13
6
56
 
7
57
  ### Added
@@ -1,80 +1,48 @@
1
- /**
2
- * TypeScript types for Cypress form testing helpers
3
- */
4
- interface FormFieldData {
5
- [key: string]: string | number | boolean | string[] | FileList | null;
6
- }
7
- interface FormFlowStep {
8
- /** Type of interaction */
9
- type: 'fill' | 'select' | 'check' | 'uncheck' | 'submit' | 'wait';
10
- /** Field identifier (label, type, placeholder, etc.) */
11
- field?: string;
12
- /** Value to set or option to select */
13
- value?: string | number | boolean;
14
- /** Expected result after step */
15
- expect?: string | boolean;
16
- /** Wait time in milliseconds */
17
- waitTime?: number;
18
- }
19
- interface FieldInteractionOptions {
20
- /** Whether to clear field before typing */
21
- clear?: boolean;
22
- /** Whether to use force click for dropdowns */
23
- force?: boolean;
24
- /** Whether to wait for field to be visible */
25
- waitForVisible?: boolean;
26
- /** Custom timeout for this interaction */
27
- timeout?: number;
28
- }
29
- interface CypressFormHelpers {
30
- fillInputByType: (type: string, value: string, index?: number) => Cypress.Chainable<Element>;
31
- fillInputByPlaceholder: (placeholder: string, value: string) => Cypress.Chainable<Element>;
32
- fillInputByLabel: (label: string, value: string) => Cypress.Chainable<Element>;
33
- fillTextarea: (value: string, index?: number) => Cypress.Chainable<Element>;
34
- selectDropdownOption: (optionValue: string, dropdownIndex?: number) => Cypress.Chainable<Element>;
35
- selectDropdownByLabel: (label: string, optionValue: string) => Cypress.Chainable<Element>;
36
- checkCheckbox: (index?: number) => Cypress.Chainable<Element>;
37
- checkCheckboxByLabel: (label: string) => Cypress.Chainable<Element>;
38
- checkSwitch: (index?: number) => Cypress.Chainable<Element>;
39
- uncheckCheckbox: (index?: number) => Cypress.Chainable<Element>;
40
- uncheckSwitch: (index?: number) => Cypress.Chainable<Element>;
41
- moveSlider: (value: number, index?: number) => Cypress.Chainable<Element>;
42
- expectValidationError: (message: string) => Cypress.Chainable<Element>;
43
- expectNoValidationErrors: () => Cypress.Chainable<Element>;
44
- expectFieldError: (fieldLabel: string, errorMessage: string) => Cypress.Chainable<Element>;
45
- expectFieldValid: (fieldLabel: string) => Cypress.Chainable<Element>;
46
- triggerValidation: (submitButton?: boolean) => Cypress.Chainable<Element>;
47
- submitForm: () => Cypress.Chainable<Element>;
48
- submitAndExpectSuccess: (successIndicator?: string) => Cypress.Chainable<Element>;
49
- submitAndExpectErrors: () => Cypress.Chainable<Element>;
50
- resetForm: () => Cypress.Chainable<Element>;
51
- interceptFormSubmission: (method: string, url: string, alias: string) => Cypress.Chainable<Element>;
52
- verifyFormExists: () => Cypress.Chainable<Element>;
53
- verifyFieldExists: (selector: string) => Cypress.Chainable<Element>;
54
- verifyFieldValue: (selector: string, value: string) => Cypress.Chainable<Element>;
55
- verifyFieldCount: (selector: string, count: number) => Cypress.Chainable<Element>;
56
- getFormData: () => Cypress.Chainable<FormFieldData>;
57
- fillCompleteForm: (formData: FormFieldData) => Cypress.Chainable<Element>;
58
- testFieldInteraction: (fieldType: string, value: string) => Cypress.Chainable<Element>;
59
- testFormFlow: (steps: FormFlowStep[]) => Cypress.Chainable<Element>;
60
- }
61
- declare global {
62
- namespace Cypress {
63
- interface Chainable extends CypressFormHelpers {
64
- }
65
- }
66
- }
67
-
68
1
  /**
69
2
  * TypeScript declarations for Cypress form testing helpers
70
3
  */
71
4
 
5
+ import type { FormFieldData, FormFlowStep, FieldInteractionOptions } from './types';
6
+
7
+ // Re-export types and helpers
8
+ export * from './types';
9
+ export * from './utils';
10
+ export * from './helpers';
11
+
12
+ // Export the main registration function
13
+ export function registerHeroFormCommands(): void;
72
14
 
15
+ // Export constants
16
+ export const SETUP_INSTRUCTIONS: {
17
+ installation: string;
18
+ import: string;
19
+ usage: string;
20
+ };
73
21
 
22
+ export const COMMANDS_REFERENCE: {
23
+ fieldInteractions: string[];
24
+ validation: string[];
25
+ submission: string[];
26
+ state: string[];
27
+ complex: string[];
28
+ convenience: string[];
29
+ debug: string[];
30
+ };
31
+
32
+ // Global type augmentations for Cypress
74
33
  declare global {
75
34
  namespace Cypress {
76
35
  interface Chainable {
77
- // Field Interaction Helpers
36
+ // Field Interaction Helpers - Name-based (recommended, most reliable)
37
+ fillInputByName(name: string, value: string, options?: FieldInteractionOptions): Chainable<Element>;
38
+ fillTextareaByName(name: string, value: string, options?: FieldInteractionOptions): Chainable<Element>;
39
+ selectDropdownByName(name: string, optionValue: string): Chainable<Element>;
40
+ checkCheckboxByName(name: string): Chainable<Element>;
41
+ checkSwitchByName(name: string): Chainable<Element>;
42
+ uncheckCheckboxByName(name: string): Chainable<Element>;
43
+ uncheckSwitchByName(name: string): Chainable<Element>;
44
+
45
+ // Field Interaction Helpers - Legacy methods (still supported)
78
46
  fillInputByType(type: string, value: string, index?: number, options?: FieldInteractionOptions): Chainable<Element>;
79
47
  fillInputByPlaceholder(placeholder: string, value: string, options?: FieldInteractionOptions): Chainable<Element>;
80
48
  fillInputByLabel(label: string, value: string, options?: FieldInteractionOptions): Chainable<Element>;
@@ -87,6 +55,12 @@ declare global {
87
55
  uncheckCheckbox(index?: number): Chainable<Element>;
88
56
  uncheckSwitch(index?: number): Chainable<Element>;
89
57
  moveSlider(value: number, index?: number): Chainable<Element>;
58
+ moveSliderByName(name: string, value: number): Chainable<Element>;
59
+ selectRadioByName(name: string, value: string): Chainable<Element>;
60
+ checkCheckboxInGroupByName(name: string, index?: number): Chainable<Element>;
61
+ selectAutocompleteByName(name: string, optionValue: string): Chainable<Element>;
62
+ fillDateInputByName(name: string): Chainable<Element>;
63
+ selectFileByName(name: string, filePath: string): Chainable<Element>;
90
64
 
91
65
  // Validation & Error Testing Helpers
92
66
  expectValidationError(message: string): Chainable<Element>;
@@ -104,14 +78,15 @@ declare global {
104
78
  // Form Submission Helpers
105
79
  submitForm(): Chainable<Element>;
106
80
  submitAndExpectSuccess(successIndicator?: string): Chainable<Element>;
107
- submitAndExpectErrors(): Chainable<Element>;
81
+ submitAndExpectErrors(errorMessage?: string, formIndex?: number): Chainable<Element>;
108
82
  resetForm(): Chainable<Element>;
109
83
  interceptFormSubmission(method: string, url: string, alias: string): Chainable<Element>;
110
84
 
111
85
  // Form State Helpers
112
86
  verifyFormExists(): Chainable<Element>;
113
87
  verifyFieldExists(selector: string): Chainable<Element>;
114
- verifyFieldValue(selector: string, value: string): Chainable<Element>;
88
+ verifyFieldValueByName(name: string, value: string): Chainable<Element>;
89
+ verifyFieldValue(type: string, value: string, index?: number): Chainable<Element>;
115
90
  verifyFieldCount(selector: string, count: number): Chainable<Element>;
116
91
  getFormData(): Chainable<FormFieldData>;
117
92
 
@@ -132,10 +107,26 @@ declare global {
132
107
 
133
108
  // Debug commands
134
109
  logFormState(): Chainable<Element>;
135
- waitForFormReady(): Chainable<Element>;
110
+ waitForFormReady(timeout?: number): Chainable<JQuery<HTMLElement>>;
136
111
  clearForm(): Chainable<Element>;
137
112
  verifyFormValid(): Chainable<Element>;
138
113
  screenshotForm(name?: string): Chainable<Element>;
114
+
115
+ // Utility Helpers (for better form testing)
116
+ waitForReactUpdate(timeout?: number): Chainable<void>;
117
+ waitForElementState(selector: string, state: 'visible' | 'hidden' | 'enabled' | 'disabled' | 'exist', timeout?: number): Chainable<JQuery<HTMLElement>>;
118
+ waitForDropdownOpen(timeout?: number): Chainable<JQuery<HTMLElement>>;
119
+ waitForDropdownClose(buttonSelector?: string, timeout?: number): Chainable<JQuery<HTMLElement>>;
120
+ getFormDataValue(fieldName: string): Chainable<string | File | null>;
121
+ verifyFormDataValue(fieldName: string, expectedValue: string | number, timeout?: number): Chainable<void>;
122
+ waitForValidation(shouldHaveErrors?: boolean, timeout?: number): Chainable<void>;
123
+ getFormDataArray(fieldName: string): Chainable<string[]>;
124
+ verifyFormDataArray(fieldName: string, expectedValues: string[], exactMatch?: boolean): Chainable<void>;
125
+ verifyFormDataFieldExists(fieldName: string): Chainable<void>;
126
+ verifyNameAttribute(fieldName: string, selector?: string): Chainable<void>;
127
+ verifyFormDataStructure(expectedData: Record<string, string | number | string[]>): Chainable<void>;
128
+ verifyFormCleared(fieldNames: string[]): Chainable<void>;
129
+ verifyDropdownNameAttribute(fieldName: string, labelText?: string): Chainable<void>;
139
130
  }
140
131
  }
141
132
  }