mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-02 14:30:43 +00:00
113 lines
3.4 KiB
JavaScript
113 lines
3.4 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
// This file might be required from a node script (./bin/update.js), so don't use
|
|
// Chrome API here.
|
|
|
|
/**
|
|
* Return the compatibility table from given compatNode and specified terms.
|
|
* For example, if the terms is ["background-color"],
|
|
* this function returns compatNode["background-color"].__compat.
|
|
*
|
|
* @return {Object} compatibility table
|
|
* {
|
|
* description: {String} Description of this compatibility table.
|
|
* mdn_url: {String} Document in the MDN.
|
|
* support: {
|
|
* $browserName: {String} $browserName is such as firefox, firefox_android and so on.
|
|
* [
|
|
* {
|
|
* added: {String}
|
|
* The version this feature was added.
|
|
* removed: {String} Optional.
|
|
* The version this feature was removed. Optional.
|
|
* prefix: {String} Optional.
|
|
* The prefix this feature is needed such as "-moz-".
|
|
* alternative_name: {String} Optional.
|
|
* The alternative name of this feature such as "-moz-osx-font-smoothing" of "font-smooth".
|
|
* notes: {String} Optional.
|
|
* A simple note for this support.
|
|
* },
|
|
* ...
|
|
* ],
|
|
* },
|
|
* status: {
|
|
* experimental: {Boolean} If true, this feature is experimental.
|
|
* standard_track: {Boolean}, If true, this feature is on the standard track.
|
|
* deprecated: {Boolean} If true, this feature is deprecated.
|
|
* }
|
|
* }
|
|
*/
|
|
function getCompatTable(compatNode, terms) {
|
|
let targetNode = getCompatNode(compatNode, terms);
|
|
|
|
if (!targetNode) {
|
|
return null;
|
|
}
|
|
|
|
if (!targetNode.__compat) {
|
|
for (const field in targetNode) {
|
|
// TODO: We don't have a way to know the context for now.
|
|
// Thus, use first context node as the compat table.
|
|
// e.g. flex_context of align-item
|
|
// https://github.com/mdn/browser-compat-data/blob/master/css/properties/align-items.json#L5
|
|
if (field.endsWith("_context")) {
|
|
targetNode = targetNode[field];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return targetNode.__compat;
|
|
}
|
|
|
|
/**
|
|
* Return a compatibility node which is target for `terms` parameter from `compatNode`
|
|
* parameter. For example, when check `background-clip: content-box;`, the `terms` will
|
|
* be ["background-clip", "content-box"]. Then, follow the name of terms from the
|
|
* compatNode node, return the target node. Although this function actually do more
|
|
* complex a bit, if it says simply, returns a node of
|
|
* compatNode["background-clip"]["content-box""] .
|
|
*/
|
|
function getCompatNode(compatNode, terms) {
|
|
for (const term of terms) {
|
|
compatNode = getChildCompatNode(compatNode, term);
|
|
if (!compatNode) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return compatNode;
|
|
}
|
|
|
|
function getChildCompatNode(compatNode, term) {
|
|
term = term.toLowerCase();
|
|
|
|
let child = null;
|
|
for (const field in compatNode) {
|
|
if (field.toLowerCase() === term) {
|
|
child = compatNode[field];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!child) {
|
|
return null;
|
|
}
|
|
|
|
if (child._aliasOf) {
|
|
// If the node is an alias, returns the node the alias points.
|
|
child = compatNode[child._aliasOf];
|
|
}
|
|
|
|
return child;
|
|
}
|
|
|
|
module.exports = {
|
|
getCompatNode,
|
|
getCompatTable,
|
|
};
|