@nextsparkjs/testing 0.1.0-beta.39

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/selectors/selector-factory.ts","../src/selectors/core-selectors.ts","../src/selectors/selectors.ts","../src/utils/utils.ts","../src/pom/BasePOMCore.ts","../src/helpers/ApiInterceptor.ts","../src/pom/DashboardEntityPOMCore.ts"],"names":["sel","cySelector","selDev","entitySelectors","isDevelopment","isTest","enableTestingAttributes"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Selector Factory\n *\n * Factory function and utilities for creating selector helpers.\n * This file contains only the logic - no selector definitions.\n *\n * Usage:\n * ```typescript\n * import { createSelectorHelpers } from './selector-factory'\n * import { CORE_SELECTORS } from './core-selectors'\n *\n * // Create helpers bound to your selectors\n * const { sel, cySelector, selDev, SELECTORS } = createSelectorHelpers(CORE_SELECTORS)\n * ```\n *\n * Themes can extend core selectors:\n * ```typescript\n * const THEME_SELECTORS = {\n * ...CORE_SELECTORS,\n * customFeature: { ... }\n * }\n * export const { sel, cySelector } = createSelectorHelpers(THEME_SELECTORS)\n * ```\n */\n\n// =============================================================================\n// TYPE DEFINITIONS\n// =============================================================================\n\n/**\n * Placeholder replacements type\n */\nexport type Replacements = Record<string, string | number>\n\n/**\n * Generic selector object type\n */\nexport type SelectorObject = Record<string, unknown>\n\n/**\n * Return type for createSelectorHelpers\n */\nexport interface SelectorHelpers<T extends SelectorObject> {\n /** The selectors object */\n SELECTORS: T\n /** Get selector value by path */\n sel: (path: string, replacements?: Replacements) => string\n /** Alias for sel */\n s: (path: string, replacements?: Replacements) => string\n /** Get selector only in dev/test environments */\n selDev: (path: string, replacements?: Replacements) => string | undefined\n /** Get Cypress selector string [data-cy=\"...\"] */\n cySelector: (path: string, replacements?: Replacements) => string\n /** Create entity-specific selector helpers */\n entitySelectors: (slug: string) => EntitySelectorHelpers\n}\n\n/**\n * Entity selector helpers return type\n */\nexport interface EntitySelectorHelpers {\n page: () => string\n title: () => string\n table: () => string\n tableContainer: () => string\n search: () => string\n addButton: () => string\n row: (id: string) => string\n rowMenu: (id: string) => string\n rowAction: (action: string, id: string) => string\n cell: (field: string, id: string) => string\n form: () => string\n field: (name: string) => string\n submitButton: () => string\n header: (mode: string) => string\n backButton: () => string\n editButton: () => string\n deleteButton: () => string\n detail: () => string\n filter: (field: string) => string\n filterTrigger: (field: string) => string\n filterOption: (field: string, value: string) => string\n}\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n/**\n * Navigate to a value in a nested object using dot notation\n *\n * @param obj - Object to navigate\n * @param path - Dot-separated path (e.g., \"dashboard.navigation.main\")\n * @returns The value at the path, or undefined if not found\n */\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((current, key) => {\n if (current && typeof current === 'object' && key in current) {\n return (current as Record<string, unknown>)[key]\n }\n return undefined\n }, obj as unknown)\n}\n\n/**\n * Replace placeholders in a selector string\n *\n * @param selector - Selector pattern with {placeholder} syntax\n * @param replacements - Object with replacement values\n * @returns Selector with placeholders replaced\n *\n * @example\n * replacePlaceholders('{slug}-row-{id}', { slug: 'customers', id: '123' })\n * // Returns: 'customers-row-123'\n */\nexport function replacePlaceholders(\n selector: string,\n replacements?: Replacements\n): string {\n if (!replacements) return selector\n\n return Object.entries(replacements).reduce(\n (result, [key, value]) => result.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), String(value)),\n selector\n )\n}\n\n// =============================================================================\n// ENVIRONMENT DETECTION\n// =============================================================================\n\nconst isDevelopment = process.env.NODE_ENV === 'development'\nconst isTest = process.env.NODE_ENV === 'test'\nconst enableTestingAttributes = isDevelopment || isTest\n\n// =============================================================================\n// FACTORY FUNCTION\n// =============================================================================\n\n/**\n * Create selector helper functions bound to a specific selectors object.\n *\n * This factory allows themes to extend core selectors while using\n * the same helper functions.\n *\n * @param selectors - The selectors object to bind helpers to\n * @returns Object with sel, cySelector, selDev, and entitySelectors functions\n *\n * @example Core usage:\n * ```typescript\n * import { CORE_SELECTORS } from './core-selectors'\n * const { sel, cySelector } = createSelectorHelpers(CORE_SELECTORS)\n * ```\n *\n * @example Theme extension:\n * ```typescript\n * const THEME_SELECTORS = {\n * ...CORE_SELECTORS,\n * myCustomFeature: { button: 'custom-btn' }\n * }\n * const { sel, cySelector } = createSelectorHelpers(THEME_SELECTORS)\n * sel('myCustomFeature.button') // 'custom-btn'\n * ```\n */\nexport function createSelectorHelpers<T extends SelectorObject>(\n selectors: T\n): SelectorHelpers<T> {\n /**\n * Get a selector value by path with optional placeholder replacements.\n */\n function sel(path: string, replacements?: Replacements): string {\n const value = getNestedValue(selectors as Record<string, unknown>, path)\n\n if (value === undefined) {\n if (process.env.NODE_ENV === 'development') {\n console.error(`[sel] Invalid selector path: \"${path}\"`)\n }\n return `INVALID_SELECTOR_${path.replace(/\\./g, '_')}`\n }\n\n if (typeof value !== 'string') {\n if (process.env.NODE_ENV === 'development') {\n console.error(\n `[sel] Path \"${path}\" points to an object, not a string. Did you forget a property?`\n )\n }\n return `INVALID_SELECTOR_${path.replace(/\\./g, '_')}`\n }\n\n return replacePlaceholders(value, replacements)\n }\n\n /**\n * Get a Cypress selector string (wrapped with [data-cy=\"...\"])\n */\n function cySelector(path: string, replacements?: Replacements): string {\n return `[data-cy=\"${sel(path, replacements)}\"]`\n }\n\n /**\n * Get selector only in development/test environments.\n */\n function selDev(path: string, replacements?: Replacements): string | undefined {\n if (!enableTestingAttributes) return undefined\n return sel(path, replacements)\n }\n\n /**\n * Create a set of entity selectors for a specific slug.\n */\n function entitySelectors(slug: string): EntitySelectorHelpers {\n return {\n // Page\n page: () => sel('entities.page.container', { slug }),\n title: () => sel('entities.page.title', { slug }),\n\n // Table\n table: () => sel('entities.table.element', { slug }),\n tableContainer: () => sel('entities.table.container', { slug }),\n search: () => sel('entities.table.search', { slug }),\n addButton: () => sel('entities.table.addButton', { slug }),\n row: (id: string) => sel('entities.table.row', { slug, id }),\n rowMenu: (id: string) => sel('entities.table.rowMenu', { slug, id }),\n rowAction: (action: string, id: string) =>\n sel('entities.table.rowAction', { slug, action, id }),\n cell: (field: string, id: string) =>\n sel('entities.table.cell', { slug, field, id }),\n\n // Form\n form: () => sel('entities.form.container', { slug }),\n field: (name: string) => sel('entities.form.field', { slug, name }),\n submitButton: () => sel('entities.form.submitButton', { slug }),\n\n // Header\n header: (mode: string) => sel('entities.header.container', { slug, mode }),\n backButton: () => sel('entities.header.backButton', { slug }),\n editButton: () => sel('entities.header.editButton', { slug }),\n deleteButton: () => sel('entities.header.deleteButton', { slug }),\n\n // Detail\n detail: () => sel('entities.detail.container', { slug }),\n\n // Filter\n filter: (field: string) => sel('entities.filter.container', { slug, field }),\n filterTrigger: (field: string) =>\n sel('entities.filter.trigger', { slug, field }),\n filterOption: (field: string, value: string) =>\n sel('entities.filter.option', { slug, field, value }),\n }\n }\n\n return {\n SELECTORS: selectors,\n sel,\n s: sel,\n selDev,\n cySelector,\n entitySelectors,\n }\n}\n","/**\n * Core Selectors\n *\n * Single source of truth for all data-cy selectors in core components.\n * Themes can import and extend these selectors.\n *\n * Naming conventions:\n * - Static selectors: \"domain-element\" (e.g., \"nav-main\", \"login-form\")\n * - Dynamic selectors: \"domain-element-{placeholder}\" (e.g., \"{slug}-row-{id}\")\n *\n * Placeholders:\n * - {slug} - Entity slug (customers, tasks, pages, posts)\n * - {id} - Record ID\n * - {name} - Field name\n * - {section} - Settings section name\n * - {action} - Action name (edit, delete, view)\n * - {value} - Filter/option value\n * - {index} - Array index\n * - {mode} - View mode (view, edit, create)\n */\n\nexport const CORE_SELECTORS = {\n // ===========================================================================\n // AUTH\n // ===========================================================================\n auth: {\n login: {\n // Structure\n card: 'login-form-card',\n header: 'login-header',\n footer: 'login-footer',\n form: 'login-form',\n options: 'login-options',\n // Inputs\n emailInput: 'login-email-input',\n passwordInput: 'login-password-input',\n emailError: 'login-email-error',\n passwordError: 'login-password-error',\n // Buttons\n submit: 'login-submit',\n googleSignin: 'login-google-signin',\n showEmail: 'login-show-email',\n hideEmail: 'login-hide-email',\n // Links\n forgotPassword: 'login-forgot-password',\n signupLink: 'login-signup-link',\n // Misc\n inviteBanner: 'login-invite-banner',\n errorAlert: 'login-error-alert',\n rememberCheckbox: 'login-remember-checkbox',\n },\n signup: {\n form: 'signup-form',\n firstName: 'signup-first-name',\n lastName: 'signup-last-name',\n email: 'signup-email',\n password: 'signup-password',\n confirmPassword: 'signup-confirm-password',\n submitButton: 'signup-submit',\n googleButton: 'signup-google',\n loginLink: 'signup-login-link',\n inviteBanner: 'signup-invite-banner',\n error: 'signup-error',\n },\n forgotPassword: {\n form: 'forgot-password-form',\n email: 'forgot-password-email',\n submitButton: 'forgot-password-submit',\n backToLogin: 'forgot-password-back',\n successMessage: 'forgot-password-success',\n successBack: 'forgot-password-success-back',\n retryButton: 'forgot-password-retry',\n error: 'forgot-password-error',\n },\n resetPassword: {\n form: 'reset-password-form',\n password: 'reset-password-password',\n confirmPassword: 'reset-password-confirm',\n submitButton: 'reset-password-submit',\n error: 'reset-password-error',\n success: 'reset-password-success',\n loginLink: 'reset-password-login-link',\n backToLogin: 'reset-password-back',\n },\n verifyEmail: {\n container: 'verify-email-container',\n resendButton: 'verify-email-resend',\n successMessage: 'verify-email-success',\n error: 'verify-email-error',\n },\n devKeyring: {\n container: 'devkeyring-container',\n trigger: 'devkeyring-trigger',\n content: 'devkeyring-content',\n user: 'devkeyring-user-{index}',\n },\n },\n\n // ===========================================================================\n // DASHBOARD - Shell & TopNav\n // ===========================================================================\n dashboard: {\n shell: {\n container: 'dashboard-container',\n quickCreateButton: 'topnav-quick-create-button',\n quickCreateDropdown: 'topnav-quick-create-dropdown',\n quickCreateLink: 'quick-create-{slug}-link',\n },\n topnav: {\n sidebarToggle: 'topnav-sidebar-toggle',\n header: 'topnav-header',\n logo: 'topnav-logo',\n searchSection: 'topnav-search-section',\n actions: 'topnav-actions',\n notifications: 'topnav-notifications',\n help: 'topnav-help',\n themeToggle: 'topnav-theme-toggle',\n superadmin: 'topnav-superadmin',\n devtools: 'topnav-devtools',\n userMenuTrigger: 'topnav-user-menu-trigger',\n userMenu: 'topnav-user-menu',\n menuItem: 'topnav-menu-{icon}',\n menuAction: 'topnav-menu-{action}',\n userLoading: 'topnav-user-loading',\n signin: 'topnav-signin',\n signup: 'topnav-signup',\n // Mobile\n mobileActions: 'topnav-mobile-actions',\n mobileMenuToggle: 'topnav-mobile-menu-toggle',\n mobileMenu: 'topnav-mobile-menu',\n mobileUserInfo: 'topnav-mobile-user-info',\n mobileLinkProfile: 'topnav-mobile-link-profile',\n mobileLinkSettings: 'topnav-mobile-link-settings',\n mobileLinkBilling: 'topnav-mobile-link-billing',\n mobileSignout: 'topnav-mobile-signout',\n mobileNavSuperadmin: 'topnav-mobile-nav-superadmin',\n mobileNavDevtools: 'topnav-mobile-nav-devtools',\n },\n sidebar: {\n main: 'sidebar-main',\n header: 'sidebar-header',\n content: 'sidebar-content',\n footer: 'sidebar-footer',\n },\n navigation: {\n main: 'nav-main',\n dashboardLink: 'nav-link-dashboard',\n entityLink: 'nav-link-entity-{slug}',\n section: 'nav-section-{id}',\n sectionLabel: 'nav-section-label-{id}',\n sectionItem: 'nav-section-item-{sectionId}-{itemId}',\n },\n // Mobile components\n mobile: {\n topbar: {\n header: 'mobile-topbar-header',\n userProfile: 'mobile-topbar-user-profile',\n notifications: 'mobile-topbar-notifications',\n themeToggle: 'mobile-topbar-theme-toggle',\n },\n bottomNav: {\n nav: 'mobile-bottomnav-nav',\n item: 'mobile-bottomnav-item-{id}',\n },\n moreSheet: {\n content: 'mobile-more-sheet-content',\n item: 'mobile-more-sheet-item-{id}',\n superadminLink: 'mobile-more-sheet-superadmin-link',\n teamSwitcher: 'mobile-more-sheet-team-switcher',\n signoutButton: 'mobile-more-sheet-signout-button',\n },\n quickCreateSheet: {\n content: 'mobile-quick-create-sheet-content',\n item: 'mobile-quick-create-sheet-item-{slug}',\n },\n },\n },\n\n // ===========================================================================\n // DASHBOARD - Entities (Dynamic with {slug})\n // ===========================================================================\n entities: {\n page: {\n container: '{slug}-page',\n title: '{slug}-title',\n },\n list: {\n container: '{slug}-list',\n },\n table: {\n container: '{slug}-table-container',\n element: '{slug}-table',\n search: '{slug}-search',\n addButton: '{slug}-add',\n selectionCount: '{slug}-selection-count',\n selectAll: '{slug}-select-all',\n row: '{slug}-row-{id}',\n rowSelect: '{slug}-select-{id}',\n cell: '{slug}-cell-{field}-{id}',\n rowMenu: '{slug}-menu-{id}',\n rowActionsMenu: '{slug}-actions-{id}',\n rowAction: '{slug}-menu-{action}-{id}',\n quickAction: '{slug}-quick-{action}-{id}',\n },\n pagination: {\n container: '{slug}-pagination',\n pageSize: '{slug}-page-size',\n pageSizeOption: '{slug}-page-size-{size}',\n pageInfo: '{slug}-page-info',\n first: '{slug}-page-first',\n prev: '{slug}-page-prev',\n next: '{slug}-page-next',\n last: '{slug}-page-last',\n },\n bulk: {\n bar: '{slug}-bulk-bar',\n count: '{slug}-bulk-count',\n selectAll: '{slug}-bulk-select-all',\n statusButton: '{slug}-bulk-status',\n deleteButton: '{slug}-bulk-delete',\n clearButton: '{slug}-bulk-clear',\n statusDialog: '{slug}-bulk-status-dialog',\n statusSelect: '{slug}-bulk-status-select',\n statusOption: '{slug}-bulk-status-option-{value}',\n statusCancel: '{slug}-bulk-status-cancel',\n statusConfirm: '{slug}-bulk-status-confirm',\n deleteDialog: '{slug}-bulk-delete-dialog',\n deleteCancel: '{slug}-bulk-delete-cancel',\n deleteConfirm: '{slug}-bulk-delete-confirm',\n },\n header: {\n container: '{slug}-{mode}-header',\n backButton: '{slug}-back-btn',\n title: '{slug}-title',\n copyId: '{slug}-copy-id',\n editButton: '{slug}-edit-btn',\n deleteButton: '{slug}-delete-btn',\n deleteDialog: '{slug}-delete-dialog',\n deleteCancel: '{slug}-delete-cancel',\n deleteConfirm: '{slug}-delete-confirm',\n },\n detail: {\n container: '{slug}-detail',\n },\n form: {\n container: '{slug}-form',\n field: '{slug}-field-{name}',\n submitButton: '{slug}-form-submit',\n cancelButton: '{slug}-form-cancel',\n },\n filter: {\n container: '{slug}-filter-{field}',\n trigger: '{slug}-filter-{field}-trigger',\n content: '{slug}-filter-{field}-content',\n option: '{slug}-filter-{field}-option-{value}',\n badge: '{slug}-filter-{field}-badge-{value}',\n removeBadge: '{slug}-filter-{field}-remove-{value}',\n clearAll: '{slug}-filter-{field}-clear-all',\n },\n search: {\n container: '{slug}-search',\n icon: '{slug}-search-icon',\n input: '{slug}-search-input',\n clear: '{slug}-search-clear',\n },\n confirm: {\n dialog: '{slug}-confirm-dialog',\n cancel: '{slug}-confirm-cancel',\n action: '{slug}-confirm-action',\n },\n childEntity: {\n container: '{parentSlug}-{childName}-container',\n addButton: '{parentSlug}-{childName}-add-button',\n },\n },\n\n // ===========================================================================\n // DASHBOARD - Global Search\n // ===========================================================================\n globalSearch: {\n modal: 'search-modal',\n trigger: 'search-trigger',\n input: 'search-input',\n results: 'search-results',\n result: 'search-result',\n },\n\n // ===========================================================================\n // DASHBOARD - Taxonomies (Categories, Tags, etc.)\n // ===========================================================================\n taxonomies: {\n list: {\n container: 'taxonomies-list-table',\n createButton: 'taxonomies-create-button',\n row: 'taxonomy-row-{id}',\n editButton: 'taxonomies-edit-{id}',\n deleteButton: 'taxonomies-delete-{id}',\n },\n form: {\n dialog: 'taxonomy-form-dialog',\n nameInput: 'taxonomy-name-input',\n slugInput: 'taxonomy-slug-input',\n descriptionInput: 'taxonomy-description-input',\n iconInput: 'taxonomy-icon-input',\n colorInput: 'taxonomy-color-input',\n parentSelect: 'taxonomy-parent-select',\n orderInput: 'taxonomy-order-input',\n saveButton: 'taxonomy-save-button',\n cancelButton: 'taxonomy-cancel-button',\n },\n confirmDelete: {\n dialog: 'taxonomy-delete-dialog',\n confirmButton: 'taxonomy-delete-confirm',\n cancelButton: 'taxonomy-delete-cancel',\n },\n },\n\n // ===========================================================================\n // DASHBOARD - Teams\n // ===========================================================================\n teams: {\n switcher: {\n compact: 'team-switcher-compact',\n full: 'team-switcher',\n dropdown: 'team-switcher-dropdown',\n option: 'team-option-{slug}',\n manageLink: 'manage-teams-link',\n createButton: 'create-team-button',\n },\n switchModal: {\n container: 'team-switch-modal',\n },\n create: {\n dialog: 'create-team-dialog',\n button: 'create-team-button',\n nameInput: 'team-name-input',\n slugInput: 'team-slug-input',\n descriptionInput: 'team-description-input',\n cancel: 'cancel-create-team',\n submit: 'submit-create-team',\n },\n members: {\n section: 'team-members-section',\n row: 'member-row-{id}',\n actions: 'member-actions-{id}',\n makeRole: 'make-{role}-action',\n remove: 'remove-member-action',\n },\n invite: {\n button: 'invite-member-button',\n buttonDisabled: 'invite-member-button-disabled',\n dialog: 'invite-member-dialog',\n emailInput: 'member-email-input',\n roleSelect: 'member-role-select',\n roleOption: 'role-option-{role}',\n cancel: 'cancel-invite-member',\n submit: 'submit-invite-member',\n },\n invitations: {\n row: 'invitation-row-{id}',\n cancel: 'cancel-invitation-{id}',\n },\n },\n\n // ===========================================================================\n // DASHBOARD - Block Editor (Pages & Posts)\n // ===========================================================================\n blockEditor: {\n container: 'builder-editor',\n titleInput: 'editor-title-input',\n slugInput: 'editor-slug-input',\n saveButton: 'save-btn',\n statusBadge: 'status-badge',\n leftSidebarToggle: 'left-sidebar-toggle',\n viewModeToggle: 'view-mode-toggle',\n\n blockPicker: {\n container: 'block-picker',\n searchInput: 'block-search-input',\n categoryAll: 'category-all',\n category: 'category-{category}',\n blockItem: 'block-item-{slug}',\n addBlock: 'add-block-{slug}',\n },\n\n blockCanvas: {\n container: 'block-preview-canvas',\n empty: 'block-preview-canvas-empty',\n },\n\n previewCanvas: {\n container: 'block-preview-canvas',\n empty: 'block-preview-canvas-empty',\n block: 'preview-block-{id}',\n moveUp: 'preview-block-{id}-move-up',\n moveDown: 'preview-block-{id}-move-down',\n },\n\n sortableBlock: {\n container: 'sortable-block-{id}',\n dragHandle: 'drag-handle-{id}',\n duplicate: 'duplicate-block-{id}',\n remove: 'remove-block-{id}',\n error: 'block-error-{id}',\n },\n\n settingsPanel: {\n container: 'block-settings-panel',\n empty: 'settings-panel-empty',\n error: 'settings-panel-error',\n resetProps: 'reset-block-props',\n removeBlock: 'remove-block-settings',\n tabContent: 'tab-content',\n tabDesign: 'tab-design',\n tabAdvanced: 'tab-advanced',\n },\n\n pageSettings: {\n container: 'page-settings-panel',\n seoTrigger: 'seo-settings-trigger',\n metaTitle: 'seo-meta-title',\n metaDescription: 'seo-meta-description',\n metaKeywords: 'seo-meta-keywords',\n ogImage: 'seo-og-image',\n customFieldsTrigger: 'custom-fields-trigger',\n customFieldKey: 'custom-field-key-{index}',\n customFieldValue: 'custom-field-value-{index}',\n customFieldRemove: 'custom-field-remove-{index}',\n addCustomField: 'add-custom-field',\n },\n\n statusSelector: {\n trigger: 'status-selector',\n option: 'status-option-{value}',\n },\n\n dynamicForm: {\n container: 'dynamic-form',\n field: 'field-{name}',\n fieldGroup: 'field-group-{id}',\n arrayGroup: 'array-group-{name}',\n },\n\n arrayField: {\n container: 'array-field-{name}',\n item: 'array-field-{name}-{index}-{field}',\n moveUp: 'array-field-{name}-{index}-move-up',\n moveDown: 'array-field-{name}-{index}-move-down',\n remove: 'array-field-{name}-{index}-remove',\n add: 'array-field-{name}-add',\n },\n\n entityFieldsSidebar: {\n container: 'entity-fields-sidebar',\n field: 'field-{name}',\n category: 'category-{slug}',\n },\n\n // Post-specific fields\n postFields: {\n excerpt: 'field-excerpt',\n featuredImage: 'field-featuredImage',\n featuredImageUpload: 'field-featuredImage-upload',\n categories: 'field-categories',\n categoryOption: 'category-option-{id}',\n categoryBadge: 'category-badge-{id}',\n categoryRemove: 'category-remove-{id}',\n },\n\n // Page/Post locale field\n localeField: {\n select: 'field-locale',\n option: 'locale-option-{locale}',\n },\n },\n\n // ===========================================================================\n // SETTINGS\n // ===========================================================================\n settings: {\n layout: {\n main: 'settings-layout-main',\n nav: 'settings-layout-nav',\n backToDashboard: 'settings-layout-back-to-dashboard',\n header: 'settings-layout-header',\n contentArea: 'settings-layout-content-area',\n sidebar: 'settings-layout-sidebar',\n pageContent: 'settings-layout-page-content',\n },\n sidebar: {\n main: 'settings-sidebar-main',\n header: 'settings-sidebar-header',\n navItems: 'settings-sidebar-nav-items',\n navItem: 'settings-sidebar-nav-{section}',\n },\n overview: {\n container: 'settings-overview',\n item: 'settings-overview-{key}',\n },\n profile: {\n container: 'settings-profile',\n form: 'profile-form',\n avatar: 'profile-avatar',\n avatarUpload: 'profile-avatar-upload',\n firstName: 'profile-first-name',\n lastName: 'profile-last-name',\n email: 'profile-email',\n submitButton: 'profile-submit',\n successMessage: 'profile-success',\n },\n password: {\n container: 'settings-password',\n form: 'password-form',\n currentPassword: 'password-current',\n newPassword: 'password-new',\n confirmPassword: 'password-confirm',\n submitButton: 'password-submit',\n successMessage: 'password-success',\n },\n team: {\n container: 'settings-team',\n name: 'team-name',\n slug: 'team-slug',\n description: 'team-description',\n avatar: 'team-avatar',\n avatarUpload: 'team-avatar-upload',\n submitButton: 'team-submit',\n deleteButton: 'team-delete',\n deleteDialog: 'team-delete-dialog',\n deleteConfirm: 'team-delete-confirm',\n },\n members: {\n container: 'settings-members',\n inviteButton: 'members-invite',\n inviteDialog: 'members-invite-dialog',\n inviteEmail: 'members-invite-email',\n inviteRole: 'members-invite-role',\n inviteSubmit: 'members-invite-submit',\n memberRow: 'member-row-{id}',\n memberRole: 'member-role-{id}',\n memberRemove: 'member-remove-{id}',\n pendingInvites: 'members-pending-invites',\n pendingInvite: 'pending-invite-{id}',\n cancelInvite: 'cancel-invite-{id}',\n },\n billing: {\n container: 'settings-billing',\n main: 'billing-main',\n header: 'billing-header',\n currentPlan: 'billing-current-plan',\n upgradeButton: 'billing-upgrade',\n upgradePlan: 'billing-upgrade-plan',\n cancelButton: 'billing-cancel',\n addPayment: 'billing-add-payment',\n invoicesTable: 'billing-invoices',\n invoicesTableAlt: 'invoices-table',\n invoiceRow: 'invoice-row-{id}',\n invoicesRow: 'invoices-row',\n invoiceDownload: 'invoice-download-{id}',\n invoicesLoadMore: 'invoices-load-more',\n invoiceStatusBadge: 'invoice-status-badge',\n paymentMethod: 'billing-payment-method',\n paymentMethodAlt: 'payment-method',\n updatePayment: 'billing-update-payment',\n usage: 'billing-usage',\n usageDashboard: 'usage-dashboard',\n },\n pricing: {\n table: 'pricing-table',\n settingsTable: 'pricing-settings-table',\n },\n features: {\n placeholder: 'feature-placeholder-{feature}',\n content: '{feature}-content',\n placeholderUpgradeBtn: 'placeholder-upgrade-btn',\n },\n apiKeys: {\n page: 'api-keys-page',\n title: 'api-keys-title',\n container: 'settings-api-keys',\n createButton: 'api-keys-create-button',\n createDialog: 'api-keys-create-dialog',\n list: 'api-keys-list',\n skeleton: 'api-keys-skeleton',\n empty: 'api-keys-empty',\n emptyCreateButton: 'api-keys-empty-create-button',\n keyName: 'api-key-name',\n keyScopes: 'api-key-scopes',\n scopeOption: 'api-key-scope-{scope}',\n createSubmit: 'api-key-create-submit',\n keyRow: 'api-key-row-{id}',\n keyName_: 'api-keys-name-{id}',\n keyPrefix: 'api-keys-prefix-{id}',\n copyPrefix: 'api-keys-copy-prefix-{id}',\n keyStatus: 'api-keys-status-{id}',\n statusBadge: 'api-keys-status-badge-{id}',\n menuTrigger: 'api-keys-menu-trigger-{id}',\n menu: 'api-keys-menu-{id}',\n viewDetails: 'api-keys-view-details-{id}',\n toggle: 'api-keys-toggle-{id}',\n revoke: 'api-keys-revoke-{id}',\n scopes: 'api-keys-scopes-{id}',\n scope: 'api-keys-scope-{id}-{scope}',\n stats: 'api-keys-stats-{id}',\n totalRequests: 'api-keys-total-requests-{id}',\n last24h: 'api-keys-last-24h-{id}',\n avgTime: 'api-keys-avg-time-{id}',\n metadata: 'api-keys-metadata-{id}',\n createdAt: 'api-keys-created-at-{id}',\n lastUsed: 'api-keys-last-used-{id}',\n expiresAt: 'api-keys-expires-at-{id}',\n detailsDialog: 'api-keys-details-dialog',\n detailsTitle: 'api-keys-details-title',\n detailsLoading: 'api-keys-details-loading',\n detailsContent: 'api-keys-details-content',\n detailsBasicInfo: 'api-keys-details-basic-info',\n detailsName: 'api-keys-details-name',\n detailsStatus: 'api-keys-details-status',\n detailsStats: 'api-keys-details-stats',\n detailsTotalRequests: 'api-keys-details-total-requests',\n detailsLast24h: 'api-keys-details-last-24h',\n detailsLast7d: 'api-keys-details-last-7d',\n detailsLast30d: 'api-keys-details-last-30d',\n detailsAvgTime: 'api-keys-details-avg-time',\n detailsSuccessRate: 'api-keys-details-success-rate',\n keyReveal: 'api-key-reveal-{id}',\n keyRevoke: 'api-key-revoke-{id}',\n revokeDialog: 'api-key-revoke-dialog',\n revokeConfirm: 'api-key-revoke-confirm',\n newKeyDisplay: 'api-key-new-display',\n copyKey: 'api-key-copy',\n dialogFooter: 'api-keys-dialog-footer',\n },\n notifications: {\n container: 'settings-notifications',\n emailToggle: 'notifications-email',\n pushToggle: 'notifications-push',\n category: 'notifications-{category}',\n submitButton: 'notifications-submit',\n },\n teams: {\n main: 'teams-settings-main',\n header: 'teams-settings-header',\n loading: 'teams-settings-loading',\n singleUser: 'teams-settings-single-user',\n teamsList: 'teams-settings-teams-list',\n teamDetails: 'teams-settings-team-details',\n },\n plans: {\n main: 'plans-settings-main',\n header: 'plans-settings-header',\n table: 'plans-settings-table',\n },\n },\n\n // ===========================================================================\n // SUPERADMIN (Super Admin Panel)\n // ===========================================================================\n superadmin: {\n container: 'superadmin-container',\n navigation: {\n dashboard: 'superadmin-nav-dashboard',\n users: 'superadmin-nav-users',\n teams: 'superadmin-nav-teams',\n teamRoles: 'superadmin-nav-team-roles',\n docs: 'superadmin-nav-docs',\n subscriptions: 'superadmin-nav-subscriptions',\n analytics: 'superadmin-nav-analytics',\n config: 'superadmin-nav-config',\n exitToDashboard: 'superadmin-sidebar-exit-to-dashboard',\n },\n dashboard: {\n container: 'superadmin-dashboard',\n },\n users: {\n container: 'superadmin-users-container',\n table: 'superadmin-users-table',\n search: 'superadmin-users-search',\n row: 'superadmin-user-row-{id}',\n viewButton: 'superadmin-user-view-{id}',\n editButton: 'superadmin-user-edit-{id}',\n banButton: 'superadmin-user-ban-{id}',\n deleteButton: 'superadmin-user-delete-{id}',\n impersonateButton: 'superadmin-user-impersonate-{id}',\n },\n userDetail: {\n container: 'superadmin-user-detail',\n email: 'superadmin-user-email',\n role: 'superadmin-user-role',\n status: 'superadmin-user-status',\n teams: 'superadmin-user-teams',\n activity: 'superadmin-user-activity',\n actions: 'superadmin-user-actions',\n // User Metadata\n metas: 'superadmin-user-metas',\n metasTitle: 'superadmin-user-metas-title',\n metasTable: 'superadmin-user-metas-table',\n metasEmpty: 'superadmin-user-metas-empty',\n metaRow: 'superadmin-user-meta-row-{key}',\n metaKey: 'superadmin-user-meta-key-{key}',\n metaValue: 'superadmin-user-meta-value-{key}',\n metaType: 'superadmin-user-meta-type-{key}',\n metaPublic: 'superadmin-user-meta-public-{key}',\n metaSearchable: 'superadmin-user-meta-searchable-{key}',\n },\n teams: {\n container: 'superadmin-teams-container',\n table: 'superadmin-teams-table',\n search: 'superadmin-teams-search',\n row: 'superadmin-team-row-{id}',\n actionsButton: 'superadmin-team-actions-{id}',\n viewButton: 'superadmin-team-view-{id}',\n editButton: 'superadmin-team-edit-{id}',\n deleteButton: 'superadmin-team-delete-{id}',\n },\n teamDetail: {\n container: 'superadmin-team-detail',\n name: 'superadmin-team-name',\n owner: 'superadmin-team-owner',\n members: 'superadmin-team-members',\n plan: 'superadmin-team-plan',\n usage: 'superadmin-team-usage',\n },\n subscriptions: {\n container: 'superadmin-subscriptions-container',\n mrr: 'superadmin-subscriptions-mrr',\n planDistribution: 'superadmin-subscriptions-plan-distribution',\n planCount: 'superadmin-subscriptions-plan-count-{plan}',\n activeCount: 'superadmin-subscriptions-active-count',\n },\n pagination: {\n pageSize: 'superadmin-page-size-select',\n first: 'superadmin-pagination-first',\n prev: 'superadmin-pagination-prev',\n next: 'superadmin-pagination-next',\n last: 'superadmin-pagination-last',\n },\n filters: {\n search: 'superadmin-search-{context}',\n dropdown: 'superadmin-filter-{context}',\n },\n permissions: {\n row: 'superadmin-permission-row-{permission}',\n },\n teamRoles: {\n backButton: 'back-to-superadmin',\n roleCard: 'role-card-{role}',\n permissionRow: 'permission-row-{permission}',\n },\n planFeatures: {\n featureRow: 'superadmin-feature-row-{slug}',\n limitRow: 'superadmin-limit-row-{slug}',\n },\n },\n\n // ===========================================================================\n // DEVTOOLS\n // ===========================================================================\n devtools: {\n navigation: {\n sidebar: 'devtools-sidebar',\n collapseToggle: 'devtools-sidebar-collapse-toggle',\n navItem: 'devtools-nav-{section}',\n exitToDashboard: 'devtools-sidebar-exit-to-dashboard',\n goToSuperadmin: 'devtools-sidebar-go-to-superadmin',\n mobileHeader: 'devtools-mobile-header',\n },\n home: {\n page: 'devtools-home-page',\n styleLink: 'devtools-home-style-link',\n testsLink: 'devtools-home-tests-link',\n configLink: 'devtools-home-config-link',\n },\n style: {\n page: 'devtools-style-page',\n tabComponents: 'devtools-style-tab-components',\n tabFieldTypes: 'devtools-style-tab-field-types',\n tabTheme: 'devtools-style-tab-theme',\n tabGuidelines: 'devtools-style-tab-guidelines',\n componentGallery: 'devtools-style-component-gallery',\n fieldTypes: 'devtools-style-field-types',\n themePreview: 'devtools-style-theme-preview',\n },\n config: {\n page: 'devtools-config-page',\n viewer: 'devtools-config-viewer',\n tabTheme: 'devtools-config-tab-theme',\n tabEntities: 'devtools-config-tab-entities',\n themeContent: 'devtools-config-theme-content',\n entitiesContent: 'devtools-config-entities-content',\n copyTheme: 'devtools-config-copy-theme',\n copyEntities: 'devtools-config-copy-entities',\n },\n tests: {\n page: 'devtools-tests-page',\n viewer: 'devtools-tests-viewer',\n loading: 'devtools-tests-loading',\n tree: 'devtools-tests-tree',\n folder: 'devtools-tests-folder-{name}',\n file: 'devtools-tests-file-{name}',\n content: 'devtools-tests-content',\n markdownContent: 'devtools-tests-markdown-content',\n notFound: 'devtools-tests-not-found',\n backToList: 'devtools-tests-back-to-list',\n emptyState: 'devtools-tests-empty-state',\n fileLoading: 'devtools-tests-file-loading',\n error: 'devtools-tests-error',\n // Dashboard\n dashboard: 'devtools-tests-dashboard',\n dashboardButton: 'devtools-tests-dashboard-button',\n dashboardStats: 'devtools-tests-dashboard-stats',\n dashboardStatFeatures: 'devtools-tests-dashboard-stat-features',\n dashboardStatFlows: 'devtools-tests-dashboard-stat-flows',\n dashboardStatFiles: 'devtools-tests-dashboard-stat-files',\n dashboardStatTags: 'devtools-tests-dashboard-stat-tags',\n dashboardGaps: 'devtools-tests-dashboard-gaps',\n dashboardGapItem: 'devtools-tests-dashboard-gap-{slug}',\n },\n features: {\n page: 'devtools-features-page',\n viewer: 'devtools-features-viewer',\n search: 'devtools-features-search',\n filterAll: 'devtools-features-filter-all',\n filterCategory: 'devtools-features-filter-{category}',\n coverageAll: 'devtools-features-coverage-all',\n coverageCovered: 'devtools-features-coverage-covered',\n coverageUncovered: 'devtools-features-coverage-uncovered',\n card: 'devtools-features-card-{slug}',\n copyTag: 'devtools-features-copy-{slug}',\n },\n flows: {\n page: 'devtools-flows-page',\n viewer: 'devtools-flows-viewer',\n search: 'devtools-flows-search',\n filterAll: 'devtools-flows-filter-all',\n filterCategory: 'devtools-flows-filter-{category}',\n coverageAll: 'devtools-flows-coverage-all',\n coverageCovered: 'devtools-flows-coverage-covered',\n coverageUncovered: 'devtools-flows-coverage-uncovered',\n card: 'devtools-flows-card-{slug}',\n copyTag: 'devtools-flows-copy-{slug}',\n },\n blocks: {\n page: 'devtools-blocks-page',\n viewer: 'devtools-blocks-viewer',\n search: 'devtools-blocks-search',\n filterAll: 'devtools-blocks-filter-all',\n filterCategory: 'devtools-blocks-filter-{category}',\n coverageAll: 'devtools-blocks-coverage-all',\n coverageCovered: 'devtools-blocks-coverage-covered',\n coverageUncovered: 'devtools-blocks-coverage-uncovered',\n card: 'devtools-blocks-card-{slug}',\n copyTag: 'devtools-blocks-copy-{slug}',\n viewDetails: 'devtools-blocks-view-{slug}',\n detail: {\n page: 'devtools-block-detail-{slug}',\n back: 'devtools-block-detail-back',\n tabPreview: 'devtools-block-detail-tab-preview',\n tabFields: 'devtools-block-detail-tab-fields',\n tabOverview: 'devtools-block-detail-tab-overview',\n preview: 'devtools-block-detail-preview-{slug}',\n exampleSelector: 'devtools-block-example-selector',\n exampleBtn: 'devtools-block-example-btn-{index}',\n exampleName: 'devtools-block-example-name',\n exampleDescription: 'devtools-block-example-description',\n },\n },\n tags: {\n page: 'devtools-tags-page',\n viewer: 'devtools-tags-viewer',\n search: 'devtools-tags-search',\n category: 'devtools-tags-category-{category}',\n tag: 'devtools-tags-tag-{tag}',\n tagLink: 'devtools-tags-link-{tag}',\n filesPanel: 'devtools-tags-files-panel-{tag}',\n },\n scheduledActions: {\n page: 'devtools-scheduled-actions-page',\n filterStatus: 'scheduled-actions-filter-status',\n filterType: 'scheduled-actions-filter-type',\n filterApply: 'scheduled-actions-filter-apply',\n filterReset: 'scheduled-actions-filter-reset',\n table: 'scheduled-actions-table',\n row: 'scheduled-actions-row-{id}',\n cellType: 'scheduled-actions-cell-type',\n cellStatus: 'scheduled-actions-cell-status',\n cellScheduledAt: 'scheduled-actions-cell-scheduled-at',\n cellTeam: 'scheduled-actions-cell-team',\n cellPayload: 'scheduled-actions-cell-payload',\n cellError: 'scheduled-actions-cell-error',\n statusPending: 'scheduled-actions-status-pending',\n statusRunning: 'scheduled-actions-status-running',\n statusCompleted: 'scheduled-actions-status-completed',\n statusFailed: 'scheduled-actions-status-failed',\n pagination: 'scheduled-actions-pagination',\n paginationPrev: 'scheduled-actions-pagination-prev',\n paginationNext: 'scheduled-actions-pagination-next',\n emptyState: 'scheduled-actions-empty-state',\n },\n },\n\n // ===========================================================================\n // PUBLIC PAGES\n // ===========================================================================\n public: {\n navbar: {\n container: 'public-navbar',\n logo: 'navbar-logo',\n loginButton: 'navbar-login',\n signupButton: 'navbar-signup',\n },\n footer: {\n container: 'public-footer',\n logo: 'footer-logo',\n },\n page: {\n container: 'public-page-{slug}',\n title: 'page-title',\n content: 'page-content',\n },\n blog: {\n listContainer: 'blog-list',\n postCard: 'blog-post-{slug}',\n },\n },\n\n // ===========================================================================\n // COMMON / SHARED\n // ===========================================================================\n common: {\n permissionDenied: 'permission-denied',\n loading: 'loading-spinner',\n error: 'error-message',\n toast: 'toast-{type}',\n modal: {\n overlay: 'modal-overlay',\n container: 'modal-container',\n title: 'modal-title',\n close: 'modal-close',\n content: 'modal-content',\n footer: 'modal-footer',\n },\n },\n} as const\n\n/**\n * Type for the CORE_SELECTORS object\n */\nexport type CoreSelectorsType = typeof CORE_SELECTORS\n","/**\n * Centralized Selector System\n *\n * Single source of truth for data-cy selectors.\n * Components consume selectors from this module, ensuring consistency\n * between UI components, POM classes, and tests.\n *\n * Architecture:\n * - `core-selectors.ts` - CORE_SELECTORS object (selector definitions)\n * - `selector-factory.ts` - createSelectorHelpers() factory function\n * - `selectors.ts` (this file) - Pre-bound exports for core usage\n *\n * @example Component usage:\n * ```tsx\n * import { sel } from '@nextsparkjs/testing/selectors'\n *\n * <nav data-cy={sel('dashboard.navigation.main')}>\n * <Link data-cy={sel('dashboard.navigation.entityLink', { slug: 'customers' })}>\n * ```\n *\n * @example Test/POM usage:\n * ```ts\n * import { cySelector } from '@nextsparkjs/testing/selectors'\n *\n * cy.get(cySelector('dashboard.navigation.main'))\n * ```\n *\n * @example Theme extension:\n * ```ts\n * // In theme's selectors.ts\n * import { createSelectorHelpers, CORE_SELECTORS } from '@nextsparkjs/testing/selectors'\n *\n * const THEME_SELECTORS = { ...CORE_SELECTORS, myFeature: { ... } }\n * export const { sel, cySelector } = createSelectorHelpers(THEME_SELECTORS)\n * ```\n */\n\nimport { createSelectorHelpers } from './selector-factory'\nimport { CORE_SELECTORS, type CoreSelectorsType } from './core-selectors'\n\n// =============================================================================\n// PRE-BOUND EXPORTS (for core components)\n// =============================================================================\n\n/**\n * Create helpers bound to CORE_SELECTORS\n */\nconst helpers = createSelectorHelpers(CORE_SELECTORS)\n\n/**\n * Main selector object - single source of truth\n */\nexport const SELECTORS = helpers.SELECTORS\n\n/**\n * Get a selector value by path with optional placeholder replacements.\n * @see selector-factory.ts for full documentation\n */\nexport const sel = helpers.sel\n\n/**\n * Alias for sel\n */\nexport const s = helpers.s\n\n/**\n * Get selector only in dev/test environments\n */\nexport const selDev = helpers.selDev\n\n/**\n * Get Cypress selector string [data-cy=\"...\"]\n */\nexport const cySelector = helpers.cySelector\n\n/**\n * Create entity-specific selector helpers\n */\nexport const entitySelectors = helpers.entitySelectors\n\n// =============================================================================\n// TYPE EXPORTS\n// =============================================================================\n\n/**\n * Type for the SELECTORS object\n */\nexport type SelectorsType = CoreSelectorsType\n\n/**\n * Re-export Replacements type\n */\nexport type { Replacements } from './selector-factory'\n\n/**\n * Helper type to extract leaf paths from nested object\n */\ntype PathImpl<T, K extends keyof T> = K extends string\n ? T[K] extends Record<string, unknown>\n ? T[K] extends ArrayLike<unknown>\n ? K\n : `${K}.${PathImpl<T[K], keyof T[K]>}`\n : K\n : never\n\ntype Path<T> = PathImpl<T, keyof T>\n\n/**\n * All valid selector paths\n */\nexport type SelectorPath = Path<SelectorsType>\n\n// =============================================================================\n// DEFAULT EXPORT\n// =============================================================================\n\nexport default {\n SELECTORS,\n sel,\n s,\n selDev,\n cySelector,\n entitySelectors,\n}\n","/**\n * Testing Utilities\n * Helper functions for consistent testing attribute generation\n */\n\n// =============================================================================\n// TYPE DEFINITIONS (inlined to avoid external dependency)\n// =============================================================================\n\n/**\n * Test ID pattern type\n */\nexport type TestIdPattern = string\n\n/**\n * Cypress ID pattern type\n */\nexport type CypressIdPattern = string\n\n// =============================================================================\n// ENVIRONMENT DETECTION\n// =============================================================================\n\n/**\n * Environment-based testing mode\n */\nconst isDevelopment = process.env.NODE_ENV === 'development'\nconst isTest = process.env.NODE_ENV === 'test'\nconst enableTestingAttributes = isDevelopment || isTest\n\n// =============================================================================\n// BASIC TEST ID GENERATORS\n// =============================================================================\n\n/**\n * Create consistent test IDs following the pattern: [component]-[element]-[action?]\n *\n * @param component - Main component name (e.g., 'task', 'nav', 'user')\n * @param element - Element type (e.g., 'card', 'button', 'input')\n * @param action - Optional action (e.g., 'delete', 'edit', 'toggle')\n * @returns Test ID string or undefined in production\n */\nexport function createTestId(\n component: string,\n element: string,\n action?: string\n): string | undefined {\n if (!enableTestingAttributes) return undefined\n\n const parts = [component, element, action].filter(Boolean)\n return parts.join('-') as TestIdPattern\n}\n\n/**\n * Create Cypress-specific IDs following the pattern: [domain]-[element]\n *\n * @param domain - Application domain (e.g., 'todo', 'nav', 'user')\n * @param element - Element identifier (e.g., 'item', 'button', 'menu')\n * @returns Cypress ID string or undefined in production\n */\nexport function createCyId(domain: string, element: string): string | undefined {\n if (!enableTestingAttributes) return undefined\n\n return `${domain}-${element}` as CypressIdPattern\n}\n\n// =============================================================================\n// ATTRIBUTE GENERATORS\n// =============================================================================\n\n/**\n * Create state-based data attributes for conditional testing\n *\n * @param state - Current state value\n * @returns State attribute value\n */\nexport function createStateAttr(\n state: 'active' | 'completed' | 'pending' | 'loading' | 'error'\n): string {\n return state\n}\n\n/**\n * Create priority-based data attributes\n *\n * @param priority - Priority level\n * @returns Priority attribute value\n */\nexport function createPriorityAttr(priority: 'low' | 'medium' | 'high'): string {\n return priority\n}\n\n/**\n * Generate testing props object for components\n *\n * @param config - Testing configuration\n * @returns Testing props object\n */\nexport function createTestingProps(config: {\n testId?: string\n cyId?: string\n state?: 'active' | 'completed' | 'pending' | 'loading' | 'error'\n priority?: 'low' | 'medium' | 'high'\n taskId?: string\n userId?: string\n}) {\n const props: Record<string, string | undefined> = {}\n\n if (config.testId) {\n props['data-testid'] = enableTestingAttributes ? config.testId : undefined\n }\n\n if (config.cyId) {\n props['data-cy'] = enableTestingAttributes ? config.cyId : undefined\n }\n\n if (config.state) {\n props['data-state'] = config.state\n }\n\n if (config.priority) {\n props['data-priority'] = config.priority\n }\n\n if (config.taskId) {\n props['data-task-id'] = config.taskId\n }\n\n if (config.userId) {\n props['data-user-id'] = config.userId\n }\n\n // Filter out undefined values\n return Object.fromEntries(\n Object.entries(props).filter((entry) => entry[1] !== undefined)\n )\n}\n\n/**\n * Accessibility helper for dynamic aria-label generation\n *\n * @param template - Label template with placeholders\n * @param values - Values to replace placeholders\n * @returns Formatted aria-label\n */\nexport function createAriaLabel(\n template: string,\n values: Record<string, string | number | boolean>\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key) => {\n return String(values[key] ?? match)\n })\n}\n\n// =============================================================================\n// TESTING PATTERNS\n// =============================================================================\n\n/**\n * Common testing patterns for different component types\n */\nexport const testingPatterns = {\n // Task/Todo components\n task: {\n card: (taskId: string) =>\n createTestingProps({\n testId: createTestId('task', 'card'),\n cyId: createCyId('task', 'item'),\n taskId,\n }),\n checkbox: () =>\n createTestingProps({\n testId: createTestId('task', 'checkbox'),\n cyId: createCyId('task', 'toggle'),\n }),\n title: () =>\n createTestingProps({\n testId: createTestId('task', 'title'),\n cyId: createCyId('task', 'title'),\n }),\n deleteButton: () =>\n createTestingProps({\n testId: createTestId('task', 'delete', 'button'),\n cyId: createCyId('task', 'delete'),\n }),\n },\n\n // Navigation components\n nav: {\n searchDropdown: () =>\n createTestingProps({\n testId: createTestId('nav', 'search', 'dropdown'),\n cyId: createCyId('nav', 'search'),\n }),\n notifications: () =>\n createTestingProps({\n testId: createTestId('nav', 'notifications', 'button'),\n cyId: createCyId('nav', 'notifications'),\n }),\n userMenu: () =>\n createTestingProps({\n testId: createTestId('nav', 'user', 'menu'),\n cyId: createCyId('nav', 'user-menu'),\n }),\n },\n\n // Form components\n form: {\n input: (fieldName: string) =>\n createTestingProps({\n testId: createTestId('form', fieldName, 'input'),\n cyId: createCyId('form', fieldName),\n }),\n submitButton: () =>\n createTestingProps({\n testId: createTestId('form', 'submit', 'button'),\n cyId: createCyId('form', 'submit'),\n }),\n },\n}\n\n// =============================================================================\n// KEYBOARD HELPERS\n// =============================================================================\n\n/**\n * Keyboard navigation helpers\n */\nexport const keyboardHelpers = {\n /**\n * Handle Enter and Space key activation\n */\n createActivationHandler: (onActivate: () => void) => {\n return (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onActivate()\n }\n }\n },\n\n /**\n * Handle Escape key for closing\n */\n createEscapeHandler: (onClose: () => void) => {\n return (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n onClose()\n }\n }\n },\n\n /**\n * Handle arrow navigation in lists\n */\n createArrowNavigationHandler: (\n currentIndex: number,\n maxIndex: number,\n onIndexChange: (index: number) => void\n ) => {\n return (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n onIndexChange(currentIndex < maxIndex ? currentIndex + 1 : 0)\n break\n case 'ArrowUp':\n e.preventDefault()\n onIndexChange(currentIndex > 0 ? currentIndex - 1 : maxIndex)\n break\n }\n }\n },\n}\n\n// ============================================================================\n// ENTITY TESTING HELPERS\n// ============================================================================\n\n/**\n * Create entity-specific Cypress ID following the convention: {slug}-{component}-{detail?}\n *\n * @param entitySlug - Entity slug from config (e.g., 'squads', 'people', 'projects')\n * @param component - Component type (e.g., 'form', 'field', 'section', 'table')\n * @param detail - Optional detail (e.g., field name, section name, action)\n * @returns Cypress ID string or undefined in production\n *\n * @example\n * createEntityCyId('squads', 'form') // 'squads-form'\n * createEntityCyId('squads', 'field', 'name') // 'squads-field-name'\n * createEntityCyId('squads', 'form', 'submit') // 'squads-form-submit'\n */\nexport function createEntityCyId(\n entitySlug: string,\n component: string,\n detail?: string\n): string | undefined {\n if (!enableTestingAttributes) return undefined\n\n const parts = [entitySlug, component, detail].filter(Boolean)\n return parts.join('-')\n}\n\n/**\n * Entity testing helper interface\n */\nexport interface EntityTestingHelper {\n /** Generic selector: {slug}-{component}-{detail?} - Use for custom/non-standard selectors */\n get: (component: string, detail?: string) => string | undefined\n\n // Page selectors\n /** {slug}-page */\n page: () => string | undefined\n /** {slug}-form-page */\n formPage: () => string | undefined\n\n // Form selectors\n /** {slug}-form */\n form: () => string | undefined\n /** {slug}-form-submit */\n formSubmit: () => string | undefined\n /** {slug}-form-cancel */\n formCancel: () => string | undefined\n\n // Field selectors\n /** {slug}-field-{name} */\n field: (name: string) => string | undefined\n /** {slug}-field-{name}-option-{value} */\n fieldOption: (name: string, value: string) => string | undefined\n /** {slug}-field-{name}-error */\n fieldError: (name: string) => string | undefined\n\n // Section selectors\n /** {slug}-section-{name} */\n section: (name: string) => string | undefined\n\n // Card selectors\n /** {slug}-card-{id} */\n card: (id: string) => string | undefined\n\n // List/Table selectors\n /** {slug}-table */\n table: () => string | undefined\n /** {slug}-row-{id} */\n row: (id: string) => string | undefined\n /** {slug}-create-btn */\n createBtn: () => string | undefined\n /** {slug}-search-input */\n searchInput: () => string | undefined\n\n // Filter selectors\n /** {slug}-filter-{field} */\n filter: (field: string) => string | undefined\n /** {slug}-filter-{field}-trigger */\n filterTrigger: (field: string) => string | undefined\n /** {slug}-filter-{field}-option-{value} */\n filterOption: (field: string, value: string) => string | undefined\n\n // Action selectors\n /** {slug}-action-{action}-{id} */\n action: (action: string, id: string) => string | undefined\n /** {slug}-actions-trigger-{id} */\n actionsTrigger: (id: string) => string | undefined\n\n // Dialog selectors\n /** {slug}-confirm-delete */\n confirmDelete: () => string | undefined\n /** {slug}-confirm-delete-btn */\n confirmDeleteBtn: () => string | undefined\n /** {slug}-cancel-delete-btn */\n cancelDeleteBtn: () => string | undefined\n}\n\n/**\n * Create a testing helper factory for a specific entity.\n * Uses the entity slug from config to generate consistent data-cy selectors.\n *\n * Convention: {slug}-{component}-{detail}\n *\n * @param entitySlug - Entity slug from EntityConfig (e.g., 'squads', 'people')\n * @returns EntityTestingHelper with pre-bound selector generators\n *\n * @example\n * // In your component file:\n * import { createEntityTestingHelper } from '@nextsparkjs/testing/utils'\n * import { squadsEntityConfig } from './squads.config'\n *\n * const testId = createEntityTestingHelper(squadsEntityConfig.slug)\n *\n * // Usage in JSX:\n * <div data-cy={testId.formPage()}> // squads-form-page\n * <form data-cy={testId.form()}> // squads-form\n * <div data-cy={testId.section('basic')}> // squads-section-basic\n * <input data-cy={testId.field('name')} /> // squads-field-name\n * </div>\n * <button data-cy={testId.formSubmit()}> // squads-form-submit\n * Submit\n * </button>\n * </form>\n * </div>\n *\n * // Card example:\n * <Card data-cy={testId.card(squad.id)}> // squads-card-{id}\n *\n * // Custom selector example (for non-standard selectors):\n * <div data-cy={testId.get('color-preset', color)}> // squads-color-preset-{color}\n */\nexport function createEntityTestingHelper(entitySlug: string): EntityTestingHelper {\n return {\n // Generic (framework-agnostic)\n get: (component: string, detail?: string) =>\n createEntityCyId(entitySlug, component, detail),\n\n // Page\n page: () => createEntityCyId(entitySlug, 'page'),\n formPage: () => createEntityCyId(entitySlug, 'form-page'),\n\n // Form\n form: () => createEntityCyId(entitySlug, 'form'),\n formSubmit: () => createEntityCyId(entitySlug, 'form-submit'),\n formCancel: () => createEntityCyId(entitySlug, 'form-cancel'),\n\n // Fields\n field: (name: string) => createEntityCyId(entitySlug, 'field', name),\n fieldOption: (name: string, value: string) =>\n createEntityCyId(entitySlug, `field-${name}-option`, value),\n fieldError: (name: string) => createEntityCyId(entitySlug, `field-${name}`, 'error'),\n\n // Sections\n section: (name: string) => createEntityCyId(entitySlug, 'section', name),\n\n // Card\n card: (id: string) => createEntityCyId(entitySlug, 'card', id),\n\n // List/Table\n table: () => createEntityCyId(entitySlug, 'table'),\n row: (id: string) => createEntityCyId(entitySlug, 'row', id),\n createBtn: () => createEntityCyId(entitySlug, 'create-btn'),\n searchInput: () => createEntityCyId(entitySlug, 'search-input'),\n\n // Filters\n filter: (field: string) => createEntityCyId(entitySlug, 'filter', field),\n filterTrigger: (field: string) =>\n createEntityCyId(entitySlug, `filter-${field}`, 'trigger'),\n filterOption: (field: string, value: string) =>\n createEntityCyId(entitySlug, `filter-${field}-option`, value),\n\n // Actions\n action: (action: string, id: string) =>\n createEntityCyId(entitySlug, `action-${action}`, id),\n actionsTrigger: (id: string) => createEntityCyId(entitySlug, 'actions-trigger', id),\n\n // Dialogs\n confirmDelete: () => createEntityCyId(entitySlug, 'confirm-delete'),\n confirmDeleteBtn: () => createEntityCyId(entitySlug, 'confirm-delete-btn'),\n cancelDeleteBtn: () => createEntityCyId(entitySlug, 'cancel-delete-btn'),\n }\n}\n","/**\n * BasePOMCore - Base class with common utilities for all Page Object Models\n *\n * This is the CORE version that provides generic methods.\n * Themes should extend this class and implement the abstract `cySelector` method\n * to provide theme-specific selector resolution.\n *\n * @example Theme extension:\n * ```ts\n * // theme/tests/cypress/src/core/BasePOM.ts\n * import { BasePOMCore } from '@nextsparkjs/testing/pom'\n * import { cySelector } from '../selectors'\n *\n * export abstract class BasePOM extends BasePOMCore {\n * protected cySelector(path: string, replacements?: Record<string, string>): string {\n * return cySelector(path, replacements)\n * }\n * }\n * ```\n */\n\nimport { type Replacements } from '../selectors'\n\n// Re-export for convenience\nexport type { Replacements }\n\nexport abstract class BasePOMCore {\n /**\n * Abstract method - themes must implement to provide their cySelector\n * This allows themes to use their extended THEME_SELECTORS\n *\n * @param path - Dot-notation path to the selector (e.g., \"auth.login.form\")\n * @param replacements - Optional placeholder replacements\n * @returns Cypress selector string like [data-cy=\"selector-value\"]\n */\n protected abstract cySelector(path: string, replacements?: Replacements): string\n\n /**\n * Get a Cypress selector using the centralized selectors\n * Wrapper for cySelector with a shorter name\n *\n * @example\n * this.cy('auth.login.form')\n * // Returns: '[data-cy=\"login-form\"]'\n *\n * this.cy('entities.table.row', { slug: 'tasks', id: '123' })\n * // Returns: '[data-cy=\"tasks-row-123\"]'\n */\n protected cy(path: string, replacements?: Replacements): string {\n return this.cySelector(path, replacements)\n }\n\n /**\n * Replaces placeholders in a selector pattern and wraps with data-cy attribute\n *\n * @param pattern - Selector pattern with {placeholder} syntax\n * @param replacements - Object with placeholder values\n * @returns Formatted data-cy selector string\n *\n * @example\n * selector('{slug}-row-{id}', { slug: 'tasks', id: '123' })\n * // Returns: '[data-cy=\"tasks-row-123\"]'\n */\n protected selector(pattern: string, replacements: Replacements = {}): string {\n let result = pattern\n for (const [key, value] of Object.entries(replacements)) {\n result = result.replaceAll(`{${key}}`, String(value))\n }\n return `[data-cy=\"${result}\"]`\n }\n\n /**\n * Wrapper for cy.get with selector pattern support\n * @param pattern - Selector pattern or direct selector\n * @param replacements - Optional placeholder replacements\n */\n protected get(pattern: string, replacements: Replacements = {}) {\n return cy.get(this.selector(pattern, replacements))\n }\n\n /**\n * Generic wait with configurable timeout\n * @param selector - CSS selector to wait for\n * @param timeout - Max wait time in ms (default: 15000)\n */\n protected waitFor(selector: string, timeout = 15000) {\n cy.get(selector, { timeout }).should('be.visible')\n return this\n }\n\n /**\n * Wait for URL to contain a specific path\n * @param path - Path segment to check for\n */\n protected waitForUrl(path: string) {\n cy.url().should('include', path)\n return this\n }\n\n /**\n * Wait for URL to match a regex pattern\n * @param pattern - RegExp to match against URL\n */\n protected waitForUrlMatch(pattern: RegExp) {\n cy.url().should('match', pattern)\n return this\n }\n\n /**\n * Visit a URL and return self for chaining\n * @param url - URL to visit\n */\n visit(url: string) {\n cy.visit(url)\n return this\n }\n\n /**\n * Wait for page to load (checks for body visible)\n */\n waitForPageLoad() {\n cy.get('body').should('be.visible')\n return this\n }\n\n /**\n * Get an element by selector\n * @param selector - CSS selector\n */\n getElement(selector: string) {\n return cy.get(selector)\n }\n\n /**\n * Click on an element\n * @param selector - CSS selector\n */\n click(selector: string) {\n cy.get(selector).click()\n return this\n }\n\n /**\n * Type text into an input\n * @param selector - CSS selector\n * @param text - Text to type\n */\n type(selector: string, text: string) {\n cy.get(selector).clear().type(text)\n return this\n }\n\n /**\n * Check if element exists\n * @param selector - CSS selector\n */\n exists(selector: string) {\n return cy.get(selector).should('exist')\n }\n\n /**\n * Check if element is visible\n * @param selector - CSS selector\n */\n isVisible(selector: string) {\n return cy.get(selector).should('be.visible')\n }\n\n /**\n * Check if element does not exist\n * @param selector - CSS selector\n */\n notExists(selector: string) {\n return cy.get(selector).should('not.exist')\n }\n}\n\nexport default BasePOMCore\n","/**\n * ApiInterceptor - Helper for deterministic waits in Cypress\n *\n * Replaces unreliable cy.wait(ms) with cy.intercept() based waits\n * that wait for actual API responses.\n *\n * @example Basic usage:\n * ```ts\n * const api = new ApiInterceptor('customers')\n * api.setupCrudIntercepts()\n * cy.visit('/dashboard/customers')\n * api.waitForList()\n * ```\n *\n * @example Custom path:\n * ```ts\n * const api = new ApiInterceptor({\n * slug: 'categories',\n * customPath: '/api/v1/post-categories'\n * })\n * ```\n */\n\nexport interface ApiInterceptorConfig {\n /** Entity slug - used to generate aliases */\n slug: string\n /** Custom API path (e.g., '/api/v1/post-categories') */\n customPath?: string\n}\n\nexport class ApiInterceptor {\n private slug: string\n private endpoint: string\n\n constructor(slugOrConfig: string | ApiInterceptorConfig) {\n if (typeof slugOrConfig === 'string') {\n this.slug = slugOrConfig\n this.endpoint = `/api/v1/${slugOrConfig}`\n } else {\n this.slug = slugOrConfig.slug\n this.endpoint = slugOrConfig.customPath || `/api/v1/${slugOrConfig.slug}`\n }\n }\n\n // ============================================\n // ACCESSORS\n // ============================================\n\n /** Get the API endpoint path */\n get path(): string {\n return this.endpoint\n }\n\n /** Get the entity slug */\n get entitySlug(): string {\n return this.slug\n }\n\n /** Get alias names for all operations */\n get aliases() {\n return {\n list: `${this.slug}List`,\n create: `${this.slug}Create`,\n update: `${this.slug}Update`,\n delete: `${this.slug}Delete`,\n }\n }\n\n // ============================================\n // INTERCEPT SETUP\n // ============================================\n\n /**\n * Setup intercepts for all CRUD operations\n * Call this BEFORE navigation in beforeEach or at test start\n *\n * Note: We intercept both PUT and PATCH for updates since different\n * APIs may use different HTTP methods for updates.\n */\n setupCrudIntercepts(): this {\n cy.intercept('GET', `${this.endpoint}*`).as(this.aliases.list)\n cy.intercept('POST', this.endpoint).as(this.aliases.create)\n // Intercept both PUT and PATCH for updates (APIs may use either)\n cy.intercept('PUT', `${this.endpoint}/*`).as(this.aliases.update)\n cy.intercept('PATCH', `${this.endpoint}/*`).as(`${this.aliases.update}Patch`)\n cy.intercept('DELETE', `${this.endpoint}/*`).as(this.aliases.delete)\n return this\n }\n\n /**\n * Setup only list + create intercepts\n * Useful for list pages with inline create\n */\n setupListIntercepts(): this {\n cy.intercept('GET', `${this.endpoint}*`).as(this.aliases.list)\n cy.intercept('POST', this.endpoint).as(this.aliases.create)\n return this\n }\n\n // ============================================\n // WAIT METHODS\n // ============================================\n\n /**\n * Wait for list response (GET)\n * Use after navigation or after mutations to wait for refresh\n */\n waitForList(timeout = 10000): Cypress.Chainable {\n return cy.wait(`@${this.aliases.list}`, { timeout })\n }\n\n /**\n * Wait for create response (POST) and validate success status\n */\n waitForCreate(timeout = 10000): Cypress.Chainable {\n return cy.wait(`@${this.aliases.create}`, { timeout })\n .its('response.statusCode')\n .should('be.oneOf', [200, 201])\n }\n\n /**\n * Wait for update response (PATCH or PUT) and validate success status\n * Waits for PATCH first (more common), falls back to PUT\n */\n waitForUpdate(timeout = 10000): Cypress.Chainable {\n // Try PATCH first (more common in modern APIs), fall back to PUT\n return cy.wait(`@${this.aliases.update}Patch`, { timeout })\n .its('response.statusCode')\n .should('be.oneOf', [200, 201])\n }\n\n /**\n * Wait for delete response (DELETE) and validate success status\n */\n waitForDelete(timeout = 10000): Cypress.Chainable {\n return cy.wait(`@${this.aliases.delete}`, { timeout })\n .its('response.statusCode')\n .should('be.oneOf', [200, 204])\n }\n\n // ============================================\n // CONVENIENCE METHODS\n // ============================================\n\n /**\n * Wait for list refresh (alias for waitForList)\n * Semantic name for use after create/update/delete\n */\n waitForRefresh(timeout = 10000): Cypress.Chainable {\n return this.waitForList(timeout)\n }\n\n /**\n * Wait for create + list refresh\n * Common pattern: create entity, wait for success, wait for list to refresh\n */\n waitForCreateAndRefresh(timeout = 10000): Cypress.Chainable {\n this.waitForCreate(timeout)\n return this.waitForList(timeout)\n }\n\n /**\n * Wait for update + list refresh\n * Common pattern: update entity, wait for success, wait for list to refresh\n */\n waitForUpdateAndRefresh(timeout = 10000): Cypress.Chainable {\n this.waitForUpdate(timeout)\n return this.waitForList(timeout)\n }\n\n /**\n * Wait for delete + list refresh\n * Common pattern: delete entity, wait for success, wait for list to refresh\n */\n waitForDeleteAndRefresh(timeout = 10000): Cypress.Chainable {\n this.waitForDelete(timeout)\n return this.waitForList(timeout)\n }\n}\n\nexport default ApiInterceptor\n","/**\n * DashboardEntityPOMCore - Base class for all entity Page Object Models\n *\n * Provides standard CRUD operations for dashboard entities:\n * - Navigation (list, create, edit, detail pages)\n * - Table interactions (search, filters, pagination, row actions)\n * - Form operations (fill fields, submit, cancel)\n * - API interceptor integration for deterministic waits\n * - Bulk actions\n * - Delete confirmation dialogs\n *\n * This is the CORE version. Themes should extend this class and implement\n * the abstract `cySelector` method from BasePOMCore.\n *\n * @example Theme extension:\n * ```ts\n * // theme/tests/cypress/src/core/DashboardEntityPOM.ts\n * import { DashboardEntityPOMCore } from '@nextsparkjs/testing/pom'\n * import { cySelector } from '../selectors'\n *\n * export abstract class DashboardEntityPOM extends DashboardEntityPOMCore {\n * protected cySelector(path: string, replacements?: Record<string, string>): string {\n * return cySelector(path, replacements)\n * }\n * }\n * ```\n */\n\nimport { BasePOMCore, type Replacements } from './BasePOMCore'\nimport { ApiInterceptor } from '../helpers/ApiInterceptor'\n\nexport interface EntityConfig {\n slug: string\n singular?: string\n plural?: string\n tableName?: string\n fields?: string[]\n filters?: string[]\n}\n\nexport abstract class DashboardEntityPOMCore extends BasePOMCore {\n protected slug: string\n protected entityConfig: EntityConfig\n protected _api: ApiInterceptor | null = null\n\n /**\n * Get the entity slug (public accessor)\n * Useful for building dynamic selectors and URLs in tests\n */\n get entitySlug(): string {\n return this.slug\n }\n\n constructor(entitySlugOrConfig: string | EntityConfig) {\n super()\n if (typeof entitySlugOrConfig === 'string') {\n this.slug = entitySlugOrConfig\n this.entityConfig = { slug: entitySlugOrConfig }\n } else {\n this.slug = entitySlugOrConfig.slug\n this.entityConfig = entitySlugOrConfig\n }\n }\n\n // ============================================\n // API INTERCEPTOR\n // ============================================\n\n /**\n * Get or create ApiInterceptor instance for this entity\n */\n get api(): ApiInterceptor {\n if (!this._api) {\n this._api = new ApiInterceptor(this.slug)\n }\n return this._api\n }\n\n /**\n * Setup API intercepts for all CRUD operations\n * Call this BEFORE navigation\n */\n setupApiIntercepts() {\n this.api.setupCrudIntercepts()\n return this\n }\n\n // ============================================\n // SELECTORS (uses cySelector from theme)\n // ============================================\n\n /**\n * Get all selectors for this entity, with placeholders replaced\n * Uses the abstract cySelector method which themes implement\n */\n get selectors() {\n const slug = this.slug\n\n return {\n // Page\n page: this.cySelector('entities.page.container', { slug }),\n pageTitle: this.cySelector('entities.page.title', { slug }),\n\n // Table\n tableContainer: this.cySelector('entities.table.container', { slug }),\n table: this.cySelector('entities.table.element', { slug }),\n addButton: this.cySelector('entities.table.addButton', { slug }),\n search: this.cySelector('entities.table.search', { slug }),\n searchContainer: this.cySelector('entities.table.search', { slug }),\n searchClear: this.cySelector('entities.search.clear', { slug }),\n selectAll: this.cySelector('entities.table.selectAll', { slug }),\n selectionCount: this.cySelector('entities.table.selectionCount', { slug }),\n row: (id: string) => this.cySelector('entities.table.row', { slug, id }),\n rowSelect: (id: string) => this.cySelector('entities.table.rowSelect', { slug, id }),\n rowMenu: (id: string) => this.cySelector('entities.table.rowMenu', { slug, id }),\n rowAction: (action: string, id: string) => this.cySelector('entities.table.rowAction', { slug, action, id }),\n cell: (field: string, id: string) => this.cySelector('entities.table.cell', { slug, field, id }),\n rowGeneric: `[data-cy^=\"${slug}-row-\"]`,\n\n // Pagination\n pagination: this.cySelector('entities.pagination.container', { slug }),\n pageSize: this.cySelector('entities.pagination.pageSize', { slug }),\n pageSizeOption: (size: string) => this.cySelector('entities.pagination.pageSizeOption', { slug, size }),\n pageInfo: this.cySelector('entities.pagination.pageInfo', { slug }),\n pageFirst: this.cySelector('entities.pagination.first', { slug }),\n pagePrev: this.cySelector('entities.pagination.prev', { slug }),\n pageNext: this.cySelector('entities.pagination.next', { slug }),\n pageLast: this.cySelector('entities.pagination.last', { slug }),\n\n // Header (detail pages) - modes: view, edit, create\n viewHeader: this.cySelector('entities.header.container', { slug, mode: 'view' }),\n editHeader: this.cySelector('entities.header.container', { slug, mode: 'edit' }),\n createHeader: this.cySelector('entities.header.container', { slug, mode: 'create' }),\n backButton: this.cySelector('entities.header.backButton', { slug }),\n editButton: this.cySelector('entities.header.editButton', { slug }),\n deleteButton: this.cySelector('entities.header.deleteButton', { slug }),\n copyId: this.cySelector('entities.header.copyId', { slug }),\n title: this.cySelector('entities.header.title', { slug }),\n\n // Delete confirmation\n deleteDialog: this.cySelector('entities.header.deleteDialog', { slug }),\n deleteCancel: this.cySelector('entities.header.deleteCancel', { slug }),\n deleteConfirm: this.cySelector('entities.header.deleteConfirm', { slug }),\n\n // Form\n form: this.cySelector('entities.form.container', { slug }),\n field: (name: string) => this.cySelector('entities.form.field', { slug, name }),\n submitButton: this.cySelector('entities.form.submitButton', { slug }),\n\n // Filters\n filter: (field: string) => this.cySelector('entities.filter.container', { slug, field }),\n filterTrigger: (field: string) => this.cySelector('entities.filter.trigger', { slug, field }),\n filterContent: (field: string) => this.cySelector('entities.filter.content', { slug, field }),\n filterOption: (field: string, value: string) => this.cySelector('entities.filter.option', { slug, field, value }),\n filterBadge: (field: string, value: string) => this.cySelector('entities.filter.badge', { slug, field, value }),\n filterRemoveBadge: (field: string, value: string) =>\n this.cySelector('entities.filter.removeBadge', { slug, field, value }),\n filterClearAll: (field: string) => this.cySelector('entities.filter.clearAll', { slug, field }),\n\n // Bulk actions\n bulkBar: this.cySelector('entities.bulk.bar', { slug }),\n bulkCount: this.cySelector('entities.bulk.count', { slug }),\n bulkSelectAll: this.cySelector('entities.bulk.selectAll', { slug }),\n bulkStatus: this.cySelector('entities.bulk.statusButton', { slug }),\n bulkDelete: this.cySelector('entities.bulk.deleteButton', { slug }),\n bulkClear: this.cySelector('entities.bulk.clearButton', { slug }),\n\n // Bulk status dialog\n bulkStatusDialog: this.cySelector('entities.bulk.statusDialog', { slug }),\n bulkStatusSelect: this.cySelector('entities.bulk.statusSelect', { slug }),\n bulkStatusOption: (value: string) => this.cySelector('entities.bulk.statusOption', { slug, value }),\n bulkStatusCancel: this.cySelector('entities.bulk.statusCancel', { slug }),\n bulkStatusConfirm: this.cySelector('entities.bulk.statusConfirm', { slug }),\n\n // Bulk delete dialog\n bulkDeleteDialog: this.cySelector('entities.bulk.deleteDialog', { slug }),\n bulkDeleteCancel: this.cySelector('entities.bulk.deleteCancel', { slug }),\n bulkDeleteConfirm: this.cySelector('entities.bulk.deleteConfirm', { slug }),\n\n // Generic confirm dialog\n confirmDialog: this.cySelector('entities.confirm.dialog', { slug }),\n confirmCancel: this.cySelector('entities.confirm.cancel', { slug }),\n confirmAction: this.cySelector('entities.confirm.action', { slug }),\n\n // Parent delete confirmation (EntityDetailWrapper - generic, no slug)\n parentDeleteConfirm: '[data-cy=\"confirm-delete\"]',\n parentDeleteCancel: '[data-cy=\"cancel-delete\"]',\n\n // Row action selectors (generic patterns for checking existence)\n rowActionEditGeneric: `[data-cy^=\"${slug}-action-edit-\"]`,\n rowActionDeleteGeneric: `[data-cy^=\"${slug}-action-delete-\"]`,\n\n // Detail view\n detail: this.cySelector('entities.detail.container', { slug }),\n }\n }\n\n // ============================================\n // NAVIGATION\n // ============================================\n\n /**\n * Navigate to entity list page\n */\n visitList() {\n cy.visit(`/dashboard/${this.slug}`)\n return this\n }\n\n /**\n * Navigate to create page\n */\n visitCreate() {\n cy.visit(`/dashboard/${this.slug}/create`)\n return this\n }\n\n /**\n * Navigate to edit page for specific entity\n */\n visitEdit(id: string) {\n cy.visit(`/dashboard/${this.slug}/${id}/edit`)\n return this\n }\n\n /**\n * Navigate to detail/view page for specific entity\n */\n visitDetail(id: string) {\n cy.visit(`/dashboard/${this.slug}/${id}`)\n return this\n }\n\n // ============================================\n // API-AWARE NAVIGATION\n // ============================================\n\n /**\n * Navigate to list and wait for API response\n */\n visitListWithApiWait() {\n this.setupApiIntercepts()\n this.visitList()\n this.api.waitForList()\n return this\n }\n\n /**\n * Navigate to edit page and wait for form to be visible\n */\n visitEditWithApiWait(id: string) {\n this.setupApiIntercepts()\n this.visitEdit(id)\n this.waitForForm()\n return this\n }\n\n /**\n * Navigate to detail page and wait for content\n */\n visitDetailWithApiWait(id: string) {\n this.setupApiIntercepts()\n this.visitDetail(id)\n this.waitForDetail()\n return this\n }\n\n // ============================================\n // WAITS\n // ============================================\n\n /**\n * Wait for list page to be fully loaded\n */\n waitForList() {\n cy.url().should('include', `/dashboard/${this.slug}`)\n cy.get(this.selectors.tableContainer, { timeout: 15000 }).should('be.visible')\n return this\n }\n\n /**\n * Wait for form to be visible\n */\n waitForForm() {\n cy.get(this.selectors.form, { timeout: 15000 }).should('be.visible')\n return this\n }\n\n /**\n * Wait for detail page to be loaded\n */\n waitForDetail() {\n cy.url().should('match', new RegExp(`/dashboard/${this.slug}/[a-z0-9-]+$`))\n cy.get(this.selectors.editButton, { timeout: 15000 }).should('be.visible')\n return this\n }\n\n // ============================================\n // TABLE ACTIONS\n // ============================================\n\n /**\n * Click the Add/Create button\n */\n clickAdd() {\n cy.get(this.selectors.addButton).click()\n return this\n }\n\n /**\n * Type in the search input\n */\n search(term: string) {\n cy.get(this.selectors.search).clear().type(term)\n return this\n }\n\n /**\n * Clear the search input\n */\n clearSearch() {\n cy.get(this.selectors.searchClear).click()\n return this\n }\n\n /**\n * Click a specific row by ID\n */\n clickRow(id: string) {\n cy.get(this.selectors.row(id)).click()\n return this\n }\n\n /**\n * Find and click a row containing specific text\n */\n clickRowByText(text: string) {\n cy.contains(this.selectors.rowGeneric, text).click()\n return this\n }\n\n /**\n * Select a row checkbox\n */\n selectRow(id: string) {\n cy.get(this.selectors.rowSelect(id)).click()\n return this\n }\n\n /**\n * Open the row menu (three dots)\n */\n openRowMenu(id: string) {\n cy.get(this.selectors.rowMenu(id)).click()\n return this\n }\n\n /**\n * Click an action in the row menu\n */\n clickRowAction(action: string, id: string) {\n cy.get(this.selectors.rowAction(action, id)).click()\n return this\n }\n\n // ============================================\n // FILTERS\n // ============================================\n\n /**\n * Open a filter dropdown\n */\n openFilter(field: string) {\n cy.get(this.selectors.filterTrigger(field)).click()\n return this\n }\n\n /**\n * Select a filter option\n */\n selectFilterOption(field: string, value: string) {\n cy.get(this.selectors.filterOption(field, value)).click()\n return this\n }\n\n /**\n * Open filter and select option (convenience method)\n */\n selectFilter(field: string, value: string) {\n this.openFilter(field)\n this.selectFilterOption(field, value)\n return this\n }\n\n /**\n * Remove a filter badge\n */\n removeFilterBadge(field: string, value: string) {\n cy.get(this.selectors.filterRemoveBadge(field, value)).click()\n return this\n }\n\n /**\n * Clear all values for a filter\n */\n clearFilter(field: string) {\n cy.get(this.selectors.filterClearAll(field)).click()\n return this\n }\n\n // ============================================\n // PAGINATION\n // ============================================\n\n /**\n * Go to next page\n */\n nextPage() {\n cy.get(this.selectors.pageNext).click()\n return this\n }\n\n /**\n * Go to previous page\n */\n prevPage() {\n cy.get(this.selectors.pagePrev).click()\n return this\n }\n\n /**\n * Go to first page\n */\n firstPage() {\n cy.get(this.selectors.pageFirst).click()\n return this\n }\n\n /**\n * Go to last page\n */\n lastPage() {\n cy.get(this.selectors.pageLast).click()\n return this\n }\n\n /**\n * Change page size\n */\n setPageSize(size: string) {\n cy.get(this.selectors.pageSize).click()\n cy.get(this.selectors.pageSizeOption(size)).click()\n return this\n }\n\n // ============================================\n // FORM ACTIONS\n // ============================================\n\n /**\n * Fill a text input field\n */\n fillTextField(name: string, value: string) {\n cy.get(this.selectors.field(name)).find('input').clear().type(value)\n return this\n }\n\n /**\n * Fill a textarea field\n */\n fillTextarea(name: string, value: string) {\n cy.get(this.selectors.field(name)).find('textarea').clear().type(value)\n return this\n }\n\n /**\n * Select an option in a combobox/select field\n */\n selectOption(name: string, value: string) {\n cy.get(this.selectors.field(name)).find('[role=\"combobox\"]').click()\n cy.get(`[data-cy=\"${this.slug}-field-${name}-option-${value}\"]`).click()\n return this\n }\n\n /**\n * Submit the form\n */\n submitForm() {\n cy.get(this.selectors.submitButton).click()\n return this\n }\n\n // ============================================\n // HEADER/DETAIL ACTIONS\n // ============================================\n\n /**\n * Click back button\n */\n clickBack() {\n cy.get(this.selectors.backButton).click()\n return this\n }\n\n /**\n * Click edit button\n */\n clickEdit() {\n cy.get(this.selectors.editButton).click()\n return this\n }\n\n /**\n * Click delete button\n */\n clickDelete() {\n cy.get(this.selectors.deleteButton).click()\n return this\n }\n\n /**\n * Confirm delete in dialog\n */\n confirmDelete() {\n cy.get(this.selectors.deleteConfirm).click()\n return this\n }\n\n /**\n * Cancel delete in dialog\n */\n cancelDelete() {\n cy.get(this.selectors.deleteCancel).click()\n return this\n }\n\n // ============================================\n // BULK ACTIONS\n // ============================================\n\n /**\n * Select all items using table header checkbox\n */\n selectAll() {\n cy.get(this.selectors.selectAll).click()\n return this\n }\n\n /**\n * Click bulk delete button\n */\n bulkDelete() {\n cy.get(this.selectors.bulkDelete).click()\n return this\n }\n\n /**\n * Confirm bulk delete\n */\n confirmBulkDelete() {\n cy.get(this.selectors.bulkDeleteConfirm).click()\n return this\n }\n\n /**\n * Cancel bulk delete\n */\n cancelBulkDelete() {\n cy.get(this.selectors.bulkDeleteCancel).click()\n return this\n }\n\n /**\n * Click bulk status button\n */\n bulkChangeStatus() {\n cy.get(this.selectors.bulkStatus).click()\n return this\n }\n\n /**\n * Select status in bulk status dialog\n */\n selectBulkStatus(value: string) {\n cy.get(this.selectors.bulkStatusSelect).click()\n cy.get(this.selectors.bulkStatusOption(value)).click()\n return this\n }\n\n /**\n * Confirm bulk status change\n */\n confirmBulkStatus() {\n cy.get(this.selectors.bulkStatusConfirm).click()\n return this\n }\n\n /**\n * Clear selection\n */\n clearSelection() {\n cy.get(this.selectors.bulkClear).click()\n return this\n }\n\n // ============================================\n // ASSERTIONS\n // ============================================\n\n /**\n * Assert text is visible in the list\n */\n assertInList(text: string) {\n cy.contains(text).should('be.visible')\n return this\n }\n\n /**\n * Assert text is not in the list\n */\n assertNotInList(text: string) {\n cy.contains(text).should('not.exist')\n return this\n }\n\n /**\n * Assert table is visible\n */\n assertTableVisible() {\n cy.get(this.selectors.table).should('be.visible')\n return this\n }\n\n /**\n * Assert form is visible\n */\n assertFormVisible() {\n cy.get(this.selectors.form).should('be.visible')\n return this\n }\n\n /**\n * Assert page title contains text\n */\n assertPageTitle(expected: string) {\n cy.get(this.selectors.title).should('contain.text', expected)\n return this\n }\n\n /**\n * Assert row exists\n */\n assertRowExists(id: string) {\n cy.get(this.selectors.row(id)).should('exist')\n return this\n }\n\n /**\n * Assert row does not exist\n */\n assertRowNotExists(id: string) {\n cy.get(this.selectors.row(id)).should('not.exist')\n return this\n }\n\n /**\n * Assert selection count\n */\n assertSelectionCount(count: number) {\n cy.get(this.selectors.selectionCount).should('contain.text', count.toString())\n return this\n }\n\n /**\n * Assert bulk bar is visible\n */\n assertBulkBarVisible() {\n cy.get(this.selectors.bulkBar).should('be.visible')\n return this\n }\n\n /**\n * Assert bulk bar is hidden\n */\n assertBulkBarHidden() {\n cy.get(this.selectors.bulkBar).should('not.be.visible')\n return this\n }\n}\n\nexport default DashboardEntityPOMCore\n"]}