download_latest_properties.js 2.76 KB
'use strict';

/*
 * W3C provides JSON list of all CSS properties and their status in the standard
 *
 * documentation: https://www.w3.org/Style/CSS/all-properties.en.html
 * JSON url: ( https://www.w3.org/Style/CSS/all-properties.en.json )
 *
 * Download that file, filter out duplicates and filter the properties based on the wanted standard level
 *
 * ED   - Editors' Draft (not a W3C Technical Report)
 * FPWD - First Public Working Draft
 * WD   - Working Draft
 * LC   - Last Call Working Draft
 * CR   - Candidate Recommendation
 * PR   - Proposed Recommendation
 * REC  - Recommendation
 * NOTE - Working Group Note
 */

var fs = require('fs');
var path = require('path');

var request = require('request');

const { camelToDashed } = require('../lib/parsers');

var url = 'https://www.w3.org/Style/CSS/all-properties.en.json';

console.log('Downloading CSS properties...');

function toCamelCase(propName) {
  return propName.replace(/-([a-z])/g, function(g) {
    return g[1].toUpperCase();
  });
}

request(url, function(error, response, body) {
  if (!error && response.statusCode === 200) {
    var allCSSProperties = JSON.parse(body);

    // Filter out all properties newer than Working Draft
    var workingDraftAndOlderProperties = allCSSProperties.filter(function(cssProp) {
      // TODO: --* css Needs additional logic to this module, so filter it out for now
      return cssProp.status !== 'ED' && cssProp.status !== 'FPWD' && cssProp.property !== '--*';
    });

    // Remove duplicates, there can be many properties in different states of standard
    // and add only property names to the list
    var CSSpropertyNames = [];
    workingDraftAndOlderProperties.forEach(function(cssProp) {
      const camelCaseName = toCamelCase(cssProp.property);

      if (CSSpropertyNames.indexOf(camelCaseName) === -1) {
        CSSpropertyNames.push(camelCaseName);
      }
    });

    var out_file = fs.createWriteStream(path.resolve(__dirname, './../lib/allProperties.js'), {
      encoding: 'utf-8',
    });

    var date_today = new Date();
    out_file.write(
      "'use strict';\n\n// autogenerated - " +
        (date_today.getMonth() + 1 + '/' + date_today.getDate() + '/' + date_today.getFullYear()) +
        '\n\n'
    );
    out_file.write('/*\n *\n * https://www.w3.org/Style/CSS/all-properties.en.html\n */\n\n');

    out_file.write('var allProperties = new Set();\n');
    out_file.write('module.exports = allProperties;\n');

    CSSpropertyNames.forEach(function(property) {
      out_file.write('allProperties.add(' + JSON.stringify(camelToDashed(property)) + ');\n');
    });

    out_file.end(function(err) {
      if (err) {
        throw err;
      }

      console.log('Generated ' + Object.keys(CSSpropertyNames).length + ' properties.');
    });
  } else {
    throw error;
  }
});