shared/manifests/layer.manifest.ts
shared/manifests/layer.manifest.ts is a file in GovLab Extension Host. 79 lines of code and 24 definitions.
import { GOVERNED_ROOT, collapsePath } from "../resolvers/anchor.resolver.ts";
import { folderFor, isDeclaredContainer } from "./taxonomy.manifest.ts";
import { undeclaredConcernTag, undeclaredTierContainer } from "../strings/taxonomy.strings.ts";
const MEMBER_PREFIX = `${GOVERNED_ROOT}/`;
const container = function container(name: string): string {
if (!isDeclaredContainer(GOVERNED_ROOT, name)) {
throw new Error(undeclaredTierContainer(name, GOVERNED_ROOT));
}
return name;
};
const concern = function concern(tag: string): string {
const folder = folderFor(tag);
if (folder === undefined) {
throw new Error(undeclaredConcernTag(tag));
}
return folder;
};
export const PLATFORM_PATH_PREFIXES = [`${container("core")}/`];
export const PRODUCT_PATH_PREFIXES = [
`${container("domain")}/`,
`${container("presentation")}/`,
`${container("runtime")}/`,
];
const TYPES_PREFIX = `${container("types")}/`;
export const DERIVATION_MODULES: ReadonlySet<string> = new Set([
`${container("core")}/${concern("loader")}/definition.loader.ts`,
`${container("core")}/${concern("converter")}/definition.converter.ts`,
`${container("core")}/${concern("matcher")}/vocabulary.matcher.ts`,
`${container("configuration")}/${concern("constants")}/evidence.source.constants.ts`,
`${container("domain")}/${concern("converter")}/link.vocabulary.converter.ts`,
`${container("domain")}/${concern("converter")}/source.link.converter.ts`,
`${container("domain")}/${concern("converter")}/anatomy.reference.converter.ts`,
]);
const STRINGS_PREFIX = `${container("configuration")}/${concern("strings")}/`;
export const STRING_LAYERS = new Map<string, string>([[`${STRINGS_PREFIX}report.strings.ts`, "platform"]]);
export const TYPE_LAYERS = new Map<string, string>();
export const normalizePath = function normalizePath(path: string): string {
return path.split("\\").join("/");
};
export const relativeFromMember = function relativeFromMember(filepath: string): string {
const norm = normalizePath(filepath);
const idx = norm.indexOf(MEMBER_PREFIX);
return idx === -1 ? norm : norm.slice(idx + MEMBER_PREFIX.length);
};
const PER_FILE_OVERRIDES: readonly ReadonlyMap<string, string>[] = [TYPE_LAYERS, STRING_LAYERS];
const overrideFor = function overrideFor(rel: string): string | null {
for (const declared of PER_FILE_OVERRIDES) {
const hit = declared.get(rel);
if (hit !== undefined) {
return hit;
}
}
return null;
};
const prefixTier = function prefixTier(rel: string): string | null {
if (PLATFORM_PATH_PREFIXES.some((prefix) => rel.startsWith(prefix))) {
return "platform";
}
return PRODUCT_PATH_PREFIXES.some((prefix) => rel.startsWith(prefix)) ? "product" : null;
};
export const classifyFile = function classifyFile(filepath: string): string | null {
const rel = relativeFromMember(filepath);
const declared = overrideFor(rel);
if (declared !== null) {
return declared;
}
if (rel.startsWith(TYPES_PREFIX)) {
return null;
}
return rel.startsWith(STRINGS_PREFIX) ? "product" : prefixTier(rel);
};
export const resolveImportPath = function resolveImportPath(importerFile: string, importStr: string): string | null {
if (!importStr.startsWith(".")) {
return null;
}
const rel = relativeFromMember(importerFile);
const importerDir = rel.slice(0, rel.lastIndexOf("/"));
return collapsePath(`${importerDir}/${importStr}`);
};