CLI for Orbis.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.8 KiB

  1. import yargs from 'yargs';
  2. import { hideBin } from 'yargs/helpers';
  3. import { project } from '@theoryofnekomata/orbis-core';
  4. import { writeFile } from 'fs/promises';
  5. import { basename, dirname, resolve } from 'path';
  6. type ProjectArgs = { input: string, projection: string, output?: string };
  7. const main = async (argv: string | readonly string[]) => {
  8. await yargs
  9. .option('interactive', {
  10. alias: 'i',
  11. })
  12. .command({
  13. command: 'project <input> <projection>',
  14. aliases: 'p',
  15. describe: 'Project an equirectangular PNG image to another projection.',
  16. builder: (y) => y
  17. .option('output', {
  18. alias: 'o',
  19. })
  20. .option('width', {
  21. alias: 'w',
  22. })
  23. .coerce('output', (output) => {
  24. if (!output) {
  25. return null;
  26. }
  27. if (typeof output !== 'string') {
  28. return null;
  29. }
  30. return output;
  31. })
  32. .option('bounds', {
  33. alias: 'b',
  34. default: '-180,90;180,-90',
  35. }),
  36. handler: async (projectArgvRaw) => {
  37. const projectArgv = projectArgvRaw as unknown as ProjectArgs;
  38. const outputPng = await project(projectArgv.input, [projectArgv.projection]);
  39. const outputFilename = projectArgv.output ?? `${basename(projectArgv.input, '.png')}.out.png`;
  40. const outputPath = resolve(
  41. dirname(projectArgv.input),
  42. outputFilename.endsWith('.png') ? outputFilename : `${outputFilename}.png`
  43. );
  44. await writeFile(outputPath, outputPng);
  45. process.stdout.write(`Created output file: ${outputPath}\n`);
  46. },
  47. })
  48. .demandCommand(1, 'Please specify a command')
  49. .help()
  50. .parse(
  51. hideBin((Array.isArray(argv) ? argv : [argv]) as string[]),
  52. );
  53. };
  54. void main(process.argv);