/* See https://raw.githubusercontent.com/mozilla/kumascript/master/macros/Compat.ejs Run as `npm run render $query $depth $aggregateMode` (same parameters as e.g. a {{compat("http.headers.Cache-Control", 1, true)}} call) */ const bcd = require('..'); var query = process.argv[2]; var depth = process.argv[3] || 1; var aggregateMode = process.argv[4] || false; var output = ''; var s_no_data_found = `No compatibility data found. Please contribute data for "${query}" (depth: ${depth}) to the MDN compatibility data repository.`; var s_firefox_android = 'Firefox for Android'; var s_chrome_android = 'Chrome for Android'; const browsers = { "desktop": { chrome: 'Chrome', edge: 'Edge', firefox: 'Firefox', ie: 'Internet Explorer', opera: 'Opera', safari: 'Safari', }, "mobile": { webview_android: 'Android', chrome_android: s_chrome_android, edge_mobile: 'Edge mobile', firefox_android: s_firefox_android, opera_android: 'Opera Android', safari_ios: 'iOS Safari', }, "webextensions": { chrome: "Chrome", edge: "Edge", firefox: "Firefox", firefox_android: s_firefox_android, opera: "Opera", } }; var notesArray = []; /* Write the table header. `browserPlatformType` is either "mobile", "desktop" or "webextensions" */ function writeTableHead(browserPlatformType) { let browserNameKeys = Object.keys(browsers[browserPlatformType]); let output = ''; if (browserPlatformType === 'webextensions') { output = '
' let browserColumnWidth = 60/browserNameKeys.length; for (let browserNameKey of browserNameKeys) { output += ` | ${browsers[browserPlatformType][browserNameKey]} | `; } output += "
---|---|
Feature | '; for (let browserNameKey of browserNameKeys) { output += `${browsers[browserPlatformType][browserNameKey]} | `; } output += '${supportInfo} | `; } return output; } /* Write compat table */ function writeTable(browserPlatformType) { let compatNotes = collectCompatNotes(); let output = writeTableHead(browserPlatformType); output += ''; for (let row of features) { let feature = Object.keys(row).map((k) => row[k])[0]; let desc = ''; if (feature.description) { let label = Object.keys(row)[0]; // Basic support or unnested features need no prefixing if (label.indexOf('.') === -1) { desc += feature.description; // otherwise add a prefix so that we know where this belongs to (e.g. "parse: ISO 8601 format") } else { desc += `
---|---|
${desc} | `; output += `${writeSupportCells(feature.support, compatNotes, browserPlatformType)}
${noteIndex+1}. ${note}
`; } return output; } /* Get compat data using a query string like "webextensions.api.alarms" */ function getData(queryString, obj) { return queryString.split('.').reduce(function(prev, curr) { return prev ? prev[curr] : undefined }, obj); } /* Get features that should be displayed according to the query and the depth setting Flatten them into a features array */ function traverseFeatures(obj, depth, identifier) { depth--; if (depth >= 0) { for (let i in obj) { if (!!obj[i] && typeof(obj[i])=="object" && i !== '__compat') { if (obj[i].__compat) { let featureNames = Object.keys(obj[i]); if (featureNames.length > 1) { // there are sub features below this node, // so we need to identify partial support for the main feature for (let subfeatureName of featureNames) { // if this is actually a subfeature (i.e. it is not a __compat object) // and the subfeature has a __compat object if ((subfeatureName !== '__compat') && (obj[i][subfeatureName].__compat)) { let browserNames = Object.keys(obj[i].__compat.support); for (let browser of browserNames) { if (obj[i].__compat.support[browser].version_added != obj[i][subfeatureName].__compat.support[browser].version_added || obj[i][subfeatureName].__compat.support[browser].notes) { obj[i].__compat.support[browser].partial_support = true; } } } } } features.push({[identifier + i]: obj[i].__compat}); } traverseFeatures(obj[i], depth, i + '.'); } } } } var compatData = getData(query, bcd); var features = []; var identifier = query.split(".").pop(); var isWebExtensions = query.split(".")[0] === "webextensions"; if (!compatData) { output = s_no_data_found; } else if (compatData.__compat) { // get optional main feature, add it to the feature list // call it "Basic support" if not aggregating if (!aggregateMode) { compatData.__compat.description = 'Basic support'; } features.push({[identifier]: compatData.__compat}); } traverseFeatures(compatData, depth, ''); if (features.length > 0) { if (isWebExtensions) { output += writeTable('webextensions'); if (!aggregateMode) { output += writeNotes(); } } else { output = ``; output += writeTable('desktop'); output += writeTable('mobile'); if (!aggregateMode) { output += writeNotes(); } } } else { output = s_no_data_found; } console.log(output);