blob: 73c33ddd2dd865d577de82abfc89abfabcc920e9 [file] [edit]
/* This file is a part of @mdn/browser-compat-data
* See LICENSE file for more information. */
import mdnContentInventory from '@ddbeck/mdn-content-inventory';
/** @type {Map<string, string>} lowercase slug → canonical slug */
const slugs = (() => {
/** @type {Map<string, string>} */
const result = new Map();
for (const item of mdnContentInventory.inventory) {
result.set(item.frontmatter.slug.toLowerCase(), item.frontmatter.slug);
}
return result;
})();
// Page types that are overview/landing pages rather than specific reference pages.
// When a BCD key appears on both one of these and a reference page, the reference page wins.
const SKIP_PAGE_TYPES = new Set(['web-api-overview', 'guide', 'landing-page']);
/**
* Build a map from BCD path to MDN slug, preferring specific reference pages.
* @param {typeof mdnContentInventory.inventory} inventory The MDN content inventory to process
* @returns {Map<string, string>} Map from BCD path to MDN slug
*/
export const buildSlugByPath = (inventory) => {
const slugsByPath = new Map();
for (const item of inventory) {
if (!('browser-compat' in item.frontmatter)) {
continue;
}
if (SKIP_PAGE_TYPES.has(item.frontmatter['page-type'])) {
// Skip overview/landing pages; a reference page for the same BCD key is preferred.
continue;
}
const value = item.frontmatter['browser-compat'];
const paths = Array.isArray(value) ? value : [value];
const slug = item.frontmatter.slug;
for (const path of paths) {
const slugTail = slug.split('/').at(-1);
const pathTail = path.split('.').at(-1);
if (!slugTail.includes(pathTail) && !pathTail?.includes(slugTail)) {
// Ignore unrelated pages/features.
continue;
}
if (!slugsByPath.has(path)) {
slugsByPath.set(path, []);
}
slugsByPath.get(path)?.push(slug);
}
}
/** @type {Map<string, string>} */
const result = new Map();
slugsByPath.forEach((values, key) => {
if (values.length === 1) {
result.set(key, values[0]);
}
});
return result;
};
/** @type {Map<string, string>} BCD path → MDN slug (only unambiguous mappings) */
const slugByPath = buildSlugByPath(mdnContentInventory.inventory);
/**
* Mutable inventory data derived from `@ddbeck/mdn-content-inventory`.
* Properties can be reassigned in tests to inject mock data.
*/
export const inventory = {
slugs,
slugByPath,
redirects: mdnContentInventory.redirects,
};