✨ Add feature flags configuration for Pokedex Online
This commit is contained in:
132
code/websites/pokedex.online/src/config/feature-flags.js
Normal file
132
code/websites/pokedex.online/src/config/feature-flags.js
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user