|
- 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 <input> <projection>',
- 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);
|