@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"],"names":["sel","cySelector","selDev","entitySelectors"],"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"]}
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Testing Utilities
3
+ * Helper functions for consistent testing attribute generation
4
+ */
5
+ /**
6
+ * Test ID pattern type
7
+ */
8
+ type TestIdPattern = string;
9
+ /**
10
+ * Cypress ID pattern type
11
+ */
12
+ type CypressIdPattern = string;
13
+ /**
14
+ * Create consistent test IDs following the pattern: [component]-[element]-[action?]
15
+ *
16
+ * @param component - Main component name (e.g., 'task', 'nav', 'user')
17
+ * @param element - Element type (e.g., 'card', 'button', 'input')
18
+ * @param action - Optional action (e.g., 'delete', 'edit', 'toggle')
19
+ * @returns Test ID string or undefined in production
20
+ */
21
+ declare function createTestId(component: string, element: string, action?: string): string | undefined;
22
+ /**
23
+ * Create Cypress-specific IDs following the pattern: [domain]-[element]
24
+ *
25
+ * @param domain - Application domain (e.g., 'todo', 'nav', 'user')
26
+ * @param element - Element identifier (e.g., 'item', 'button', 'menu')
27
+ * @returns Cypress ID string or undefined in production
28
+ */
29
+ declare function createCyId(domain: string, element: string): string | undefined;
30
+ /**
31
+ * Create state-based data attributes for conditional testing
32
+ *
33
+ * @param state - Current state value
34
+ * @returns State attribute value
35
+ */
36
+ declare function createStateAttr(state: 'active' | 'completed' | 'pending' | 'loading' | 'error'): string;
37
+ /**
38
+ * Create priority-based data attributes
39
+ *
40
+ * @param priority - Priority level
41
+ * @returns Priority attribute value
42
+ */
43
+ declare function createPriorityAttr(priority: 'low' | 'medium' | 'high'): string;
44
+ /**
45
+ * Generate testing props object for components
46
+ *
47
+ * @param config - Testing configuration
48
+ * @returns Testing props object
49
+ */
50
+ declare function createTestingProps(config: {
51
+ testId?: string;
52
+ cyId?: string;
53
+ state?: 'active' | 'completed' | 'pending' | 'loading' | 'error';
54
+ priority?: 'low' | 'medium' | 'high';
55
+ taskId?: string;
56
+ userId?: string;
57
+ }): {
58
+ [k: string]: string | undefined;
59
+ };
60
+ /**
61
+ * Accessibility helper for dynamic aria-label generation
62
+ *
63
+ * @param template - Label template with placeholders
64
+ * @param values - Values to replace placeholders
65
+ * @returns Formatted aria-label
66
+ */
67
+ declare function createAriaLabel(template: string, values: Record<string, string | number | boolean>): string;
68
+ /**
69
+ * Common testing patterns for different component types
70
+ */
71
+ declare const testingPatterns: {
72
+ task: {
73
+ card: (taskId: string) => {
74
+ [k: string]: string | undefined;
75
+ };
76
+ checkbox: () => {
77
+ [k: string]: string | undefined;
78
+ };
79
+ title: () => {
80
+ [k: string]: string | undefined;
81
+ };
82
+ deleteButton: () => {
83
+ [k: string]: string | undefined;
84
+ };
85
+ };
86
+ nav: {
87
+ searchDropdown: () => {
88
+ [k: string]: string | undefined;
89
+ };
90
+ notifications: () => {
91
+ [k: string]: string | undefined;
92
+ };
93
+ userMenu: () => {
94
+ [k: string]: string | undefined;
95
+ };
96
+ };
97
+ form: {
98
+ input: (fieldName: string) => {
99
+ [k: string]: string | undefined;
100
+ };
101
+ submitButton: () => {
102
+ [k: string]: string | undefined;
103
+ };
104
+ };
105
+ };
106
+ /**
107
+ * Keyboard navigation helpers
108
+ */
109
+ declare const keyboardHelpers: {
110
+ /**
111
+ * Handle Enter and Space key activation
112
+ */
113
+ createActivationHandler: (onActivate: () => void) => (e: React.KeyboardEvent) => void;
114
+ /**
115
+ * Handle Escape key for closing
116
+ */
117
+ createEscapeHandler: (onClose: () => void) => (e: React.KeyboardEvent) => void;
118
+ /**
119
+ * Handle arrow navigation in lists
120
+ */
121
+ createArrowNavigationHandler: (currentIndex: number, maxIndex: number, onIndexChange: (index: number) => void) => (e: React.KeyboardEvent) => void;
122
+ };
123
+ /**
124
+ * Create entity-specific Cypress ID following the convention: {slug}-{component}-{detail?}
125
+ *
126
+ * @param entitySlug - Entity slug from config (e.g., 'squads', 'people', 'projects')
127
+ * @param component - Component type (e.g., 'form', 'field', 'section', 'table')
128
+ * @param detail - Optional detail (e.g., field name, section name, action)
129
+ * @returns Cypress ID string or undefined in production
130
+ *
131
+ * @example
132
+ * createEntityCyId('squads', 'form') // 'squads-form'
133
+ * createEntityCyId('squads', 'field', 'name') // 'squads-field-name'
134
+ * createEntityCyId('squads', 'form', 'submit') // 'squads-form-submit'
135
+ */
136
+ declare function createEntityCyId(entitySlug: string, component: string, detail?: string): string | undefined;
137
+ /**
138
+ * Entity testing helper interface
139
+ */
140
+ interface EntityTestingHelper {
141
+ /** Generic selector: {slug}-{component}-{detail?} - Use for custom/non-standard selectors */
142
+ get: (component: string, detail?: string) => string | undefined;
143
+ /** {slug}-page */
144
+ page: () => string | undefined;
145
+ /** {slug}-form-page */
146
+ formPage: () => string | undefined;
147
+ /** {slug}-form */
148
+ form: () => string | undefined;
149
+ /** {slug}-form-submit */
150
+ formSubmit: () => string | undefined;
151
+ /** {slug}-form-cancel */
152
+ formCancel: () => string | undefined;
153
+ /** {slug}-field-{name} */
154
+ field: (name: string) => string | undefined;
155
+ /** {slug}-field-{name}-option-{value} */
156
+ fieldOption: (name: string, value: string) => string | undefined;
157
+ /** {slug}-field-{name}-error */
158
+ fieldError: (name: string) => string | undefined;
159
+ /** {slug}-section-{name} */
160
+ section: (name: string) => string | undefined;
161
+ /** {slug}-card-{id} */
162
+ card: (id: string) => string | undefined;
163
+ /** {slug}-table */
164
+ table: () => string | undefined;
165
+ /** {slug}-row-{id} */
166
+ row: (id: string) => string | undefined;
167
+ /** {slug}-create-btn */
168
+ createBtn: () => string | undefined;
169
+ /** {slug}-search-input */
170
+ searchInput: () => string | undefined;
171
+ /** {slug}-filter-{field} */
172
+ filter: (field: string) => string | undefined;
173
+ /** {slug}-filter-{field}-trigger */
174
+ filterTrigger: (field: string) => string | undefined;
175
+ /** {slug}-filter-{field}-option-{value} */
176
+ filterOption: (field: string, value: string) => string | undefined;
177
+ /** {slug}-action-{action}-{id} */
178
+ action: (action: string, id: string) => string | undefined;
179
+ /** {slug}-actions-trigger-{id} */
180
+ actionsTrigger: (id: string) => string | undefined;
181
+ /** {slug}-confirm-delete */
182
+ confirmDelete: () => string | undefined;
183
+ /** {slug}-confirm-delete-btn */
184
+ confirmDeleteBtn: () => string | undefined;
185
+ /** {slug}-cancel-delete-btn */
186
+ cancelDeleteBtn: () => string | undefined;
187
+ }
188
+ /**
189
+ * Create a testing helper factory for a specific entity.
190
+ * Uses the entity slug from config to generate consistent data-cy selectors.
191
+ *
192
+ * Convention: {slug}-{component}-{detail}
193
+ *
194
+ * @param entitySlug - Entity slug from EntityConfig (e.g., 'squads', 'people')
195
+ * @returns EntityTestingHelper with pre-bound selector generators
196
+ *
197
+ * @example
198
+ * // In your component file:
199
+ * import { createEntityTestingHelper } from '@nextsparkjs/testing/utils'
200
+ * import { squadsEntityConfig } from './squads.config'
201
+ *
202
+ * const testId = createEntityTestingHelper(squadsEntityConfig.slug)
203
+ *
204
+ * // Usage in JSX:
205
+ * <div data-cy={testId.formPage()}> // squads-form-page
206
+ * <form data-cy={testId.form()}> // squads-form
207
+ * <div data-cy={testId.section('basic')}> // squads-section-basic
208
+ * <input data-cy={testId.field('name')} /> // squads-field-name
209
+ * </div>
210
+ * <button data-cy={testId.formSubmit()}> // squads-form-submit
211
+ * Submit
212
+ * </button>
213
+ * </form>
214
+ * </div>
215
+ *
216
+ * // Card example:
217
+ * <Card data-cy={testId.card(squad.id)}> // squads-card-{id}
218
+ *
219
+ * // Custom selector example (for non-standard selectors):
220
+ * <div data-cy={testId.get('color-preset', color)}> // squads-color-preset-{color}
221
+ */
222
+ declare function createEntityTestingHelper(entitySlug: string): EntityTestingHelper;
223
+
224
+ export { type CypressIdPattern, type EntityTestingHelper, type TestIdPattern, createAriaLabel, createCyId, createEntityCyId, createEntityTestingHelper, createPriorityAttr, createStateAttr, createTestId, createTestingProps, keyboardHelpers, testingPatterns };
@@ -0,0 +1,183 @@
1
+ // src/utils/utils.ts
2
+ var isDevelopment = process.env.NODE_ENV === "development";
3
+ var isTest = process.env.NODE_ENV === "test";
4
+ var enableTestingAttributes = isDevelopment || isTest;
5
+ function createTestId(component, element, action) {
6
+ if (!enableTestingAttributes) return void 0;
7
+ const parts = [component, element, action].filter(Boolean);
8
+ return parts.join("-");
9
+ }
10
+ function createCyId(domain, element) {
11
+ if (!enableTestingAttributes) return void 0;
12
+ return `${domain}-${element}`;
13
+ }
14
+ function createStateAttr(state) {
15
+ return state;
16
+ }
17
+ function createPriorityAttr(priority) {
18
+ return priority;
19
+ }
20
+ function createTestingProps(config) {
21
+ const props = {};
22
+ if (config.testId) {
23
+ props["data-testid"] = enableTestingAttributes ? config.testId : void 0;
24
+ }
25
+ if (config.cyId) {
26
+ props["data-cy"] = enableTestingAttributes ? config.cyId : void 0;
27
+ }
28
+ if (config.state) {
29
+ props["data-state"] = config.state;
30
+ }
31
+ if (config.priority) {
32
+ props["data-priority"] = config.priority;
33
+ }
34
+ if (config.taskId) {
35
+ props["data-task-id"] = config.taskId;
36
+ }
37
+ if (config.userId) {
38
+ props["data-user-id"] = config.userId;
39
+ }
40
+ return Object.fromEntries(
41
+ Object.entries(props).filter((entry) => entry[1] !== void 0)
42
+ );
43
+ }
44
+ function createAriaLabel(template, values) {
45
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
46
+ return String(values[key] ?? match);
47
+ });
48
+ }
49
+ var testingPatterns = {
50
+ // Task/Todo components
51
+ task: {
52
+ card: (taskId) => createTestingProps({
53
+ testId: createTestId("task", "card"),
54
+ cyId: createCyId("task", "item"),
55
+ taskId
56
+ }),
57
+ checkbox: () => createTestingProps({
58
+ testId: createTestId("task", "checkbox"),
59
+ cyId: createCyId("task", "toggle")
60
+ }),
61
+ title: () => createTestingProps({
62
+ testId: createTestId("task", "title"),
63
+ cyId: createCyId("task", "title")
64
+ }),
65
+ deleteButton: () => createTestingProps({
66
+ testId: createTestId("task", "delete", "button"),
67
+ cyId: createCyId("task", "delete")
68
+ })
69
+ },
70
+ // Navigation components
71
+ nav: {
72
+ searchDropdown: () => createTestingProps({
73
+ testId: createTestId("nav", "search", "dropdown"),
74
+ cyId: createCyId("nav", "search")
75
+ }),
76
+ notifications: () => createTestingProps({
77
+ testId: createTestId("nav", "notifications", "button"),
78
+ cyId: createCyId("nav", "notifications")
79
+ }),
80
+ userMenu: () => createTestingProps({
81
+ testId: createTestId("nav", "user", "menu"),
82
+ cyId: createCyId("nav", "user-menu")
83
+ })
84
+ },
85
+ // Form components
86
+ form: {
87
+ input: (fieldName) => createTestingProps({
88
+ testId: createTestId("form", fieldName, "input"),
89
+ cyId: createCyId("form", fieldName)
90
+ }),
91
+ submitButton: () => createTestingProps({
92
+ testId: createTestId("form", "submit", "button"),
93
+ cyId: createCyId("form", "submit")
94
+ })
95
+ }
96
+ };
97
+ var keyboardHelpers = {
98
+ /**
99
+ * Handle Enter and Space key activation
100
+ */
101
+ createActivationHandler: (onActivate) => {
102
+ return (e) => {
103
+ if (e.key === "Enter" || e.key === " ") {
104
+ e.preventDefault();
105
+ onActivate();
106
+ }
107
+ };
108
+ },
109
+ /**
110
+ * Handle Escape key for closing
111
+ */
112
+ createEscapeHandler: (onClose) => {
113
+ return (e) => {
114
+ if (e.key === "Escape") {
115
+ e.preventDefault();
116
+ onClose();
117
+ }
118
+ };
119
+ },
120
+ /**
121
+ * Handle arrow navigation in lists
122
+ */
123
+ createArrowNavigationHandler: (currentIndex, maxIndex, onIndexChange) => {
124
+ return (e) => {
125
+ switch (e.key) {
126
+ case "ArrowDown":
127
+ e.preventDefault();
128
+ onIndexChange(currentIndex < maxIndex ? currentIndex + 1 : 0);
129
+ break;
130
+ case "ArrowUp":
131
+ e.preventDefault();
132
+ onIndexChange(currentIndex > 0 ? currentIndex - 1 : maxIndex);
133
+ break;
134
+ }
135
+ };
136
+ }
137
+ };
138
+ function createEntityCyId(entitySlug, component, detail) {
139
+ if (!enableTestingAttributes) return void 0;
140
+ const parts = [entitySlug, component, detail].filter(Boolean);
141
+ return parts.join("-");
142
+ }
143
+ function createEntityTestingHelper(entitySlug) {
144
+ return {
145
+ // Generic (framework-agnostic)
146
+ get: (component, detail) => createEntityCyId(entitySlug, component, detail),
147
+ // Page
148
+ page: () => createEntityCyId(entitySlug, "page"),
149
+ formPage: () => createEntityCyId(entitySlug, "form-page"),
150
+ // Form
151
+ form: () => createEntityCyId(entitySlug, "form"),
152
+ formSubmit: () => createEntityCyId(entitySlug, "form-submit"),
153
+ formCancel: () => createEntityCyId(entitySlug, "form-cancel"),
154
+ // Fields
155
+ field: (name) => createEntityCyId(entitySlug, "field", name),
156
+ fieldOption: (name, value) => createEntityCyId(entitySlug, `field-${name}-option`, value),
157
+ fieldError: (name) => createEntityCyId(entitySlug, `field-${name}`, "error"),
158
+ // Sections
159
+ section: (name) => createEntityCyId(entitySlug, "section", name),
160
+ // Card
161
+ card: (id) => createEntityCyId(entitySlug, "card", id),
162
+ // List/Table
163
+ table: () => createEntityCyId(entitySlug, "table"),
164
+ row: (id) => createEntityCyId(entitySlug, "row", id),
165
+ createBtn: () => createEntityCyId(entitySlug, "create-btn"),
166
+ searchInput: () => createEntityCyId(entitySlug, "search-input"),
167
+ // Filters
168
+ filter: (field) => createEntityCyId(entitySlug, "filter", field),
169
+ filterTrigger: (field) => createEntityCyId(entitySlug, `filter-${field}`, "trigger"),
170
+ filterOption: (field, value) => createEntityCyId(entitySlug, `filter-${field}-option`, value),
171
+ // Actions
172
+ action: (action, id) => createEntityCyId(entitySlug, `action-${action}`, id),
173
+ actionsTrigger: (id) => createEntityCyId(entitySlug, "actions-trigger", id),
174
+ // Dialogs
175
+ confirmDelete: () => createEntityCyId(entitySlug, "confirm-delete"),
176
+ confirmDeleteBtn: () => createEntityCyId(entitySlug, "confirm-delete-btn"),
177
+ cancelDeleteBtn: () => createEntityCyId(entitySlug, "cancel-delete-btn")
178
+ };
179
+ }
180
+
181
+ export { createAriaLabel, createCyId, createEntityCyId, createEntityTestingHelper, createPriorityAttr, createStateAttr, createTestId, createTestingProps, keyboardHelpers, testingPatterns };
182
+ //# sourceMappingURL=index.js.map
183
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\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"]}