| /* This file is a part of @mdn/browser-compat-data |
| * See LICENSE file for more information. */ |
| |
| /** @import {Identifier, BrowserStatement} from '../types/types.js' */ |
| |
| /** |
| * Join a path array together |
| * @param {...(string | undefined)} args The path to join together |
| * @returns {string} The combined path |
| */ |
| export const joinPath = (...args) => Array.from(args).filter(Boolean).join('.'); |
| |
| /** |
| * Check if an object is a BCD feature |
| * @param {*} obj The object to check |
| * @returns {obj is Identifier} Whether the object is a BCD feature |
| */ |
| export const isFeature = (obj) => '__compat' in obj; |
| |
| /** |
| * Check if an object is a browser statement |
| * @param {*} obj The object to check |
| * @returns {obj is BrowserStatement} Whether the object is a browser statement |
| */ |
| export const isBrowser = (obj) => 'name' in obj && 'releases' in obj; |
| |
| /** |
| * Get the descendant keys of an object, minus any features that start with two underscores |
| * @param {*} data The object to iterate |
| * @returns {string[]} The descendant keys |
| */ |
| export const descendantKeys = (data) => { |
| if (!data || typeof data !== 'object') { |
| // Return if the data isn't an object |
| return []; |
| } |
| |
| if (isFeature(data)) { |
| return Object.keys(data).filter((key) => !key.startsWith('__')); |
| } |
| |
| if (isBrowser(data)) { |
| // Browsers never have independently meaningful descendants |
| return []; |
| } |
| |
| return Object.keys(data).filter((key) => key !== '__meta'); |
| }; |