(
provider: SourceProvider,
baseDir: string,
context: BuildContext = {}
)
| 127 | } |
| 128 | |
| 129 | export async function buildProviderData( |
| 130 | provider: SourceProvider, |
| 131 | baseDir: string, |
| 132 | context: BuildContext = {} |
| 133 | ): Promise<SourceProviderData> { |
| 134 | const normalizedProvider = sourceProviderSchema.parse(provider); |
| 135 | const fetcher = context.fetcher ?? defaultFetcher; |
| 136 | const sourceRules = await loadSourceRules(normalizedProvider.sources, baseDir, fetcher, context.cache); |
| 137 | const removeRules = normalizePartialRuleSet(normalizedProvider.patch.remove); |
| 138 | const explicitRules = mergeRuleSets( |
| 139 | normalizedProvider.groups.map((group) => normalizePartialRuleSet(group.include)) |
| 140 | ); |
| 141 | let remainingSourceRules = subtractRuleSet(subtractRuleSet(sourceRules, removeRules), explicitRules); |
| 142 | |
| 143 | const groups: RuleGroup[] = []; |
| 144 | |
| 145 | for (const group of normalizedProvider.groups) { |
| 146 | const includeRules = normalizePartialRuleSet(group.include); |
| 147 | const requestedKeys = resolveFromSourceKeys(group.fromSource); |
| 148 | const sourceGroupRules = pickRuleKeys(remainingSourceRules, requestedKeys); |
| 149 | let rules = mergeRuleSets([includeRules, sourceGroupRules]); |
| 150 | rules = subtractRuleSet(rules, removeRules); |
| 151 | |
| 152 | groups.push({ |
| 153 | name: group.name, |
| 154 | rules |
| 155 | }); |
| 156 | |
| 157 | if (requestedKeys.length > 0) { |
| 158 | remainingSourceRules = subtractRuleSet(remainingSourceRules, sourceGroupRules); |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | const normalizedGroups = compactGroups(removeCoveredDomains(groups.map((group) => group.rules)), groups); |
| 163 | |
| 164 | return { |
| 165 | provider: normalizedProvider.provider, |
| 166 | name: normalizedProvider.name, |
| 167 | description: normalizedProvider.description, |
| 168 | categories: normalizedProvider.categories, |
| 169 | aliases: normalizedProvider.aliases, |
| 170 | allowDangerousDomainSuffix: normalizedProvider.allowDangerousDomainSuffix, |
| 171 | groups: normalizedGroups |
| 172 | }; |
| 173 | } |
| 174 | |
| 175 | function resolveFromSourceKeys(value: boolean | RuleKey[]): RuleKey[] { |
| 176 | if (value === true) { |
no test coverage detected