blob: 381221fe031caea2a780bcb070f283a6c4ef87b0 [file] [log] [blame]
/* This file is a part of @mdn/browser-compat-data
* See LICENSE file for more information. */
import fs from 'node:fs';
import path from 'node:path';
import esMain from 'es-main';
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
import { lowLevelWalk } from '../utils/walk.js';
/**
* Enumerate features and write to a destination file
* @param {object} options Options
* @param {string} options.dest Destination file name
* @param {string} [options.dataFrom] Where the data is (leave blank for repository folder)
* @returns {Promise<void>}
*/
const main = async ({ dest, dataFrom }) => {
fs.writeFileSync(dest, JSON.stringify(await enumerateFeatures(dataFrom)));
};
/**
* Enumerate compat data features
* @param {string} [dataFrom] Where to get the data from (leave blank for repository folder)
* @returns {Promise<string[]>} A list of features
*/
const enumerateFeatures = async (dataFrom) => {
/** @type {string[]} */
const feats = [];
const walker = lowLevelWalk(
dataFrom
? (await import(path.join(process.cwd(), dataFrom, 'index.js'))).default
: undefined,
);
for (const feat of walker) {
if (feat.compat || feat.browser) {
feats.push(feat.path);
}
}
return feats;
};
if (esMain(import.meta)) {
const argv = yargs(hideBin(process.argv))
.command('$0 [dest]', 'Write a JSON-formatted list of feature paths')
.positional('dest', {
default: '.features.json',
description: 'File destination',
})
.option('data-from', {
type: 'string',
nargs: 1,
description: 'Require compat data from an alternate path',
})
.parseSync();
const { dest, dataFrom } = argv;
await main({ dest, dataFrom });
}
export default enumerateFeatures;