OpenHPS/openhps-rdf

View on GitHub
src/bin/cli.ts

Summary

Maintainability
B
5 hrs
Test Coverage
#!/usr/bin/env node

import * as chalk from 'chalk';
import '@openhps/rf';
import * as path from 'path';
import { input } from '@inquirer/prompts';
import * as yargs from 'yargs';
import { Mirrors, Namespaces } from './types';
import { generateFiles } from './generateFiles';
import * as fs from 'fs';

const args = yargs.option('d', {
    alias: 'dictionary',
    default: undefined,
    description: "Specify the output directory to create the typings",
    type: 'string'
}).option('n', {
    alias: 'namespace',
    description: "Add one or more namespaces",
    type: 'string',
    array: true
}).option('m', {
    alias: 'mirror',
    description: "Add a mirror URI link for a namespace URI",
    type: 'string',
    array: true
}).option('?', {
    alias: 'help',
    default: undefined,
}).option('c', {
    alias: 'config',
    default: undefined,
}).option('v', {
    alias: 'verbose',
    default: undefined,
    description: "Verbose logging"
}).argv;

const data: {
    directory: string;
    namespaces?: Namespaces;
    mirrors?: Mirrors;
} = {
    directory: path.normalize('tmp'),
};

/**
 * Main CLI entry
 */
function main() {
    console.log(chalk.redBright('OpenHPS RDF Generator'));

    if (args['c']) {
        const configPath = path.normalize(args['c']);
        console.log(`Loading config: ${configPath}`);
        const config = JSON.parse(fs.readFileSync(configPath, { encoding: "utf-8" }));
        data.mirrors = config.mirrors;
        data.namespaces = config.namespaces;
        data.directory = config.directory;
    }

    Promise.resolve(
        args['d'] ?? data.directory ??
            input({
                message: 'Enter the output directory',
            }),
    ).then(async (directory) => {
        data.directory = path.normalize(directory);

        if (data.namespaces) {
            return Promise.resolve(data.namespaces);
        } else if (args['n']) {
            return Promise.resolve((args['n'] as string[]).map(ns => {
                const i = ns.indexOf(":");
                return {
                    [ns.slice(0, i)]: ns.slice(i + 1)
                };
            }).reduce((a, b) => ({ ...a, ...b})));
        } else {
            const prefix = await input({
                message: 'Enter the prefix of the ontology to add',
            });
            const uri = await input({
                message: 'Enter the URI of the ontology to add',
            });
            return Promise.resolve({ [prefix]: uri });
        }
    }).then((namespaces: Namespaces) => {
        data.namespaces = namespaces;
        console.log("The following namespaces will be fetched:");
        Object.keys(data.namespaces).forEach(ns => {
            console.log(`\t@prefix ${ns}: <${data.namespaces[ns]}> .`)
        });

        if (data.mirrors) {
            return Promise.resolve(data.mirrors);
        } else if (args['m']) {
            const mirrors = {};
            for (let i = 0 ; i < args['m'].length ; i += 2) {
                mirrors[args['m'][i]] = args['m'][i + 1];
            }
            return Promise.resolve(mirrors);
        }
        return Promise.resolve(undefined);
    }).then(mirrors => {
        data.mirrors = mirrors;
        if (data.mirrors) {
            console.log("The following mirrors will be used:");
            Object.keys(data.mirrors).forEach(source => {
                console.log(`\t<${source}> -> <${data.mirrors[source]}>`)
            });
        }

        return generateFiles(data.namespaces, { targetDir: data.directory, mirrors: data.mirrors });
    });
}

main();

export { generateFiles };