UNPKG

@thi.ng/tangle

Version:

Literate programming code block tangling / codegen utility, inspired by org-mode & noweb

67 lines (64 loc) 1.57 kB
import { ARG_DRY_RUN, ARG_VERBOSE, ParseError, THING_HEADER, flag, parse, usage } from "@thi.ng/args"; import { readJSON, writeText } from "@thi.ng/file-io"; import { ConsoleLogger } from "@thi.ng/logger"; import { join } from "node:path"; import { tangleFile } from "./tangle.js"; const argOpts = { ...ARG_DRY_RUN, ...ARG_VERBOSE, noComments: flag({ default: false, desc: "don't generate comments" }) }; const PKG = readJSON(join(process.argv[2], "package.json")); const APP_NAME = PKG.name.split("/")[1]; const HEADER = THING_HEADER( PKG.name, PKG.version, "Literate programming code block tangling" ); const usageOpts = { lineWidth: process.stdout.columns, prefix: `${HEADER} usage: ${APP_NAME} [OPTS] SOURCE-FILES(S) ... ${APP_NAME} --help `, showGroupNames: true, paramWidth: 20 }; const showUsage = () => { process.stderr.write(usage(argOpts, usageOpts)); process.exit(1); }; try { const result = parse(argOpts, process.argv, { start: 3, usageOpts }); if (!result) process.exit(1); const { result: opts, rest } = result; if (!rest.length) showUsage(); let ctx = { logger: new ConsoleLogger("tangle", opts.verbose ? "DEBUG" : "INFO"), opts: { comments: opts.noComments !== true } }; for (let file of rest) { ctx = tangleFile(file, ctx); } for (let out in ctx.outputs) { writeText(out, ctx.outputs[out], ctx.logger, opts.dryRun); } } catch (e) { if (!(e instanceof ParseError)) process.stderr.write(e.message); process.exit(1); } export { APP_NAME, HEADER, PKG };