core/plugins/manifest.domain.plugin.ts
core/plugins/manifest.domain.plugin.ts is a file in GovLab Docs. 55 lines of code and 11 definitions.
import {
MANIFEST_ERRORS,
domainObject,
duplicateDomain,
unknownDomainMeta,
unknownDomainSub,
} from "#configuration/strings/manifest.strings";
import { isDomainMeta, isDomainSub } from "#core/predicates/taxonomy.domain.predicate";
import type { ManifestPlugin } from "#types/manifest.types";
import { isPlainRecord } from "#core/predicates/record.predicate";
const SECTION = "domains";
const KEY_SEPARATOR = "/";
const entryErrors = function entryErrors(domain: unknown, at: string): string[] {
if (!isPlainRecord(domain)) {
return [domainObject(at)];
}
const { meta, sub } = domain;
if (!isDomainMeta(meta)) {
return [unknownDomainMeta(at, String(meta))];
}
return isDomainSub(meta, sub) ? [] : [unknownDomainSub(at, String(sub), meta)];
};
const domainKey = function domainKey(domain: unknown): string | null {
return isPlainRecord(domain) ? [String(domain["meta"]), String(domain["sub"])].join(KEY_SEPARATOR) : null;
};
const duplicateErrors = function duplicateErrors(domains: readonly unknown[]): string[] {
const keys = domains.map(domainKey);
return keys.flatMap((key, index) =>
key !== null && keys.indexOf(key) < index ? [duplicateDomain(index, key)] : [],
);
};
export const plugin: ManifestPlugin = {
contribute(manifest, entry) {
const domains = manifest[SECTION];
if (Array.isArray(domains) && domains.length > 0) {
entry[SECTION] = domains
.filter(isPlainRecord)
.map((domain) => ({ meta: domain["meta"], sub: domain["sub"] }));
}
},
name: "domains",
section: {
keys: [SECTION],
validate(manifest) {
const domains = manifest[SECTION];
if (!Array.isArray(domains) || domains.length === 0) {
return [MANIFEST_ERRORS.domainsRequired];
}
return [
...domains.flatMap((domain, index) => entryErrors(domain, `${SECTION}[${index}]`)),
...duplicateErrors(domains),
];
},
},
};