#!/usr/bin/env node var fs = require('fs'); var path = require('path'); var execSync = require('child_process').execSync; var $ = require('cheerio'); var fromEntries = require('object.fromentries'); if (process.argv.length !== 3) { throw new RangeError('please provide a year'); } var year = parseInt(process.argv[2]); if (year < 2016) { throw new RangeError('ES2016+ only'); } var edition = year - 2009; var specHTMLurl = new URL('https://raw.githubusercontent.com/tc39/ecma262/es' + year + '/spec.html'); var specHTML = String(execSync('curl --silent ' + specHTMLurl)); var root = $(specHTML); var aOps = root.filter('[aoid]').add(root.find('[aoid]')); var missings = []; var entries = aOps.toArray().map(function (x) { var op = $(x); var aoid = op.attr('aoid'); var id = op.attr('id'); if (!id) { id = op.closest('[id]').attr('id'); } if (!id) { missings.push(aoid); } return [ aoid, 'https://ecma-international.org/ecma-262/' + edition + '.0/#' + id ]; }); if (missings.length > 0) { console.error('Missing URLs:', missings); process.exit(1); } entries.sort(function (a, b) { return a[0].localeCompare(b[0]); }); var obj = fromEntries(entries); var outputPath = path.join('operations', year + '.js'); fs.writeFileSync(outputPath, '\'use strict\';\n\nmodule.exports = ' + JSON.stringify(obj, null, '\t')+ ';\n'); console.log('npx eslint --quiet --fix ' + outputPath); execSync('npx eslint --quiet --fix ' + outputPath);