import type { ConstraintValidator, ProjectPluginConfigSubModulesField } from '@/types' export const iconFormat: ConstraintValidator = (pattern) => async ({ pluginConfig, mode, type: moduleType }) => { if (mode === 'add') { return } const targetModules = (pluginConfig.modules || []).filter( (module) => module.moduleType === moduleType, ) const modulesToCheck: ProjectPluginConfigSubModulesField[] = [] const addModulesToCheck = (module: ProjectPluginConfigSubModulesField) => { modulesToCheck.push(module) if (Array.isArray(module.modules)) { module.modules.forEach(addModulesToCheck) } } targetModules.forEach(addModulesToCheck) const modulesWithInvalidIcon = modulesToCheck.filter((module) => { const hasIcon = module.icon !== null && module.icon !== undefined const hasValidIconFormat = typeof module.icon === 'string' && pattern.test(module.icon) return hasIcon && !hasValidIconFormat }) if (modulesWithInvalidIcon.length > 0) { throw modulesWithInvalidIcon .map(({ id, icon }) => { return `the module ${moduleType}@${id}'s icon '${icon}' doesn't match the pattern '${pattern.toString()}'` }) .join('\n') } }