133 lines
3.4 KiB
JavaScript
133 lines
3.4 KiB
JavaScript
/**
|
|
* Feature Flags Configuration
|
|
*
|
|
* Defines all feature flags with metadata.
|
|
* Uses build-time obfuscation for production security.
|
|
*
|
|
* Pattern:
|
|
* - Development: Flags easily toggled via Developer Tools (Ctrl+Shift+D)
|
|
* - Production: Flags obfuscated and require permission-based backend query
|
|
* - All flags checked at runtime via useFeatureFlags composable
|
|
*
|
|
* Usage in components:
|
|
* ```javascript
|
|
* const { isEnabled } = useFeatureFlags();
|
|
* if (isEnabled('experimental-search')) { ... }
|
|
* ```
|
|
*/
|
|
|
|
export const FEATURE_FLAGS = {
|
|
// Gamemaster Explorer Features
|
|
EXPERIMENTAL_SEARCH: {
|
|
name: 'experimental-search',
|
|
description: 'Enable experimental search with regex support',
|
|
enabled: false,
|
|
requiredPermission: null,
|
|
tags: ['gamemaster', 'search']
|
|
},
|
|
|
|
GAMEMASTER_DIFF_VIEWER: {
|
|
name: 'gamemaster-diff-viewer',
|
|
description: 'Enable diff viewer for gamemaster file comparisons',
|
|
enabled: false,
|
|
requiredPermission: 'gamemaster-advanced',
|
|
tags: ['gamemaster', 'ui']
|
|
},
|
|
|
|
GAMEMASTER_BOOKMARKS: {
|
|
name: 'gamemaster-bookmarks',
|
|
description: 'Enable bookmarking feature for favorite gamemasters',
|
|
enabled: false,
|
|
requiredPermission: null,
|
|
tags: ['gamemaster', 'storage']
|
|
},
|
|
|
|
// Challonge Test Features
|
|
CHALLONGE_CACHED_TOURNAMENTS: {
|
|
name: 'challonge-cached-tournaments',
|
|
description: 'Cache tournament data for faster loading',
|
|
enabled: false,
|
|
requiredPermission: 'challonge-advanced',
|
|
tags: ['challonge', 'performance']
|
|
},
|
|
|
|
CHALLONGE_EXPORT_CSV: {
|
|
name: 'challonge-export-csv',
|
|
description: 'Allow exporting tournament data to CSV',
|
|
enabled: false,
|
|
requiredPermission: null,
|
|
tags: ['challonge', 'export']
|
|
},
|
|
|
|
// Developer/Admin Features
|
|
DEVELOPER_TOOLS: {
|
|
name: 'developer-tools',
|
|
description: 'Show developer tools panel (Ctrl+Shift+D)',
|
|
enabled: process.env.NODE_ENV === 'development',
|
|
requiredPermission: null,
|
|
tags: ['developer']
|
|
},
|
|
|
|
ADMIN_PANEL: {
|
|
name: 'admin-panel',
|
|
description: 'Show admin panel with system information',
|
|
enabled: false,
|
|
requiredPermission: 'admin',
|
|
tags: ['admin', 'maintenance']
|
|
},
|
|
|
|
// Performance Features
|
|
ENABLE_CACHING: {
|
|
name: 'enable-caching',
|
|
description: 'Enable client-side caching for API responses',
|
|
enabled: true,
|
|
requiredPermission: null,
|
|
tags: ['performance']
|
|
},
|
|
|
|
// UI Features
|
|
DARK_MODE: {
|
|
name: 'dark-mode',
|
|
description: 'Enable dark mode theme',
|
|
enabled: false,
|
|
requiredPermission: null,
|
|
tags: ['ui', 'theme']
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get all feature flags
|
|
* @returns {Object} All feature flags
|
|
*/
|
|
export function getAllFlags() {
|
|
return FEATURE_FLAGS;
|
|
}
|
|
|
|
/**
|
|
* Get flag by name
|
|
* @param {string} name - Flag name
|
|
* @returns {Object|null} Flag object or null if not found
|
|
*/
|
|
export function getFlag(name) {
|
|
return Object.values(FEATURE_FLAGS).find(flag => flag.name === name) || null;
|
|
}
|
|
|
|
/**
|
|
* Get all flags for a specific tag
|
|
* @param {string} tag - Tag name
|
|
* @returns {Object[]} Array of flags with the tag
|
|
*/
|
|
export function getFlagsByTag(tag) {
|
|
return Object.values(FEATURE_FLAGS).filter(flag => flag.tags.includes(tag));
|
|
}
|
|
|
|
/**
|
|
* Check if flag requires specific permission
|
|
* @param {string} name - Flag name
|
|
* @returns {string|null} Required permission or null if no permission required
|
|
*/
|
|
export function getFlagPermission(name) {
|
|
const flag = getFlag(name);
|
|
return flag ? flag.requiredPermission : null;
|
|
}
|