import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import { project } from '@theoryofnekomata/orbis-core'; import { writeFile } from 'fs/promises'; import { basename, dirname, resolve } from 'path'; type ProjectArgs = { input: string, projection: string, output?: string }; const main = async (argv: string | readonly string[]) => { await yargs .option('interactive', { alias: 'i', }) .command({ command: 'project ', aliases: 'p', describe: 'Project an equirectangular PNG image to another projection.', builder: (y) => y .option('output', { alias: 'o', }) .option('width', { alias: 'w', }) .coerce('output', (output) => { if (!output) { return null; } if (typeof output !== 'string') { return null; } return output; }) .option('bounds', { alias: 'b', default: '-180,90;180,-90', }), handler: async (projectArgvRaw) => { const projectArgv = projectArgvRaw as unknown as ProjectArgs; const outputPng = await project(projectArgv.input, [projectArgv.projection]); const outputFilename = projectArgv.output ?? `${basename(projectArgv.input, '.png')}.out.png`; const outputPath = resolve( dirname(projectArgv.input), outputFilename.endsWith('.png') ? outputFilename : `${outputFilename}.png` ); await writeFile(outputPath, outputPng); process.stdout.write(`Created output file: ${outputPath}\n`); }, }) .demandCommand(1, 'Please specify a command') .help() .parse( hideBin((Array.isArray(argv) ? argv : [argv]) as string[]), ); }; void main(process.argv);