media - pdf tests 2/3
This commit is contained in:
parent
580b134428
commit
ce4ddb13b5
5
packages/media/dist-in/commands/audio.d.ts
vendored
5
packages/media/dist-in/commands/audio.d.ts
vendored
@ -1,2 +1,3 @@
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
import * as CLI from 'yargs';
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
|
||||
@ -1,36 +1,31 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.register = exports.defaultOptions = void 0;
|
||||
const __1 = require("../");
|
||||
const convert_1 = require("../lib/media/audio/convert");
|
||||
const _cli_1 = require("../_cli");
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
});
|
||||
};
|
||||
exports.defaultOptions = defaultOptions;
|
||||
let options = (yargs) => (0, exports.defaultOptions)(yargs);
|
||||
const register = (cli) => {
|
||||
return cli.command('video <verb>', 'Convert video', options, (argv) => {
|
||||
(0, _cli_1.defaults)();
|
||||
const options = (0, _cli_1.sanitizeVideo)(argv);
|
||||
__1.logger.info("options " + argv.dst, options);
|
||||
if (argv.verb = 'convert') {
|
||||
return (0, convert_1.convert)(options);
|
||||
}
|
||||
});
|
||||
};
|
||||
exports.register = register;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkJBQTRCO0FBQzVCLHdEQUFvRDtBQUVwRCxrQ0FBaUQ7QUFHMUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQWZZLFFBQUEsY0FBYyxrQkFlMUI7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBbUIsRUFBRSxFQUFFO1FBQ2pGLElBQUEsZUFBUSxHQUFFLENBQUE7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUF5QixDQUFBO1FBQzNELFVBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRTtZQUN2QixPQUFPLElBQUEsaUJBQU8sRUFBQyxPQUFPLENBQUMsQ0FBQTtTQUMxQjtJQUNMLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBVFksUUFBQSxRQUFRLFlBU3BCIn0=
|
||||
import { logger } from '../';
|
||||
import { convert } from '../lib/media/audio/convert';
|
||||
import { defaults, sanitizeVideo } from '../_cli';
|
||||
export const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
});
|
||||
};
|
||||
let options = (yargs) => defaultOptions(yargs);
|
||||
export const register = (cli) => {
|
||||
return cli.command('video <verb>', 'Convert video', options, (argv) => {
|
||||
defaults();
|
||||
const options = sanitizeVideo(argv);
|
||||
logger.info("options " + argv.dst, options);
|
||||
if (argv.verb = 'convert') {
|
||||
return convert(options);
|
||||
}
|
||||
});
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYXVkaW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFHakQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDOUMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN2QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsUUFBUSxFQUFFLGtCQUFrQjtLQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLGdDQUFnQztRQUMxQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHlDQUF5QztRQUNuRCxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtRQUNqRixRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBIn0=
|
||||
5
packages/media/dist-in/commands/convert.d.ts
vendored
5
packages/media/dist-in/commands/convert.d.ts
vendored
@ -1,2 +1,3 @@
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
import * as CLI from 'yargs';
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
|
||||
@ -1,42 +1,37 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.register = exports.defaultOptions = void 0;
|
||||
const __1 = require("../");
|
||||
const images_1 = require("../lib/media/images");
|
||||
const _cli_1 = require("../_cli");
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
}).option('dry', {
|
||||
default: false,
|
||||
describe: 'Run without conversion',
|
||||
type: 'boolean'
|
||||
}).option('verbose', {
|
||||
default: false,
|
||||
describe: 'Show internal messages',
|
||||
type: 'boolean'
|
||||
});
|
||||
};
|
||||
exports.defaultOptions = defaultOptions;
|
||||
let options = (yargs) => (0, exports.defaultOptions)(yargs);
|
||||
const register = (cli) => {
|
||||
return cli.command('convert', 'Convert files', options, (argv) => {
|
||||
(0, _cli_1.defaults)();
|
||||
const options = (0, _cli_1.sanitizeVideo)(argv);
|
||||
options.debug && __1.logger.info("options " + argv.dst, options);
|
||||
return (0, images_1.convert)(options);
|
||||
});
|
||||
};
|
||||
exports.register = register;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jb252ZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJCQUE0QjtBQUU1QixnREFFNEI7QUFFNUIsa0NBSWdCO0FBT1QsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUF2QlksUUFBQSxjQUFjLGtCQXVCMUI7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBbUIsRUFBRSxFQUFFO1FBQzVFLElBQUEsZUFBUSxHQUFFLENBQUE7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFhLEVBQUMsSUFBSSxDQUFhLENBQUE7UUFDL0MsT0FBTyxDQUFDLEtBQUssSUFBSSxVQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzVELE9BQU8sSUFBQSxnQkFBTyxFQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNCLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBUFksUUFBQSxRQUFRLFlBT3BCIn0=
|
||||
import { logger } from '../';
|
||||
import { convert } from '../lib/media/images';
|
||||
import { defaults, sanitizeVideo } from '../_cli';
|
||||
export const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
}).option('dry', {
|
||||
default: false,
|
||||
describe: 'Run without conversion',
|
||||
type: 'boolean'
|
||||
}).option('verbose', {
|
||||
default: false,
|
||||
describe: 'Show internal messages',
|
||||
type: 'boolean'
|
||||
});
|
||||
};
|
||||
let options = (yargs) => defaultOptions(yargs);
|
||||
export const register = (cli) => {
|
||||
return cli.command('convert', 'Convert files', options, (argv) => {
|
||||
defaults();
|
||||
const options = sanitizeVideo(argv);
|
||||
options.debug && logger.info("options " + argv.dst, options);
|
||||
return convert(options);
|
||||
});
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9jb252ZXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFFNUIsT0FBTyxFQUNILE9BQU8sRUFDVixNQUFNLHFCQUFxQixDQUFBO0FBRTVCLE9BQU8sRUFFSCxRQUFRLEVBQ1IsYUFBYSxFQUNoQixNQUFNLFNBQVMsQ0FBQTtBQU9oQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUE7QUFDTixDQUFDLENBQUE7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQW1CLEVBQUUsRUFBRTtRQUM1RSxRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQWEsQ0FBQTtRQUMvQyxPQUFPLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDNUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDM0IsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ==
|
||||
7
packages/media/dist-in/commands/pdf2jpg.d.ts
vendored
7
packages/media/dist-in/commands/pdf2jpg.d.ts
vendored
@ -1 +1,6 @@
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
import * as CLI from 'yargs';
|
||||
export declare const command = "pdf2jpg";
|
||||
export declare const desc = "Convert PDF to images";
|
||||
export declare const builder: (yargs: CLI.Argv) => any;
|
||||
export declare function handler(argv: CLI.Arguments): Promise<void>;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
|
||||
@ -1,76 +1,71 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.register = void 0;
|
||||
const __1 = require("../");
|
||||
const path = __importStar(require("path"));
|
||||
const index_1 = require("../lib/process/index");
|
||||
const pMap = __importStar(require("p-map"));
|
||||
const fg = require('fast-glob');
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('input', {
|
||||
default: './',
|
||||
describe: 'The sources'
|
||||
}).option('debug', {
|
||||
default: 'false',
|
||||
describe: 'Enable internal debug message'
|
||||
});
|
||||
};
|
||||
let options = (yargs) => defaultOptions(yargs);
|
||||
async function convertFiles(files) {
|
||||
return pMap(files, (file) => {
|
||||
const inParts = path.parse(file);
|
||||
// magick convert leg.pdf -quality 100 -density 250 -trim -flatten -resize 200% -sharpen 0x1.0 leg.jpg
|
||||
const promise = index_1.Helper.run(inParts.dir, 'convert', [
|
||||
`"${inParts.base}[0]"`,
|
||||
'-quality 80',
|
||||
'-density 250',
|
||||
'-trim',
|
||||
'-flatten',
|
||||
'-sharpen 0x1.0',
|
||||
`"${inParts.name}.jpg"`
|
||||
]);
|
||||
return promise;
|
||||
}, { concurrency: 1 });
|
||||
}
|
||||
// node ./build/main.js pdf2jpg --input=../drawings
|
||||
const register = (cli) => {
|
||||
return cli.command('pdf2jpg', '', options, async (argv) => {
|
||||
if (argv.help) {
|
||||
return;
|
||||
}
|
||||
const src = path.resolve('' + argv.input);
|
||||
if (argv.debug) {
|
||||
__1.logger.debug(`Begin convert PDF files${src}`);
|
||||
}
|
||||
const files = fg.sync('*.pdf|*.PDF', { dot: true, cwd: src, absolute: true });
|
||||
await convertFiles(files);
|
||||
if (argv.debug) {
|
||||
__1.logger.debug(`Converted ${files.length} files`);
|
||||
}
|
||||
});
|
||||
};
|
||||
exports.register = register;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wZGYyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsMkJBQTRCO0FBQzVCLDJDQUE0QjtBQUM1QixnREFBNkM7QUFDN0MsNENBQTZCO0FBRTdCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUUvQixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsT0FBTyxFQUFFLElBQUk7UUFDYixRQUFRLEVBQUUsYUFBYTtLQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLFFBQVEsRUFBRSwrQkFBK0I7S0FDNUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDO0FBRUYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV6RCxLQUFLLFVBQVUsWUFBWSxDQUFDLEtBQUs7SUFDN0IsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxzR0FBc0c7UUFDdEcsTUFBTSxPQUFPLEdBQUcsY0FBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFDakQ7WUFDSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLE1BQU07WUFDdEIsYUFBYTtZQUNiLGNBQWM7WUFDZCxPQUFPO1lBQ1AsVUFBVTtZQUNWLGdCQUFnQjtZQUNoQixJQUFJLE9BQU8sQ0FBQyxJQUFJLE9BQU87U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQyxFQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELG1EQUFtRDtBQUM1QyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUFFLE9BQU87U0FBRTtRQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1osVUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNqRDtRQUNELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLFVBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQztTQUNuRDtJQUNMLENBQUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBYlksUUFBQSxRQUFRLFlBYXBCIn0=
|
||||
import { logger } from '../index.js';
|
||||
import { existsSync } from 'node:fs';
|
||||
import * as z from 'zod';
|
||||
import { runConversion } from '../lib/pdf/convert.js';
|
||||
import { ConvertCommandSchema } from '../lib/pdf/types.js';
|
||||
export const command = 'pdf2jpg';
|
||||
export const desc = 'Convert PDF to images';
|
||||
export const builder = (yargs) => {
|
||||
return yargs
|
||||
.option('input', {
|
||||
alias: 'i',
|
||||
describe: 'Path to the input PDF file',
|
||||
demandOption: true,
|
||||
type: 'string'
|
||||
})
|
||||
.option('output', {
|
||||
alias: 'o',
|
||||
describe: 'Output path template (e.g., output/page_{PAGE}.png)',
|
||||
type: 'string'
|
||||
})
|
||||
.option('dpi', {
|
||||
describe: 'Resolution for the output images',
|
||||
default: 300,
|
||||
type: 'number'
|
||||
})
|
||||
.option('scale', {
|
||||
describe: 'Scaling factor to apply before rendering (e.g., 2 for 2x size)',
|
||||
default: 2,
|
||||
type: 'number'
|
||||
})
|
||||
.option('format', {
|
||||
describe: 'Output image format',
|
||||
choices: ['png', 'jpg'],
|
||||
default: 'jpg',
|
||||
type: 'string'
|
||||
})
|
||||
.option('startPage', {
|
||||
describe: 'First page to convert (1-based index)',
|
||||
type: 'number'
|
||||
})
|
||||
.option('endPage', {
|
||||
describe: 'Last page to convert (1-based index)',
|
||||
type: 'number'
|
||||
});
|
||||
};
|
||||
export async function handler(argv) {
|
||||
try {
|
||||
const config = ConvertCommandSchema.parse(argv);
|
||||
if (!existsSync(config.input)) {
|
||||
throw new Error(`Input file ${config.input} does not exist`);
|
||||
}
|
||||
logger.info("Calling conversion library function...");
|
||||
const outputFiles = await runConversion(config, logger);
|
||||
logger.info(`Conversion completed successfully`);
|
||||
logger.info(`Generated ${outputFiles.length} images`);
|
||||
}
|
||||
catch (error) {
|
||||
if (error instanceof z.ZodError) {
|
||||
logger.error('Invalid arguments:', error.flatten());
|
||||
}
|
||||
else {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
logger.error('Error during conversion command:', message, error);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
export const register = (cli) => {
|
||||
return cli.command(command, desc, builder, handler);
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wZGYyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztBQUN6QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUF3QixvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRWhGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSztTQUNQLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDYixLQUFLLEVBQUUsR0FBRztRQUNWLFFBQVEsRUFBRSw0QkFBNEI7UUFDdEMsWUFBWSxFQUFFLElBQUk7UUFDbEIsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQztTQUNELE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDZCxLQUFLLEVBQUUsR0FBRztRQUNWLFFBQVEsRUFBRSxxREFBcUQ7UUFDL0QsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQztTQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDWCxRQUFRLEVBQUUsa0NBQWtDO1FBQzVDLE9BQU8sRUFBRSxHQUFHO1FBQ1osSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQztTQUNELE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDYixRQUFRLEVBQUUsZ0VBQWdFO1FBQzFFLE9BQU8sRUFBRSxDQUFDO1FBQ1YsSUFBSSxFQUFFLFFBQVE7S0FDakIsQ0FBQztTQUNELE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDZCxRQUFRLEVBQUUscUJBQXFCO1FBQy9CLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7UUFDdkIsT0FBTyxFQUFFLEtBQUs7UUFDZCxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDO1NBQ0QsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNqQixRQUFRLEVBQUUsdUNBQXVDO1FBQ2pELElBQUksRUFBRSxRQUFRO0tBQ2pCLENBQUM7U0FDRCxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ2YsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxJQUFJLEVBQUUsUUFBUTtLQUNqQixDQUFDLENBQUE7QUFDVixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFtQjtJQUM3QyxJQUFJLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUF5QixDQUFDO1FBQ3hFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLE1BQU0sQ0FBQyxLQUFLLGlCQUFpQixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxNQUFNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxXQUFXLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3ZELENBQUMsQ0FBQSJ9
|
||||
3
packages/media/dist-in/commands/svg2jpg.d.ts
vendored
3
packages/media/dist-in/commands/svg2jpg.d.ts
vendored
@ -1 +1,2 @@
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
import * as CLI from 'yargs';
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
|
||||
@ -1,72 +1,45 @@
|
||||
"use strict";
|
||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
var desc = Object.getOwnPropertyDescriptor(m, k);
|
||||
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
||||
desc = { enumerable: true, get: function() { return m[k]; } };
|
||||
}
|
||||
Object.defineProperty(o, k2, desc);
|
||||
}) : (function(o, m, k, k2) {
|
||||
if (k2 === undefined) k2 = k;
|
||||
o[k2] = m[k];
|
||||
}));
|
||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||||
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||||
}) : function(o, v) {
|
||||
o["default"] = v;
|
||||
});
|
||||
var __importStar = (this && this.__importStar) || function (mod) {
|
||||
if (mod && mod.__esModule) return mod;
|
||||
var result = {};
|
||||
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||||
__setModuleDefault(result, mod);
|
||||
return result;
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.register = void 0;
|
||||
const debug_1 = require("@plastichub/core/debug");
|
||||
const path = __importStar(require("path"));
|
||||
const index_1 = require("../lib/process/index");
|
||||
const bluebird = __importStar(require("bluebird"));
|
||||
const fg = require('fast-glob');
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('input', {
|
||||
default: './',
|
||||
describe: 'The sources'
|
||||
}).option('debug', {
|
||||
default: 'false',
|
||||
describe: 'Enable internal debug message'
|
||||
});
|
||||
};
|
||||
let options = (yargs) => defaultOptions(yargs);
|
||||
async function convertFiles(files) {
|
||||
return bluebird.mapSeries(files, (file) => {
|
||||
const inParts = path.parse(file);
|
||||
const promise = index_1.Helper.run(inParts.dir, 'convert', [
|
||||
`"${inParts.base}"`,
|
||||
'-quality 40',
|
||||
'-sharpen 0x1.0',
|
||||
`"${inParts.name}.jpg"`
|
||||
]);
|
||||
return promise;
|
||||
});
|
||||
}
|
||||
//node ./build/main.js svg2jpg --input=../tests/svg/
|
||||
const register = (cli) => {
|
||||
return cli.command('svg2jpg', '', options, async (argv) => {
|
||||
if (argv.help) {
|
||||
return;
|
||||
}
|
||||
const src = path.resolve('' + argv.input);
|
||||
const files = fg.sync('*.svg|*.SVG', { dot: true, cwd: src, absolute: true });
|
||||
if (argv.debug) {
|
||||
(0, debug_1.debug)(`Begin convert SVG files at ${src} ${files}`);
|
||||
}
|
||||
await convertFiles(files);
|
||||
if (argv.debug) {
|
||||
(0, debug_1.debug)(`Converted ${files.length} files`);
|
||||
}
|
||||
});
|
||||
};
|
||||
exports.register = register;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9zdmcyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0Esa0RBQThDO0FBQzlDLDJDQUE2QjtBQUM3QixnREFBOEM7QUFDOUMsbURBQXFDO0FBRXJDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVoQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsT0FBTyxFQUFFLElBQUk7UUFDYixRQUFRLEVBQUUsYUFBYTtLQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLFFBQVEsRUFBRSwrQkFBK0I7S0FDNUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDO0FBRUYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV6RCxLQUFLLFVBQVUsWUFBWSxDQUFDLEtBQUs7SUFDN0IsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsY0FBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFDakQ7WUFDSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUc7WUFDbkIsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixJQUFJLE9BQU8sQ0FBQyxJQUFJLE9BQU87U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Qsb0RBQW9EO0FBRTdDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFtQixFQUFFLEVBQUU7UUFDckUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFBLGFBQUssRUFBQyw4QkFBOEIsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdkQ7UUFDRCxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFBLGFBQUssRUFBQyxhQUFhLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO1NBQzVDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFiVyxRQUFBLFFBQVEsWUFhbkIifQ==
|
||||
import * as path from 'path';
|
||||
import { Helper } from '../lib/process/index.js';
|
||||
import * as bluebird from 'bluebird';
|
||||
import { logger } from '../index.js';
|
||||
const fg = require('fast-glob');
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('input', {
|
||||
default: './',
|
||||
describe: 'The sources'
|
||||
}).option('debug', {
|
||||
default: 'false',
|
||||
describe: 'Enable internal debug message'
|
||||
});
|
||||
};
|
||||
let options = (yargs) => defaultOptions(yargs);
|
||||
async function convertFiles(files) {
|
||||
return bluebird.mapSeries(files, (file) => {
|
||||
const inParts = path.parse(file);
|
||||
const promise = Helper.run(inParts.dir, 'convert', [
|
||||
`"${inParts.base}"`,
|
||||
'-quality 40',
|
||||
'-sharpen 0x1.0',
|
||||
`"${inParts.name}.jpg"`
|
||||
]);
|
||||
return promise;
|
||||
});
|
||||
}
|
||||
//node ./build/main.js svg2jpg --input=../tests/svg/
|
||||
export const register = (cli) => {
|
||||
return cli.command('svg2jpg', '', options, async (argv) => {
|
||||
if (argv.help) {
|
||||
return;
|
||||
}
|
||||
const src = path.resolve('' + argv.input);
|
||||
const files = fg.sync('*.svg|*.SVG', { dot: true, cwd: src, absolute: true });
|
||||
if (argv.debug) {
|
||||
logger.debug(`Begin convert SVG files at ${src} ${files}`);
|
||||
}
|
||||
await convertFiles(files);
|
||||
if (argv.debug) {
|
||||
logger.debug(`Converted ${files.length} files`);
|
||||
}
|
||||
});
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnMmpwZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9zdmcyanBnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVoQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsT0FBTyxFQUFFLElBQUk7UUFDYixRQUFRLEVBQUUsYUFBYTtLQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLFFBQVEsRUFBRSwrQkFBK0I7S0FDNUMsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFDO0FBRUYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV6RCxLQUFLLFVBQVUsWUFBWSxDQUFDLEtBQUs7SUFDN0IsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO1FBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFDakQ7WUFDSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUc7WUFDbkIsYUFBYTtZQUNiLGdCQUFnQjtZQUNoQixJQUFJLE9BQU8sQ0FBQyxJQUFJLE9BQU87U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Qsb0RBQW9EO0FBRXBELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUNELE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyJ9
|
||||
5
packages/media/dist-in/commands/video.d.ts
vendored
5
packages/media/dist-in/commands/video.d.ts
vendored
@ -1,2 +1,3 @@
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
import * as CLI from 'yargs';
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
|
||||
@ -1,39 +1,34 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.register = exports.defaultOptions = void 0;
|
||||
const __1 = require("../");
|
||||
const video_1 = require("../lib/media/video");
|
||||
const _cli_1 = require("../_cli");
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
});
|
||||
};
|
||||
exports.defaultOptions = defaultOptions;
|
||||
let options = (yargs) => (0, exports.defaultOptions)(yargs);
|
||||
const register = (cli) => {
|
||||
return cli.command('video <verb>', 'Convert video', options, async (argv) => {
|
||||
(0, _cli_1.defaults)();
|
||||
const options = (0, _cli_1.sanitizeVideo)(argv);
|
||||
__1.logger.info("options " + argv.dst, options);
|
||||
if (options.verb == 'convert') {
|
||||
return (0, video_1.convert)(options);
|
||||
}
|
||||
if (options.verb == 'merge') {
|
||||
return (0, video_1.merge)(options);
|
||||
}
|
||||
});
|
||||
};
|
||||
exports.register = register;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvdmlkZW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkJBQTRCO0FBQzVCLDhDQUFtRDtBQUNuRCxrQ0FBaUQ7QUFHMUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRTtJQUM5QyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLFFBQVEsRUFBRSxrQkFBa0I7UUFDNUIsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixRQUFRLEVBQUUsa0JBQWtCO0tBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQWZZLFFBQUEsY0FBYyxrQkFlMUI7QUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBYyxFQUFDLEtBQUssQ0FBQyxDQUFBO0FBRWpELE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFtQixFQUFFLEVBQUU7UUFDdkYsSUFBQSxlQUFRLEdBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUEsb0JBQWEsRUFBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsVUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFO1lBQzNCLE9BQU8sSUFBQSxlQUFPLEVBQUMsT0FBTyxDQUFDLENBQUE7U0FDMUI7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFO1lBQ3pCLE9BQU8sSUFBQSxhQUFLLEVBQUMsT0FBTyxDQUFRLENBQUE7U0FDL0I7SUFDTCxDQUFDLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQVpZLFFBQUEsUUFBUSxZQVlwQiJ9
|
||||
import { logger } from '../';
|
||||
import { convert, merge } from '../lib/media/video';
|
||||
import { defaults, sanitizeVideo } from '../_cli';
|
||||
export const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
});
|
||||
};
|
||||
let options = (yargs) => defaultOptions(yargs);
|
||||
export const register = (cli) => {
|
||||
return cli.command('video <verb>', 'Convert video', options, async (argv) => {
|
||||
defaults();
|
||||
const options = sanitizeVideo(argv);
|
||||
logger.info("options " + argv.dst, options);
|
||||
if (options.verb == 'convert') {
|
||||
return convert(options);
|
||||
}
|
||||
if (options.verb == 'merge') {
|
||||
return merge(options);
|
||||
}
|
||||
});
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvdmlkZW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBR2pELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDdkIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLFFBQVEsRUFBRSxrQkFBa0I7S0FDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFBO0FBQ04sQ0FBQyxDQUFBO0FBRUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUV4RCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUN2RixRQUFRLEVBQUUsQ0FBQTtRQUNWLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQXlCLENBQUE7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMzQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQVEsQ0FBQTtRQUNoQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ==
|
||||
@ -1,2 +1,3 @@
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
import * as CLI from 'yargs';
|
||||
export declare const defaultOptions: (yargs: CLI.Argv) => any;
|
||||
export declare const register: (cli: CLI.Argv) => any;
|
||||
|
||||
@ -1,75 +1,70 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.register = exports.defaultOptions = void 0;
|
||||
const commons_1 = require("@polymech/commons");
|
||||
const index_1 = require("../index");
|
||||
const images_1 = require("../lib/media/images");
|
||||
const _cli_1 = require("../_cli");
|
||||
const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
}).option('dry', {
|
||||
default: false,
|
||||
describe: 'Run without conversion',
|
||||
type: 'boolean'
|
||||
}).option('verbose', {
|
||||
default: false,
|
||||
describe: 'Show internal messages',
|
||||
type: 'boolean'
|
||||
}).option('percent', {
|
||||
default: false,
|
||||
describe: 'Resize image with percent',
|
||||
type: 'number'
|
||||
}).option('width', {
|
||||
default: false,
|
||||
describe: 'Resize image with',
|
||||
type: 'number'
|
||||
}).option('height', {
|
||||
default: false,
|
||||
describe: 'Resize image height',
|
||||
type: 'number'
|
||||
}).option('minHeight', {
|
||||
describe: 'Resize image minimum height',
|
||||
type: 'number'
|
||||
}).option('minWidth', {
|
||||
describe: 'Resize image minimum width',
|
||||
type: 'number'
|
||||
}).option('minSize', {
|
||||
describe: 'Resize image size (bytes)',
|
||||
type: 'number'
|
||||
}).option('percent', {
|
||||
describe: 'Resize image in percent (width)',
|
||||
type: 'number'
|
||||
}).option('key', {
|
||||
describe: 'API Key',
|
||||
type: 'string'
|
||||
});
|
||||
};
|
||||
exports.defaultOptions = defaultOptions;
|
||||
const options = (yargs) => (0, exports.defaultOptions)(yargs);
|
||||
const register = (cli) => {
|
||||
return cli.command('watermark', 'Remove watermark : FILE|GLOB', options, async (argv) => {
|
||||
(0, _cli_1.defaults)();
|
||||
const options = (0, _cli_1.sanitize)(argv);
|
||||
const config = (0, commons_1.CONFIG_DEFAULT)();
|
||||
if (!config.novita) {
|
||||
index_1.logger.error("Novita key not found");
|
||||
return;
|
||||
}
|
||||
options.debug && index_1.logger.info("Watermark Options " + argv.dst, options);
|
||||
return (0, images_1.watermark)({ ...options, key: config.novita.key });
|
||||
});
|
||||
};
|
||||
exports.register = register;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3dhdGVybWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBa0Q7QUFFbEQsb0NBQWlDO0FBQ2pDLGdEQUU0QjtBQUU1QixrQ0FHZ0I7QUFNVCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ2hELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDekIsUUFBUSxFQUFFLGtCQUFrQjtRQUM1QixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNmLFFBQVEsRUFBRSxrQkFBa0I7S0FDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsZ0NBQWdDO1FBQzFDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUseUNBQXlDO1FBQ25ELElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2YsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHdCQUF3QjtRQUNsQyxJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNuQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSwyQkFBMkI7UUFDckMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxtQkFBbUI7UUFDN0IsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUNsQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxxQkFBcUI7UUFDL0IsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUNyQixRQUFRLEVBQUUsNkJBQTZCO1FBQ3ZDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDcEIsUUFBUSxFQUFFLDRCQUE0QjtRQUN0QyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLFFBQVEsRUFBRSwyQkFBMkI7UUFDckMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNuQixRQUFRLEVBQUUsaUNBQWlDO1FBQzNDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDZixRQUFRLEVBQUUsU0FBUztRQUNuQixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQTtBQWxEWSxRQUFBLGNBQWMsa0JBa0QxQjtBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxJQUFBLHNCQUFjLEVBQUMsS0FBSyxDQUFDLENBQUE7QUFFbkQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN4QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JHLElBQUEsZUFBUSxHQUFFLENBQUE7UUFDVixNQUFNLE9BQU8sR0FBRyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQWEsQ0FBQTtRQUMxQyxNQUFNLE1BQU0sR0FBUSxJQUFBLHdCQUFjLEdBQUUsQ0FBQTtRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNsQixjQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDckMsT0FBTTtTQUNQO1FBQ0QsT0FBTyxDQUFDLEtBQUssSUFBSSxjQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEUsT0FBTyxJQUFBLGtCQUFTLEVBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBWlksUUFBQSxRQUFRLFlBWXBCIn0=
|
||||
import { CONFIG_DEFAULT } from '@polymech/commons';
|
||||
import { logger } from '../index.js';
|
||||
import { watermark } from '../lib/media/images/watermark.js';
|
||||
import { sanitize, defaults } from '../_cli.js';
|
||||
export const defaultOptions = (yargs) => {
|
||||
return yargs.option('src', {
|
||||
describe: 'FILE|FOLDER|GLOB',
|
||||
demandOption: true
|
||||
}).option('dst', {
|
||||
describe: 'FILE|FOLDER|GLOB'
|
||||
}).option('debug', {
|
||||
default: false,
|
||||
describe: 'Enable internal debug messages',
|
||||
type: 'boolean'
|
||||
}).option('alt', {
|
||||
default: false,
|
||||
describe: 'Use alternate tokenizer, & instead of $',
|
||||
type: 'boolean'
|
||||
}).option('dry', {
|
||||
default: false,
|
||||
describe: 'Run without conversion',
|
||||
type: 'boolean'
|
||||
}).option('verbose', {
|
||||
default: false,
|
||||
describe: 'Show internal messages',
|
||||
type: 'boolean'
|
||||
}).option('percent', {
|
||||
default: false,
|
||||
describe: 'Resize image with percent',
|
||||
type: 'number'
|
||||
}).option('width', {
|
||||
default: false,
|
||||
describe: 'Resize image with',
|
||||
type: 'number'
|
||||
}).option('height', {
|
||||
default: false,
|
||||
describe: 'Resize image height',
|
||||
type: 'number'
|
||||
}).option('minHeight', {
|
||||
describe: 'Resize image minimum height',
|
||||
type: 'number'
|
||||
}).option('minWidth', {
|
||||
describe: 'Resize image minimum width',
|
||||
type: 'number'
|
||||
}).option('minSize', {
|
||||
describe: 'Resize image size (bytes)',
|
||||
type: 'number'
|
||||
}).option('percent', {
|
||||
describe: 'Resize image in percent (width)',
|
||||
type: 'number'
|
||||
}).option('key', {
|
||||
describe: 'API Key',
|
||||
type: 'string'
|
||||
});
|
||||
};
|
||||
const options = (yargs) => defaultOptions(yargs);
|
||||
export const register = (cli) => {
|
||||
return cli.command('watermark', 'Remove watermark : FILE|GLOB', options, async (argv) => {
|
||||
defaults();
|
||||
const options = sanitize(argv);
|
||||
const config = CONFIG_DEFAULT();
|
||||
if (!config.novita) {
|
||||
logger.error("Novita key not found");
|
||||
return;
|
||||
}
|
||||
options.debug && logger.info("Watermark Options " + argv.dst, options);
|
||||
return watermark({ ...options, key: config.novita.key });
|
||||
});
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL3dhdGVybWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQ0wsU0FBUyxFQUNWLE1BQU0sa0NBQWtDLENBQUE7QUFFekMsT0FBTyxFQUNMLFFBQVEsRUFDUixRQUFRLEVBQ1QsTUFBTSxZQUFZLENBQUE7QUFNbkIsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUU7SUFDaEQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUN6QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFlBQVksRUFBRSxJQUFJO0tBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2YsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtRQUNqQixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxnQ0FBZ0M7UUFDMUMsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx5Q0FBeUM7UUFDbkQsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSx3QkFBd0I7UUFDbEMsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDbkIsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsd0JBQXdCO1FBQ2xDLElBQUksRUFBRSxTQUFTO0tBQ2hCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1FBQ2pCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLG1CQUFtQjtRQUM3QixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ2xCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHFCQUFxQjtRQUMvQixJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQ3JCLFFBQVEsRUFBRSw2QkFBNkI7UUFDdkMsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtRQUNwQixRQUFRLEVBQUUsNEJBQTRCO1FBQ3RDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDbkIsUUFBUSxFQUFFLDJCQUEyQjtRQUNyQyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQ25CLFFBQVEsRUFBRSxpQ0FBaUM7UUFDM0MsSUFBSSxFQUFFLFFBQVE7S0FDZixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNmLFFBQVEsRUFBRSxTQUFTO1FBQ25CLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUUxRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFhLEVBQUUsRUFBRTtJQUN4QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLDhCQUE4QixFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBQ3JHLFFBQVEsRUFBRSxDQUFBO1FBQ1YsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBYSxDQUFBO1FBQzFDLE1BQU0sTUFBTSxHQUFRLGNBQWMsRUFBRSxDQUFBO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JDLE9BQU07UUFDUixDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEUsT0FBTyxTQUFTLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0lBQzFELENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBIn0=
|
||||
@ -1 +1 @@
|
||||
export declare const os: () => "windows" | "osx" | "arm" | "linux";
|
||||
export declare const os: () => "windows" | "osx" | "arm" | "linux";
|
||||
|
||||
@ -1,18 +1,14 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.os = void 0;
|
||||
const os_1 = require("os");
|
||||
const os = () => {
|
||||
if ((0, os_1.platform)() === 'win32') {
|
||||
return 'windows';
|
||||
}
|
||||
else if ((0, os_1.platform)() === 'darwin') {
|
||||
return 'osx';
|
||||
}
|
||||
else if ((0, os_1.arch)() === 'arm') {
|
||||
return 'arm';
|
||||
}
|
||||
return 'linux';
|
||||
};
|
||||
exports.os = os;
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbW1vbi9wbGF0Zm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQkFBb0M7QUFFN0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFO0lBQ3JCLElBQUksSUFBQSxhQUFRLEdBQUUsS0FBSyxPQUFPLEVBQUU7UUFDMUIsT0FBTyxTQUFTLENBQUM7S0FDbEI7U0FBTSxJQUFJLElBQUEsYUFBUSxHQUFFLEtBQUssUUFBUSxFQUFFO1FBQ2xDLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7U0FBTSxJQUFJLElBQUEsU0FBSSxHQUFFLEtBQUssS0FBSyxFQUFFO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUE7QUFUWSxRQUFBLEVBQUUsTUFTZCJ9
|
||||
import { platform, arch } from 'os';
|
||||
export const os = () => {
|
||||
if (platform() === 'win32') {
|
||||
return 'windows';
|
||||
}
|
||||
else if (platform() === 'darwin') {
|
||||
return 'osx';
|
||||
}
|
||||
else if (arch() === 'arm') {
|
||||
return 'arm';
|
||||
}
|
||||
return 'linux';
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvbW1vbi9wbGF0Zm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFO0lBQ3JCLElBQUksUUFBUSxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDM0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztTQUFNLElBQUksUUFBUSxFQUFFLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sSUFBSSxJQUFJLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM1QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDLENBQUEifQ==
|
||||
File diff suppressed because one or more lines are too long
@ -1,5 +1,4 @@
|
||||
import * as bluebird from 'bluebird';
|
||||
import { Promise as BPromise } from 'bluebird';
|
||||
import BPromise from 'bluebird';
|
||||
import { async as write } from "@polymech/fs/write";
|
||||
import { logger } from '../../../index.js';
|
||||
import { imageToBase64, base64ToBuffer } from './lib.js';
|
||||
@ -24,7 +23,7 @@ const _watermark = async (file, targets, onNode = () => { }, options) => {
|
||||
return BPromise.resolve(targets).map((target) => {
|
||||
options.verbose && logger.debug(`Removing Watermark ${file} to ${target}`);
|
||||
if (options.dry) {
|
||||
return bluebird.resolve();
|
||||
return BPromise.resolve();
|
||||
}
|
||||
return removeWatermark(file, target, onNode, options);
|
||||
}, { concurrency: 1 });
|
||||
@ -45,4 +44,4 @@ export const watermark = async (options) => {
|
||||
options.debug && logger.error(`Invalid source info`);
|
||||
}
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvd2F0ZXJtYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxPQUFPLElBQUksUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzlDLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbkQsT0FBTyxFQUNILE1BQU0sRUFDVCxNQUFNLG1CQUFtQixDQUFBO0FBTzFCLE9BQU8sRUFDSCxhQUFhLEVBQ2IsY0FBYyxFQUNqQixNQUFNLFVBQVUsQ0FBQTtBQUdqQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3RDLE9BQU8sRUFBRyxPQUFPLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV0RCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUE4QixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBdUIsRUFBRSxFQUFFO0lBQzdHLE1BQU0sWUFBWSxHQUFHLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQyxNQUFNLE1BQU0sR0FBRztRQUNYLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDckMsdURBQXVEO0tBQzFELENBQUE7SUFDRCxJQUFJLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDdEQsS0FBSyxDQUFDLE1BQU0sRUFBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUM1RCxDQUFDO0FBQ0wsQ0FBQyxDQUFBO0FBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFpQixFQUFFLFNBQThCLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFpQixFQUFFLEVBQUU7SUFDN0csT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzVDLE9BQU8sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxPQUFPLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDMUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUM3QixDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDMUIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFBRSxPQUFpQixFQUFFLEVBQUU7SUFFakQsa0JBQWtCO0lBQ2xCLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQTtJQUNyQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNoRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQyxDQUFBO1FBQy9FLE9BQU8sTUFBTSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNuQyxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUMzRCxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNsRCxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMxQixDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ3hELENBQUM7QUFDTCxDQUFDLENBQUEifQ==
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXJtYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZWRpYS9pbWFnZXMvd2F0ZXJtYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQTtBQUMvQixPQUFPLEVBQUUsS0FBSyxJQUFJLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ25ELE9BQU8sRUFDSCxNQUFNLEVBQ1QsTUFBTSxtQkFBbUIsQ0FBQTtBQU8xQixPQUFPLEVBQ0gsYUFBYSxFQUNiLGNBQWMsRUFDakIsTUFBTSxVQUFVLENBQUE7QUFHakIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN0QyxPQUFPLEVBQUcsT0FBTyxFQUFlLE1BQU0sZ0JBQWdCLENBQUE7QUFFdEQsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBOEIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQXVCLEVBQUUsRUFBRTtJQUM3RyxNQUFNLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDL0MsTUFBTSxNQUFNLEdBQUc7UUFDWCxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ3JDLHVEQUF1RDtLQUMxRCxDQUFBO0lBQ0QsSUFBSSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3hELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ3RELEtBQUssQ0FBQyxNQUFNLEVBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ2xELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDNUQsQ0FBQztBQUNMLENBQUMsQ0FBQTtBQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBaUIsRUFBRSxTQUE4QixHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBaUIsRUFBRSxFQUFFO0lBQzdHLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUM1QyxPQUFPLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQzFFLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDN0IsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFELENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQzFCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsT0FBaUIsRUFBRSxFQUFFO0lBRWpELGtCQUFrQjtJQUNsQixJQUFJLE9BQU8sR0FBUSxFQUFFLENBQUE7SUFDckIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDaEQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQTtRQUMvRSxPQUFPLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDbkMsT0FBTyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDM0QsT0FBTyxVQUFVLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbEQsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDMUIsQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUN4RCxDQUFDO0FBQ0wsQ0FBQyxDQUFBIn0=
|
||||
24
packages/media/dist-in/lib/pdf/convert.d.ts
vendored
Normal file
24
packages/media/dist-in/lib/pdf/convert.d.ts
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
import { Logger } from 'tslog';
|
||||
import { Buffer } from 'node:buffer';
|
||||
import { ConvertCommandConfig } from "./types.js";
|
||||
export declare const DEFAULT_OUTPUT_TEMPLATE = "${SRC_DIR}/${SRC_NAME}/${SRC_NAME}_${PAGE}.${FORMAT}";
|
||||
export type ImageFormat = 'png' | 'jpg';
|
||||
export interface PdfToImageOptions {
|
||||
baseVariables: Record<string, any>;
|
||||
outputPathTemplate: string;
|
||||
dpi: number;
|
||||
scale?: number;
|
||||
format: ImageFormat;
|
||||
startPage?: number;
|
||||
endPage?: number;
|
||||
logger?: Logger<any>;
|
||||
}
|
||||
export declare function convertPdfToImages(pdfData: Buffer, options: PdfToImageOptions): Promise<string[]>;
|
||||
/**
|
||||
* Runs the PDF to images conversion process.
|
||||
* Generates variables, determines output path, reads PDF, and calls the conversion engine.
|
||||
* @param config - The conversion configuration options (inferred from Zod schema).
|
||||
* @param logger - The logger instance to use for logging.
|
||||
* @returns A promise that resolves with an array of generated image file paths.
|
||||
*/
|
||||
export declare function runConversion(config: ConvertCommandConfig, logger: Logger<any>): Promise<string[]>;
|
||||
195
packages/media/dist-in/lib/pdf/convert.js
Normal file
195
packages/media/dist-in/lib/pdf/convert.js
Normal file
File diff suppressed because one or more lines are too long
68
packages/media/dist-in/lib/pdf/types.d.ts
vendored
Normal file
68
packages/media/dist-in/lib/pdf/types.d.ts
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
import { z } from 'zod';
|
||||
export declare const ConvertCommandArgsSchema: z.ZodObject<{
|
||||
input: z.ZodString;
|
||||
output: z.ZodOptional<z.ZodString>;
|
||||
dpi: z.ZodDefault<z.ZodNumber>;
|
||||
scale: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
||||
format: z.ZodDefault<z.ZodEnum<["png", "jpg"]>>;
|
||||
startPage: z.ZodOptional<z.ZodNumber>;
|
||||
endPage: z.ZodOptional<z.ZodNumber>;
|
||||
}, "strip", z.ZodTypeAny, {
|
||||
input?: string;
|
||||
output?: string;
|
||||
dpi?: number;
|
||||
scale?: number;
|
||||
format?: "jpg" | "png";
|
||||
startPage?: number;
|
||||
endPage?: number;
|
||||
}, {
|
||||
input?: string;
|
||||
output?: string;
|
||||
dpi?: number;
|
||||
scale?: number;
|
||||
format?: "jpg" | "png";
|
||||
startPage?: number;
|
||||
endPage?: number;
|
||||
}>;
|
||||
export declare const ConvertCommandSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
||||
input: z.ZodString;
|
||||
output: z.ZodOptional<z.ZodString>;
|
||||
dpi: z.ZodDefault<z.ZodNumber>;
|
||||
scale: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
||||
format: z.ZodDefault<z.ZodEnum<["png", "jpg"]>>;
|
||||
startPage: z.ZodOptional<z.ZodNumber>;
|
||||
endPage: z.ZodOptional<z.ZodNumber>;
|
||||
}, "strip", z.ZodAny, z.objectOutputType<{
|
||||
input: z.ZodString;
|
||||
output: z.ZodOptional<z.ZodString>;
|
||||
dpi: z.ZodDefault<z.ZodNumber>;
|
||||
scale: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
||||
format: z.ZodDefault<z.ZodEnum<["png", "jpg"]>>;
|
||||
startPage: z.ZodOptional<z.ZodNumber>;
|
||||
endPage: z.ZodOptional<z.ZodNumber>;
|
||||
}, z.ZodAny, "strip">, z.objectInputType<{
|
||||
input: z.ZodString;
|
||||
output: z.ZodOptional<z.ZodString>;
|
||||
dpi: z.ZodDefault<z.ZodNumber>;
|
||||
scale: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
||||
format: z.ZodDefault<z.ZodEnum<["png", "jpg"]>>;
|
||||
startPage: z.ZodOptional<z.ZodNumber>;
|
||||
endPage: z.ZodOptional<z.ZodNumber>;
|
||||
}, z.ZodAny, "strip">>, any, z.objectInputType<{
|
||||
input: z.ZodString;
|
||||
output: z.ZodOptional<z.ZodString>;
|
||||
dpi: z.ZodDefault<z.ZodNumber>;
|
||||
scale: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
||||
format: z.ZodDefault<z.ZodEnum<["png", "jpg"]>>;
|
||||
startPage: z.ZodOptional<z.ZodNumber>;
|
||||
endPage: z.ZodOptional<z.ZodNumber>;
|
||||
}, z.ZodAny, "strip">>, any, z.objectInputType<{
|
||||
input: z.ZodString;
|
||||
output: z.ZodOptional<z.ZodString>;
|
||||
dpi: z.ZodDefault<z.ZodNumber>;
|
||||
scale: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
||||
format: z.ZodDefault<z.ZodEnum<["png", "jpg"]>>;
|
||||
startPage: z.ZodOptional<z.ZodNumber>;
|
||||
endPage: z.ZodOptional<z.ZodNumber>;
|
||||
}, z.ZodAny, "strip">>;
|
||||
export type ConvertCommandConfig = z.infer<typeof ConvertCommandSchema>;
|
||||
41
packages/media/dist-in/lib/pdf/types.js
Normal file
41
packages/media/dist-in/lib/pdf/types.js
Normal file
@ -0,0 +1,41 @@
|
||||
import { z } from 'zod';
|
||||
// Define the base shape for arguments
|
||||
export const ConvertCommandArgsSchema = z.object({
|
||||
input: z.string().describe('Path to the input PDF file'),
|
||||
output: z.string().describe('Output path template (e.g., output/page_{PAGE}.png)').optional(),
|
||||
dpi: z.number().int().positive().default(300).describe('Resolution for the output images'),
|
||||
scale: z.number().positive().default(2).describe('Scaling factor to apply before rendering (e.g., 2 for 2x size)').optional(),
|
||||
format: z.enum(['png', 'jpg']).default('png').describe('Output image format'),
|
||||
startPage: z.number().int().positive().describe('First page to convert (1-based index)').optional(),
|
||||
endPage: z.number().int().positive().describe('Last page to convert (1-based index)').optional()
|
||||
});
|
||||
// Add refinements, transformations, and catchall for final validation/parsing
|
||||
export const ConvertCommandSchema = ConvertCommandArgsSchema
|
||||
.catchall(z.any()) // Allow var-* and other properties
|
||||
.transform((data) => {
|
||||
// Explicitly pick known fields + extras (var-*)
|
||||
const known = {
|
||||
input: data.input,
|
||||
output: data.output,
|
||||
dpi: data.dpi,
|
||||
format: data.format,
|
||||
startPage: data.startPage,
|
||||
endPage: data.endPage,
|
||||
scale: data.scale,
|
||||
};
|
||||
// Keep only extra properties (like var-*)
|
||||
const extras = Object.keys(data)
|
||||
.filter(key => !['input', 'output', 'dpi', 'format', 'startPage', 'endPage', 'scale', '_', '$0'].includes(key))
|
||||
.reduce((acc, key) => { acc[key] = data[key]; return acc; }, {});
|
||||
return { ...known, ...extras };
|
||||
})
|
||||
.refine((data) => {
|
||||
if (data.startPage !== undefined && data.endPage !== undefined) {
|
||||
return data.startPage <= data.endPage;
|
||||
}
|
||||
return true;
|
||||
}, {
|
||||
message: "startPage must be less than or equal to endPage",
|
||||
path: ["startPage"],
|
||||
});
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3BkZi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLHNDQUFzQztBQUN0QyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQy9DLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDO0lBQ3hELE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHFEQUFxRCxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzdGLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQztJQUMxRixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0VBQWdFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDN0gsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDO0lBQzdFLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ25HLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQ2pHLENBQUMsQ0FBQztBQUVILDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyx3QkFBd0I7S0FDekQsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztLQUNyRCxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUNsQixnREFBZ0Q7SUFDaEQsTUFBTSxLQUFLLEdBQUc7UUFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7UUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1FBQ25CLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztRQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtRQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1FBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztLQUNsQixDQUFDO0lBQ0YsMENBQTBDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5RyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUM7SUFFMUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFDakMsQ0FBQyxDQUFDO0tBQ0QsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7SUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxFQUFFO0lBQ0QsT0FBTyxFQUFFLGlEQUFpRDtJQUMxRCxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUM7Q0FDcEIsQ0FBQyxDQUFDIn0=
|
||||
36
packages/media/dist-in/lib/process/index.d.ts
vendored
36
packages/media/dist-in/lib/process/index.d.ts
vendored
@ -1,18 +1,18 @@
|
||||
export declare enum STATUS {
|
||||
OK = 0,
|
||||
ERROR = 1,
|
||||
PENDING = 2
|
||||
}
|
||||
export declare class Process {
|
||||
binary: string;
|
||||
cwd: string;
|
||||
args: string;
|
||||
constructor(options?: any);
|
||||
optionsToString(options: any): string;
|
||||
optionsToArray(options: any): string[];
|
||||
exec(command: string, options?: any, args?: any[]): Promise<any>;
|
||||
}
|
||||
export declare class Helper {
|
||||
static run(cwd: any, command: string, gitArgs: string[]): Promise<any>;
|
||||
static runBin(cwd: any, bin: any, command: string, gitArgs: string[]): Promise<any>;
|
||||
}
|
||||
export declare enum STATUS {
|
||||
OK = 0,
|
||||
ERROR = 1,
|
||||
PENDING = 2
|
||||
}
|
||||
export declare class Process {
|
||||
binary: string;
|
||||
cwd: string;
|
||||
args: string;
|
||||
constructor(options?: any);
|
||||
optionsToString(options: any): string;
|
||||
optionsToArray(options: any): string[];
|
||||
exec(command: string, options?: any, args?: any[]): Promise<any>;
|
||||
}
|
||||
export declare class Helper {
|
||||
static run(cwd: any, command: string, gitArgs: string[]): Promise<any>;
|
||||
static runBin(cwd: any, bin: any, command: string, gitArgs: string[]): Promise<any>;
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -2,15 +2,16 @@
|
||||
import { defaults } from './_cli.js';
|
||||
defaults();
|
||||
import * as cli from 'yargs';
|
||||
import { register as registerResize } from './commands/resize.js';
|
||||
registerResize(cli);
|
||||
import { register as registerPDF2JPG } from './commands/pdf2jpg.js';
|
||||
registerPDF2JPG(cli);
|
||||
import { register as registerSVG2JPG } from './commands/svg2jpg.js';
|
||||
registerSVG2JPG(cli);
|
||||
/*
|
||||
import { register as registerPDF2JPG } from './commands/pdf2jpg'; registerPDF2JPG(cli)
|
||||
import { register as registerSVG2JPG } from './commands/svg2jpg'; registerSVG2JPG(cli)
|
||||
import { register as registerConvert } from './commands/convert'; registerConvert(cli)
|
||||
import { register as registerAudio } from './commands/audio'; registerAudio(cli)
|
||||
import { register as registerVideo } from './commands/video'; registerVideo(cli)
|
||||
import { register as registerWatermark } from './commands/watermark'; registerWatermark(cli)
|
||||
import { register as registerResize } from './commands/resize.js'; registerResize(cli)
|
||||
import { register as registerConvert } from './commands/convert.js'; registerConvert(cli)
|
||||
import { register as registerAudio } from './commands/audio.js'; registerAudio(cli)
|
||||
import { register as registerVideo } from './commands/video.js'; registerVideo(cli)
|
||||
import { register as registerWatermark } from './commands/watermark.js'; registerWatermark(cli)
|
||||
*/
|
||||
const argv = cli.argv;
|
||||
if (argv.h || argv.help) {
|
||||
@ -20,4 +21,4 @@ if (argv.h || argv.help) {
|
||||
else if (argv.v || argv.version) {
|
||||
process.exit();
|
||||
}
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQUMsUUFBUSxFQUFFLENBQUE7QUFFaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUE7QUFLNUIsT0FBTyxFQUFFLFFBQVEsSUFBSSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN0Rjs7Ozs7OztFQU9FO0FBRUYsTUFBTSxJQUFJLEdBQVEsR0FBRyxDQUFDLElBQUksQ0FBQztBQUUzQixJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3RCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNuQixDQUFDO0tBQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkIsQ0FBQyJ9
|
||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQUMsUUFBUSxFQUFFLENBQUE7QUFFaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUE7QUFLNUIsT0FBTyxFQUFFLFFBQVEsSUFBSSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN6RixPQUFPLEVBQUUsUUFBUSxJQUFJLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3pGOzs7Ozs7RUFNRTtBQUNGLE1BQU0sSUFBSSxHQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFFM0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDZixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkIsQ0FBQztLQUFNLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25CLENBQUMifQ==
|
||||
2259
packages/media/package-lock.json
generated
2259
packages/media/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -23,6 +23,7 @@
|
||||
"bluebird": "^3.7.2",
|
||||
"fluent-ffmpeg": "^2.1.3",
|
||||
"js-beautify": "^1.14.6",
|
||||
"mupdf": "^1.3.3",
|
||||
"novita-sdk": "^1.0.37",
|
||||
"p-map": "^7.0.3",
|
||||
"sharp": "^0.34.2",
|
||||
@ -32,10 +33,12 @@
|
||||
"zod": "^3.25.74"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/showdown": "^2.0.6"
|
||||
"@types/showdown": "^2.0.6",
|
||||
"vitest": "^3.1.1"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "tsc; mocha --full-trace mocha \"spec/**/*.spec.js\"",
|
||||
"test:pdf": "vitest run tests/pdf",
|
||||
"test-with-coverage": "istanbul cover node_modules/.bin/_mocha -- 'spec/**/*.spec.js'",
|
||||
"lint": "tslint --project=./tsconfig.json",
|
||||
"build": "tsc -p .",
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import * as CLI from 'yargs'
|
||||
import { logger } from '../'
|
||||
import { convert } from '../lib/media/audio/convert'
|
||||
import { logger } from '../index.js'
|
||||
import { convert } from '../lib/media/audio/convert.js'
|
||||
|
||||
import { defaults, sanitizeVideo } from '../_cli'
|
||||
import { defaults, sanitizeVideo } from '../_cli.js'
|
||||
import { IConvertVideoOptions } from '../types'
|
||||
|
||||
export const defaultOptions = (yargs: CLI.Argv) => {
|
||||
|
||||
@ -1,19 +1,19 @@
|
||||
import * as CLI from 'yargs'
|
||||
import { logger } from '../'
|
||||
import { logger } from '../index.js'
|
||||
|
||||
import {
|
||||
convert
|
||||
} from '../lib/media/images'
|
||||
} from '../lib/media/images/index.js'
|
||||
|
||||
import {
|
||||
sanitize,
|
||||
defaults,
|
||||
sanitizeVideo
|
||||
} from '../_cli'
|
||||
} from '../_cli.js'
|
||||
|
||||
import {
|
||||
IOptions
|
||||
} from '../types'
|
||||
} from '../types.js'
|
||||
|
||||
|
||||
export const defaultOptions = (yargs: CLI.Argv) => {
|
||||
|
||||
@ -1,53 +1,73 @@
|
||||
import * as CLI from 'yargs'
|
||||
import { logger } from '../'
|
||||
import * as path from 'path'
|
||||
import { Helper } from '../lib/process/index'
|
||||
import * as pMap from 'p-map'
|
||||
import { logger } from '../index.js'
|
||||
import { existsSync } from 'node:fs';
|
||||
import * as z from 'zod';
|
||||
import { runConversion } from '../lib/pdf/convert.js';
|
||||
import { ConvertCommandConfig, ConvertCommandSchema } from '../lib/pdf/types.js'
|
||||
|
||||
const fg = require('fast-glob')
|
||||
export const command = 'pdf2jpg';
|
||||
export const desc = 'Convert PDF to images';
|
||||
|
||||
const defaultOptions = (yargs: CLI.Argv) => {
|
||||
return yargs.option('input', {
|
||||
default: './',
|
||||
describe: 'The sources'
|
||||
}).option('debug', {
|
||||
default: 'false',
|
||||
describe: 'Enable internal debug message'
|
||||
})
|
||||
};
|
||||
|
||||
let options = (yargs: CLI.Argv) => defaultOptions(yargs);
|
||||
|
||||
async function convertFiles(files){
|
||||
return pMap(files,(file: any) => {
|
||||
const inParts = path.parse(file);
|
||||
// magick convert leg.pdf -quality 100 -density 250 -trim -flatten -resize 200% -sharpen 0x1.0 leg.jpg
|
||||
const promise = Helper.run(inParts.dir, 'convert',
|
||||
[
|
||||
`"${inParts.base}[0]"`,
|
||||
'-quality 80',
|
||||
'-density 250',
|
||||
'-trim',
|
||||
'-flatten',
|
||||
'-sharpen 0x1.0',
|
||||
`"${inParts.name}.jpg"`
|
||||
]);
|
||||
return promise;
|
||||
},{ concurrency: 1 });
|
||||
export const builder = (yargs: CLI.Argv) => {
|
||||
return yargs
|
||||
.option('input', {
|
||||
alias: 'i',
|
||||
describe: 'Path to the input PDF file',
|
||||
demandOption: true,
|
||||
type: 'string'
|
||||
})
|
||||
.option('output', {
|
||||
alias: 'o',
|
||||
describe: 'Output path template (e.g., output/page_{PAGE}.png)',
|
||||
type: 'string'
|
||||
})
|
||||
.option('dpi', {
|
||||
describe: 'Resolution for the output images',
|
||||
default: 300,
|
||||
type: 'number'
|
||||
})
|
||||
.option('scale', {
|
||||
describe: 'Scaling factor to apply before rendering (e.g., 2 for 2x size)',
|
||||
default: 2,
|
||||
type: 'number'
|
||||
})
|
||||
.option('format', {
|
||||
describe: 'Output image format',
|
||||
choices: ['png', 'jpg'],
|
||||
default: 'jpg',
|
||||
type: 'string'
|
||||
})
|
||||
.option('startPage', {
|
||||
describe: 'First page to convert (1-based index)',
|
||||
type: 'number'
|
||||
})
|
||||
.option('endPage', {
|
||||
describe: 'Last page to convert (1-based index)',
|
||||
type: 'number'
|
||||
})
|
||||
}
|
||||
|
||||
export async function handler(argv: CLI.Arguments) {
|
||||
try {
|
||||
const config = ConvertCommandSchema.parse(argv) as ConvertCommandConfig;
|
||||
if (!existsSync(config.input)) {
|
||||
throw new Error(`Input file ${config.input} does not exist`);
|
||||
}
|
||||
logger.info("Calling conversion library function...");
|
||||
const outputFiles = await runConversion(config, logger);
|
||||
logger.info(`Conversion completed successfully`);
|
||||
logger.info(`Generated ${outputFiles.length} images`);
|
||||
} catch (error) {
|
||||
if (error instanceof z.ZodError) {
|
||||
logger.error('Invalid arguments:', error.flatten());
|
||||
} else {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
logger.error('Error during conversion command:', message, error);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// node ./build/main.js pdf2jpg --input=../drawings
|
||||
export const register = (cli: CLI.Argv) => {
|
||||
return cli.command('pdf2jpg', '', options, async (argv: CLI.Arguments) => {
|
||||
if (argv.help) { return; }
|
||||
const src = path.resolve('' + argv.input);
|
||||
if (argv.debug) {
|
||||
logger.debug(`Begin convert PDF files${src}`);
|
||||
}
|
||||
const files = fg.sync('*.pdf|*.PDF', { dot: true, cwd: src, absolute: true });
|
||||
await convertFiles(files);
|
||||
if (argv.debug) {
|
||||
logger.debug(`Converted ${files.length} files`);
|
||||
}
|
||||
})
|
||||
return cli.command(command, desc, builder, handler)
|
||||
}
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
import * as CLI from 'yargs';
|
||||
import { debug } from '@plastichub/core/debug'
|
||||
import * as path from 'path';
|
||||
import { Helper } from '../lib/process/index';
|
||||
import { Helper } from '../lib/process/index.js';
|
||||
import * as bluebird from 'bluebird';
|
||||
|
||||
import { logger } from '../index.js';
|
||||
const fg = require('fast-glob');
|
||||
|
||||
const defaultOptions = (yargs: CLI.Argv) => {
|
||||
@ -39,11 +38,11 @@ export const register = (cli: CLI.Argv) => {
|
||||
const src = path.resolve('' + argv.input);
|
||||
const files = fg.sync('*.svg|*.SVG', { dot: true, cwd: src, absolute: true });
|
||||
if (argv.debug) {
|
||||
debug(`Begin convert SVG files at ${src} ${files}`);
|
||||
logger.debug(`Begin convert SVG files at ${src} ${files}`);
|
||||
}
|
||||
await convertFiles(files);
|
||||
if (argv.debug) {
|
||||
debug(`Converted ${files.length} files`);
|
||||
logger.debug(`Converted ${files.length} files`);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import * as CLI from 'yargs'
|
||||
import { logger } from '../'
|
||||
import { convert, merge } from '../lib/media/video'
|
||||
import { defaults, sanitizeVideo } from '../_cli'
|
||||
import { IConvertVideoOptions } from '../types'
|
||||
import { logger } from '../index.js'
|
||||
import { convert, merge } from '../lib/media/video/index.js'
|
||||
import { defaults, sanitizeVideo } from '../_cli.js'
|
||||
import { IConvertVideoOptions } from '../types.js'
|
||||
|
||||
export const defaultOptions = (yargs: CLI.Argv) => {
|
||||
return yargs.option('src', {
|
||||
|
||||
@ -1,18 +1,18 @@
|
||||
import { CONFIG_DEFAULT } from '@polymech/commons'
|
||||
import * as CLI from 'yargs'
|
||||
import { logger } from '../index'
|
||||
import { logger } from '../index.js'
|
||||
import {
|
||||
watermark
|
||||
} from '../lib/media/images'
|
||||
} from '../lib/media/images/watermark.js'
|
||||
|
||||
import {
|
||||
sanitize,
|
||||
defaults
|
||||
} from '../_cli'
|
||||
} from '../_cli.js'
|
||||
|
||||
import {
|
||||
IOptions
|
||||
} from '../types'
|
||||
} from '../types.js'
|
||||
|
||||
export const defaultOptions = (yargs: CLI.Argv) => {
|
||||
return yargs.option('src', {
|
||||
|
||||
@ -5,12 +5,12 @@ import pMap from 'p-map'
|
||||
import * as path from 'path'
|
||||
import * as fs from 'fs'
|
||||
import sharp from 'sharp'
|
||||
import fg from 'fast-glob'
|
||||
|
||||
import { sync as exists } from "@polymech/fs/exists"
|
||||
import { sync as mkdir } from "@polymech/fs/dir"
|
||||
|
||||
const fg = require('fast-glob');
|
||||
const glob = require('glob')
|
||||
import glob from 'glob'
|
||||
|
||||
import { IResizeOptions, logger } from '../../../index.js'
|
||||
import { sanitize } from '../../../_cli.js'
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
// https://novita.ai/playground#remove-watermark
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
import * as bluebird from 'bluebird'
|
||||
import { Promise as BPromise } from 'bluebird'
|
||||
import { CONFIG_DEFAULT } from '@polymech/commons'
|
||||
import BPromise from 'bluebird'
|
||||
import { async as write } from "@polymech/fs/write"
|
||||
import {
|
||||
logger
|
||||
@ -41,7 +41,7 @@ const _watermark = async (file, targets: string[], onNode: (data: any) => void =
|
||||
return BPromise.resolve(targets).map((target) => {
|
||||
options.verbose && logger.debug(`Removing Watermark ${file} to ${target}`)
|
||||
if (options.dry) {
|
||||
return bluebird.resolve()
|
||||
return BPromise.resolve()
|
||||
}
|
||||
return removeWatermark(file, target, onNode, options);
|
||||
}, { concurrency: 1 })
|
||||
|
||||
242
packages/media/src/lib/pdf/convert.ts
Normal file
242
packages/media/src/lib/pdf/convert.ts
Normal file
@ -0,0 +1,242 @@
|
||||
import * as mupdf from 'mupdf'
|
||||
import { Logger } from 'tslog'
|
||||
|
||||
import { dirname } from 'node:path'
|
||||
import { resolveVariables, pathInfoEx } from '@polymech/commons'
|
||||
import { sync as mkdir } from '@polymech/fs/dir'
|
||||
import { writeFileSync } from 'node:fs'
|
||||
import { Buffer } from 'node:buffer'
|
||||
import { statSync } from "node:fs";
|
||||
import { sep, resolve as pathResolve, parse as pathParse, relative as pathRelative } from "node:path";
|
||||
import { readFile } from "node:fs/promises";
|
||||
import { DEFAULT_ROOTS, DEFAULT_VARS } from "@polymech/commons";
|
||||
import { ConvertCommandConfig } from "./types.js";
|
||||
|
||||
export const DEFAULT_OUTPUT_TEMPLATE = "\${SRC_DIR}/\${SRC_NAME}/\${SRC_NAME}_\${PAGE}.\${FORMAT}";
|
||||
|
||||
// Helper function to convert object-like image data to Buffer
|
||||
function imageDataObjectToBuffer(imageDataObject: Record<string, number>): Buffer {
|
||||
const keys = Object.keys(imageDataObject).map(Number).sort((a, b) => a - b);
|
||||
const bufferLength = keys.length > 0 ? keys[keys.length - 1] + 1 : 0; // Determine length based on max index + 1
|
||||
const buffer = Buffer.allocUnsafe(bufferLength); // Use allocUnsafe for performance if overwriting all bytes
|
||||
|
||||
for (const key in imageDataObject) {
|
||||
if (Object.prototype.hasOwnProperty.call(imageDataObject, key)) {
|
||||
const index = parseInt(key, 10);
|
||||
if (!isNaN(index) && index >= 0 && index < bufferLength) {
|
||||
buffer[index] = imageDataObject[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
export type ImageFormat = 'png' | 'jpg';
|
||||
|
||||
export interface PdfToImageOptions {
|
||||
baseVariables: Record<string, any>;
|
||||
outputPathTemplate: string;
|
||||
dpi: number;
|
||||
scale?: number;
|
||||
format: ImageFormat;
|
||||
startPage?: number;
|
||||
endPage?: number;
|
||||
logger?: Logger<any>;
|
||||
}
|
||||
|
||||
export async function convertPdfToImages(
|
||||
pdfData: Buffer,
|
||||
options: PdfToImageOptions
|
||||
): Promise<string[]> {
|
||||
const logger = options.logger || new Logger<any>();
|
||||
const outputFiles: string[] = [];
|
||||
|
||||
try {
|
||||
const doc = mupdf.Document.openDocument(pdfData, 'pdf');
|
||||
const pageCount = doc.countPages();
|
||||
|
||||
// Validate and determine page range (adjusting for 0-based index)
|
||||
const start = (options.startPage ?? 1) - 1;
|
||||
const end = (options.endPage ?? pageCount) - 1;
|
||||
|
||||
if (start < 0 || start >= pageCount) {
|
||||
throw new Error(`startPage (${options.startPage}) is out of valid range (1-${pageCount})`);
|
||||
}
|
||||
if (end < 0 || end >= pageCount) {
|
||||
throw new Error(`endPage (${options.endPage}) is out of valid range (1-${pageCount})`);
|
||||
}
|
||||
if (start > end) {
|
||||
// This should also be caught by Zod schema, but good to double-check
|
||||
throw new Error(`startPage (${options.startPage}) cannot be greater than endPage (${options.endPage})`);
|
||||
}
|
||||
|
||||
const numPagesToProcess = end - start + 1;
|
||||
logger.info(`Processing pages ${start + 1} to ${end + 1} (${numPagesToProcess} pages) of ${pageCount} total`);
|
||||
|
||||
// Determine the scaling matrix
|
||||
const scaleValue = options.scale ?? 2;
|
||||
const matrix = scaleValue === 1 ? mupdf.Matrix.identity : mupdf.Matrix.scale(scaleValue, scaleValue);
|
||||
|
||||
logger.info(`Using scale factor: ${scaleValue}`);
|
||||
|
||||
for (let i = start; i <= end; i++) {
|
||||
const pageNumber = i + 1; // User-facing page number (1-based)
|
||||
|
||||
// Create page-specific variables
|
||||
const pageVariables: Record<string, string> = {
|
||||
...options.baseVariables,
|
||||
PAGE: pageNumber.toString()
|
||||
};
|
||||
|
||||
// Resolve the output path using the template and page-specific variables
|
||||
const outputPath = await resolveVariables(options.outputPathTemplate, false, pageVariables);
|
||||
|
||||
const page = doc.loadPage(i);
|
||||
// Use the scaling matrix here
|
||||
const pixmap = page.toPixmap(
|
||||
matrix,
|
||||
mupdf.ColorSpace.DeviceRGB,
|
||||
false
|
||||
);
|
||||
|
||||
// Note: DPI is implicitly handled by the scaling factor now.
|
||||
// The pixmap dimensions will be scaled * scaleFactor.
|
||||
// We might want to remove the explicit DPI option later if it's confusing.
|
||||
|
||||
const imageData = options.format === 'png'
|
||||
? pixmap.asPNG()
|
||||
: pixmap.asJPEG(60, false);
|
||||
|
||||
mkdir(dirname(outputPath));
|
||||
writeFileSync(outputPath, imageDataObjectToBuffer(imageData as any))
|
||||
outputFiles.push(outputPath);
|
||||
logger.info(`Converted page ${pageNumber} to ${outputPath}`);
|
||||
}
|
||||
|
||||
return outputFiles;
|
||||
} catch (error) {
|
||||
logger.error('Error converting PDF to images:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the PDF to images conversion process.
|
||||
* Generates variables, determines output path, reads PDF, and calls the conversion engine.
|
||||
* @param config - The conversion configuration options (inferred from Zod schema).
|
||||
* @param logger - The logger instance to use for logging.
|
||||
* @returns A promise that resolves with an array of generated image file paths.
|
||||
*/
|
||||
export async function runConversion(config: ConvertCommandConfig, logger: Logger<any>): Promise<string[]> {
|
||||
const inputPath = pathResolve(config.input);
|
||||
let srcInfo: any = {};
|
||||
try {
|
||||
srcInfo = pathInfoEx(inputPath);
|
||||
const parsed = pathParse(inputPath);
|
||||
srcInfo = {
|
||||
...srcInfo,
|
||||
SRC_DIR: parsed.dir,
|
||||
SRC_NAME: parsed.name,
|
||||
SRC_EXT: parsed.ext,
|
||||
};
|
||||
} catch (e) {
|
||||
logger.warn("pathInfoEx not found or failed, using basic path.parse");
|
||||
}
|
||||
|
||||
let baseVariables: Record<string, any> = {
|
||||
...DEFAULT_ROOTS,
|
||||
...DEFAULT_VARS({}),
|
||||
...srcInfo,
|
||||
DPI: config.dpi,
|
||||
FORMAT: config.format,
|
||||
};
|
||||
|
||||
if (baseVariables.ROOT && baseVariables.SRC_DIR) {
|
||||
baseVariables.SRC_REL = pathRelative(baseVariables.ROOT, baseVariables.SRC_DIR);
|
||||
}
|
||||
|
||||
const srcName = baseVariables.SRC_NAME || '';
|
||||
const dashed = srcName.split('-');
|
||||
if (dashed.length > 1) {
|
||||
for (let i = 0; i < dashed.length; i++) {
|
||||
baseVariables[`SRC_NAME-${i}`] = dashed[i];
|
||||
}
|
||||
}
|
||||
const dotted = srcName.split('.');
|
||||
if (dotted.length > 1) {
|
||||
for (let i = 0; i < dotted.length; i++) {
|
||||
baseVariables[`SRC_NAME.${i}`] = dotted[i];
|
||||
}
|
||||
}
|
||||
const underscored = srcName.split('_');
|
||||
if (underscored.length > 1) {
|
||||
for (let i = 0; i < underscored.length; i++) {
|
||||
baseVariables[`SRC_NAME_${i}`] = underscored[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Process var-* arguments directly from config object passed in
|
||||
const cliVars = Object.keys(config).filter(k => k.startsWith('var-')).reduce((acc, k) => {
|
||||
acc[k.replace('var-', '').toUpperCase()] = config[k];
|
||||
return acc;
|
||||
}, {} as Record<string, any>);
|
||||
|
||||
// Uppercase base variable keys
|
||||
baseVariables = Object.keys(baseVariables).reduce((acc, key) => {
|
||||
acc[key.toUpperCase()] = baseVariables[key];
|
||||
return acc;
|
||||
}, {} as Record<string, any>);
|
||||
|
||||
baseVariables = { ...baseVariables, ...cliVars };
|
||||
|
||||
let outputPathTemplate: string;
|
||||
let isExplicitDir = false;
|
||||
|
||||
if (config.output) {
|
||||
const outputPath = pathResolve(config.output);
|
||||
try {
|
||||
const stats = statSync(outputPath);
|
||||
if (stats.isDirectory()) {
|
||||
isExplicitDir = true;
|
||||
}
|
||||
} catch (e: any) {
|
||||
if (config.output.endsWith(sep) || config.output.endsWith("/")) {
|
||||
isExplicitDir = true;
|
||||
} else {
|
||||
isExplicitDir = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (isExplicitDir) {
|
||||
baseVariables["OUT_DIR"] = outputPath;
|
||||
outputPathTemplate = "\${OUT_DIR}/\${SRC_NAME}_\${PAGE}.\${FORMAT}";
|
||||
logger.info(`Output directory specified: ${outputPath}`);
|
||||
} else {
|
||||
outputPathTemplate = config.output;
|
||||
logger.info(`Using output path pattern: ${outputPathTemplate}`);
|
||||
}
|
||||
|
||||
} else {
|
||||
// Use default pattern directly from constant
|
||||
outputPathTemplate = DEFAULT_OUTPUT_TEMPLATE;
|
||||
logger.info(`Using default output path pattern: ${outputPathTemplate}`);
|
||||
}
|
||||
|
||||
// --- Read PDF and Call Conversion (moved from commands/convert.ts) ---
|
||||
logger.info(`Reading PDF: ${config.input}`);
|
||||
const pdfData = await readFile(config.input);
|
||||
|
||||
logger.info(`Starting conversion process...`);
|
||||
const outputFiles = await convertPdfToImages(pdfData, {
|
||||
baseVariables,
|
||||
outputPathTemplate,
|
||||
dpi: config.dpi,
|
||||
format: config.format,
|
||||
scale: config.scale,
|
||||
startPage: config.startPage,
|
||||
endPage: config.endPage,
|
||||
logger
|
||||
});
|
||||
|
||||
return outputFiles;
|
||||
}
|
||||
45
packages/media/src/lib/pdf/types.ts
Normal file
45
packages/media/src/lib/pdf/types.ts
Normal file
@ -0,0 +1,45 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
// Define the base shape for arguments
|
||||
export const ConvertCommandArgsSchema = z.object({
|
||||
input: z.string().describe('Path to the input PDF file'),
|
||||
output: z.string().describe('Output path template (e.g., output/page_{PAGE}.png)').optional(),
|
||||
dpi: z.number().int().positive().default(300).describe('Resolution for the output images'),
|
||||
scale: z.number().positive().default(2).describe('Scaling factor to apply before rendering (e.g., 2 for 2x size)').optional(),
|
||||
format: z.enum(['png', 'jpg']).default('png').describe('Output image format'),
|
||||
startPage: z.number().int().positive().describe('First page to convert (1-based index)').optional(),
|
||||
endPage: z.number().int().positive().describe('Last page to convert (1-based index)').optional()
|
||||
});
|
||||
|
||||
// Add refinements, transformations, and catchall for final validation/parsing
|
||||
export const ConvertCommandSchema = ConvertCommandArgsSchema
|
||||
.catchall(z.any()) // Allow var-* and other properties
|
||||
.transform((data) => {
|
||||
// Explicitly pick known fields + extras (var-*)
|
||||
const known = {
|
||||
input: data.input,
|
||||
output: data.output,
|
||||
dpi: data.dpi,
|
||||
format: data.format,
|
||||
startPage: data.startPage,
|
||||
endPage: data.endPage,
|
||||
scale: data.scale,
|
||||
};
|
||||
// Keep only extra properties (like var-*)
|
||||
const extras = Object.keys(data)
|
||||
.filter(key => !['input', 'output', 'dpi', 'format', 'startPage', 'endPage', 'scale', '_', '$0'].includes(key))
|
||||
.reduce((acc, key) => { acc[key] = data[key]; return acc; }, {} as any);
|
||||
|
||||
return { ...known, ...extras };
|
||||
})
|
||||
.refine((data) => {
|
||||
if (data.startPage !== undefined && data.endPage !== undefined) {
|
||||
return data.startPage <= data.endPage;
|
||||
}
|
||||
return true;
|
||||
}, {
|
||||
message: "startPage must be less than or equal to endPage",
|
||||
path: ["startPage"],
|
||||
});
|
||||
|
||||
export type ConvertCommandConfig = z.infer<typeof ConvertCommandSchema>;
|
||||
@ -1,7 +1,7 @@
|
||||
import { logger } from '../..';
|
||||
import { logger } from '../../index.js';
|
||||
import * as stream from 'stream';
|
||||
import { ChildProcess, exec } from 'child_process';
|
||||
import { os } from '../common/platform';
|
||||
import { os } from '../common/platform.js';
|
||||
|
||||
export enum STATUS {
|
||||
OK,
|
||||
|
||||
@ -6,16 +6,15 @@ import * as cli from 'yargs'
|
||||
import yargs from 'yargs'
|
||||
import { hideBin } from 'yargs/helpers'
|
||||
|
||||
import { register as registerResize } from './commands/resize.js'; registerResize(cli)
|
||||
import { register as registerPDF2JPG } from './commands/pdf2jpg.js'; registerPDF2JPG(cli)
|
||||
import { register as registerSVG2JPG } from './commands/svg2jpg.js'; registerSVG2JPG(cli)
|
||||
/*
|
||||
import { register as registerPDF2JPG } from './commands/pdf2jpg'; registerPDF2JPG(cli)
|
||||
import { register as registerSVG2JPG } from './commands/svg2jpg'; registerSVG2JPG(cli)
|
||||
import { register as registerConvert } from './commands/convert'; registerConvert(cli)
|
||||
import { register as registerAudio } from './commands/audio'; registerAudio(cli)
|
||||
import { register as registerVideo } from './commands/video'; registerVideo(cli)
|
||||
import { register as registerWatermark } from './commands/watermark'; registerWatermark(cli)
|
||||
import { register as registerResize } from './commands/resize.js'; registerResize(cli)
|
||||
import { register as registerConvert } from './commands/convert.js'; registerConvert(cli)
|
||||
import { register as registerAudio } from './commands/audio.js'; registerAudio(cli)
|
||||
import { register as registerVideo } from './commands/video.js'; registerVideo(cli)
|
||||
import { register as registerWatermark } from './commands/watermark.js'; registerWatermark(cli)
|
||||
*/
|
||||
|
||||
const argv: any = cli.argv;
|
||||
|
||||
if (argv.h || argv.help) {
|
||||
|
||||
13
packages/media/tests/pdf/.temp/test.pdf
Normal file
13
packages/media/tests/pdf/.temp/test.pdf
Normal file
@ -0,0 +1,13 @@
|
||||
%PDF-1.4
|
||||
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
|
||||
xref
|
||||
0 4
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000000053 00000 n
|
||||
0000000102 00000 n
|
||||
|
||||
trailer<</Size 4/Root 1 0 R>>
|
||||
startxref
|
||||
149
|
||||
%%EOF
|
||||
BIN
packages/media/tests/pdf/RS485-780.pdf
Normal file
BIN
packages/media/tests/pdf/RS485-780.pdf
Normal file
Binary file not shown.
258
packages/media/tests/pdf/cli/convert.test.ts
Normal file
258
packages/media/tests/pdf/cli/convert.test.ts
Normal file
@ -0,0 +1,258 @@
|
||||
// Test suite for src/commands/convert.ts
|
||||
import { describe, it, expect, vi, beforeEach, Mock, beforeAll } from 'vitest';
|
||||
// Import types first
|
||||
import type { ConvertCommandConfig } from '../../../src/lib/pdf/types.js';
|
||||
import type { Arguments } from 'yargs';
|
||||
// Remove Buffer import if readFile is no longer mocked directly
|
||||
// import { Buffer } from 'node:buffer';
|
||||
// Import path for constants only if needed, remove specific utils
|
||||
import path from 'path';
|
||||
|
||||
// --- Define Mock Functions ---
|
||||
// Keep only mocks needed for the simplified handler
|
||||
const mockRunConversion = vi.fn(); // Mock the library function
|
||||
const mockExistsSync = vi.fn();
|
||||
const mockLoggerInfo = vi.fn();
|
||||
const mockLoggerError = vi.fn();
|
||||
const mockProcessExit = vi.spyOn(process, 'exit').mockImplementation((() => {}) as any);
|
||||
|
||||
// Remove mocks for functions no longer directly called by handler
|
||||
// const mockConvertPdfToImagesFn = vi.fn();
|
||||
// const mockStatSync = vi.fn();
|
||||
// const mockReadFile = vi.fn();
|
||||
// const mockMkdir = vi.fn();
|
||||
// const mockDirname = vi.fn();
|
||||
// const mockBasename = vi.fn();
|
||||
// const mockExtname = vi.fn();
|
||||
// const mockResolve = vi.fn();
|
||||
// const mockParse = vi.fn();
|
||||
// const mockRelative = vi.fn();
|
||||
// const mockResolveVariables = vi.fn();
|
||||
// const mockPathInfoEx = vi.fn();
|
||||
// const mockDEFAULT_ROOTS = { CWD: '/test/cwd', SCRIPT_DIR: '/test/script' };
|
||||
// const mockDEFAULT_VARS = vi.fn().mockReturnValue({ SOME_DEFAULT: 'value' });
|
||||
|
||||
// Use beforeAll for mocks
|
||||
beforeAll(() => {
|
||||
// Mock dependencies using vi.doMock
|
||||
// Remove unused mocks
|
||||
// vi.doMock('../../src/lib/pdf.js', ...)
|
||||
vi.doMock('../../src/lib/pdf/convert.js', () => ({
|
||||
runConversion: mockRunConversion, // Mock the refactored library function
|
||||
}));
|
||||
vi.doMock('node:fs', () => ({
|
||||
existsSync: mockExistsSync,
|
||||
statSync: vi.fn(),
|
||||
promises: {
|
||||
readFile: vi.fn(),
|
||||
writeFile: vi.fn(),
|
||||
}
|
||||
}));
|
||||
// vi.doMock('node:fs/promises', ...)
|
||||
// vi.doMock('node:path', ...)
|
||||
vi.doMock('tslog', () => ({
|
||||
Logger: vi.fn().mockImplementation(() => ({
|
||||
info: mockLoggerInfo,
|
||||
error: mockLoggerError,
|
||||
})),
|
||||
}));
|
||||
// vi.doMock('@polymech/commons', ...)
|
||||
});
|
||||
|
||||
// --- Test Suite ---
|
||||
describe('Convert Command CLI Handler', () => {
|
||||
let convertHandler: typeof import('../../../src/commands/pdf2jpg.js').handler;
|
||||
|
||||
// Import the handler after mocks are set
|
||||
beforeAll(async () => {
|
||||
await vi.dynamicImportSettled(); // Ensure mocks are applied
|
||||
const commandModule = await import('../../../src/commands/pdf2jpg.js');
|
||||
convertHandler = commandModule.handler;
|
||||
});
|
||||
|
||||
// --- Helper Function to Run Handler ---
|
||||
// Helper remains largely the same
|
||||
async function runHandlerHelper(args: Partial<ConvertCommandConfig & { _: (string | number)[], $0: string, output?: string }>) {
|
||||
// Add default values for required fields if not provided in args,
|
||||
// reflecting what yargs + schema default would do.
|
||||
const fullArgs = {
|
||||
_: ['convert'],
|
||||
$0: 'test',
|
||||
dpi: 300,
|
||||
format: 'png',
|
||||
...args,
|
||||
} as Arguments<ConvertCommandConfig & {output?: string}>;
|
||||
|
||||
// Need to simulate the full argv object including potential var-* args
|
||||
// Zod schema parsing happens inside the handler now.
|
||||
|
||||
if (!convertHandler) throw new Error('Handler not loaded');
|
||||
await convertHandler(fullArgs);
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
// Reset only necessary mocks
|
||||
mockRunConversion.mockResolvedValue(['path/to/image1.png']); // Default success
|
||||
mockExistsSync.mockReturnValue(true);
|
||||
// Removed resets for unused mocks
|
||||
mockProcessExit.mockClear();
|
||||
});
|
||||
|
||||
// --- Updated Test cases ---
|
||||
it('should call runConversion with config when output is omitted (uses default)', async () => {
|
||||
const args = {
|
||||
input: 'pdfs/document.pdf',
|
||||
// output is omitted
|
||||
};
|
||||
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockExistsSync).toHaveBeenCalledWith(args.input);
|
||||
expect(mockRunConversion).toHaveBeenCalledTimes(1);
|
||||
// Check the config object passed to runConversion
|
||||
expect(mockRunConversion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
input: args.input,
|
||||
output: undefined, // Output should be undefined in the config passed from handler
|
||||
dpi: 300, // Default DPI
|
||||
format: 'png', // Default format
|
||||
// other args like startPage/endPage should be undefined
|
||||
}),
|
||||
expect.anything() // Logger instance
|
||||
);
|
||||
// Verify final success logs are called
|
||||
expect(mockLoggerInfo).toHaveBeenCalledWith('Conversion completed successfully');
|
||||
expect(mockLoggerInfo).toHaveBeenCalledWith(expect.stringContaining('Generated')); // Check for generated count message
|
||||
expect(mockProcessExit).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should call runConversion with custom output path template when provided', async () => {
|
||||
const customPattern = 'images/custom_${SRC_NAME}_page${PAGE}.${FORMAT}';
|
||||
const args = {
|
||||
input: 'in.pdf',
|
||||
output: customPattern,
|
||||
};
|
||||
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockExistsSync).toHaveBeenCalledWith(args.input);
|
||||
expect(mockRunConversion).toHaveBeenCalledTimes(1);
|
||||
expect(mockRunConversion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
input: args.input,
|
||||
output: customPattern, // Expect the custom pattern string
|
||||
}),
|
||||
expect.anything() // Logger instance
|
||||
);
|
||||
expect(mockProcessExit).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should call runConversion with output path when it is a directory', async () => {
|
||||
const dirPath = 'output/images/';
|
||||
const args = {
|
||||
input: 'some/path/doc.pdf',
|
||||
output: dirPath,
|
||||
};
|
||||
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockExistsSync).toHaveBeenCalledWith(args.input);
|
||||
expect(mockRunConversion).toHaveBeenCalledTimes(1);
|
||||
expect(mockRunConversion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
input: args.input,
|
||||
output: dirPath, // Expect the directory path string
|
||||
}),
|
||||
expect.anything()
|
||||
);
|
||||
expect(mockProcessExit).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
// Test for specific args being passed through
|
||||
it('should call runConversion with specific args', async () => {
|
||||
const args = {
|
||||
input: 'input.pdf',
|
||||
output: 'output/prefix',
|
||||
dpi: 150,
|
||||
format: 'jpg' as const,
|
||||
startPage: 2,
|
||||
endPage: 5,
|
||||
};
|
||||
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockExistsSync).toHaveBeenCalledWith(args.input);
|
||||
expect(mockRunConversion).toHaveBeenCalledTimes(1);
|
||||
expect(mockRunConversion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
input: args.input,
|
||||
output: args.output,
|
||||
dpi: args.dpi,
|
||||
format: args.format,
|
||||
startPage: args.startPage,
|
||||
endPage: args.endPage,
|
||||
}),
|
||||
expect.anything()
|
||||
);
|
||||
expect(mockProcessExit).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
// Test for var-* args being passed through
|
||||
it('should pass var-* arguments to runConversion', async () => {
|
||||
const args = {
|
||||
input: 'input.pdf',
|
||||
'var-MY_VAR': 'myValue',
|
||||
'var-OTHER': 123
|
||||
};
|
||||
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockRunConversion).toHaveBeenCalledTimes(1);
|
||||
expect(mockRunConversion).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
input: args.input,
|
||||
'var-MY_VAR': 'myValue', // Zod schema with catchall should preserve these
|
||||
'var-OTHER': 123,
|
||||
}),
|
||||
expect.anything()
|
||||
);
|
||||
expect(mockProcessExit).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
|
||||
// --- Error Handling Tests ---
|
||||
it('should handle missing input file', async () => {
|
||||
mockExistsSync.mockReturnValue(false);
|
||||
const args = { input: 'nonexistent.pdf' }; // Output is optional
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockRunConversion).not.toHaveBeenCalled(); // Should not be called
|
||||
// Check logger error message (updated)
|
||||
expect(mockLoggerError).toHaveBeenCalledWith(
|
||||
"Error during conversion command:", // Updated error context
|
||||
expect.stringContaining('Input file nonexistent.pdf does not exist'),
|
||||
expect.any(Error)
|
||||
);
|
||||
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
||||
});
|
||||
|
||||
it('should handle conversion error from runConversion', async () => {
|
||||
const conversionError = new Error('Conversion library failed');
|
||||
mockRunConversion.mockRejectedValue(conversionError); // Mock runConversion to throw
|
||||
const args = { input: 'in.pdf', output: 'out' };
|
||||
|
||||
await runHandlerHelper(args);
|
||||
|
||||
expect(mockRunConversion).toHaveBeenCalledTimes(1);
|
||||
// Check logger error message (updated)
|
||||
expect(mockLoggerError).toHaveBeenCalledWith(
|
||||
"Error during conversion command:", // Updated error context
|
||||
conversionError.message,
|
||||
conversionError
|
||||
);
|
||||
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
||||
});
|
||||
|
||||
// Remove tests checking internal logic that was moved (e.g., mkdir calls)
|
||||
});
|
||||
53
packages/media/tests/pdf/cli/variables.test.ts
Normal file
53
packages/media/tests/pdf/cli/variables.test.ts
Normal file
@ -0,0 +1,53 @@
|
||||
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
||||
import { execSync } from 'node:child_process';
|
||||
import { existsSync, rmSync, readdirSync, mkdirSync } from 'node:fs';
|
||||
import * as path from 'node:path';
|
||||
|
||||
const packageRoot = process.cwd(); // Assumes test runs from package root
|
||||
const inputPdf = path.join('tests', 'pdf', 'RS485-780.pdf');
|
||||
const outputDir = path.join(packageRoot, 'tests', 'pdf', 'out', 'RS485-780');
|
||||
const outputPattern = path.join(outputDir, '${SRC_NAME}-${PAGE}.jpg');
|
||||
|
||||
// Expected number of pages for RS485-780.pdf
|
||||
const expectedPageCount = 29;
|
||||
const expectedBaseName = 'RS485-780';
|
||||
const expectedFormat = 'jpg'; // Default format
|
||||
|
||||
describe('CLI Integration Test - Variable Output Path', () => {
|
||||
beforeAll(() => {
|
||||
if (existsSync(outputDir)) {
|
||||
rmSync(outputDir, { recursive: true, force: true });
|
||||
}
|
||||
mkdirSync(outputDir, { recursive: true });
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
if (existsSync(outputDir)) {
|
||||
// rmSync(outputDir, { recursive: true, force: true }); // Optional: clean up after tests
|
||||
}
|
||||
});
|
||||
|
||||
it('should create images in the correct directory with the correct filenames using variable substitution', () => {
|
||||
const command = `node dist-in/main.js pdf2jpg --input "${inputPdf}" --output "${outputPattern}"`;
|
||||
|
||||
try {
|
||||
execSync(command, { encoding: 'utf8', stdio: 'pipe' });
|
||||
} catch (error: any) {
|
||||
console.error('Command execution failed:', error.stderr || error.stdout || error.message);
|
||||
expect.fail(`Command execution failed: ${error.message}`);
|
||||
}
|
||||
|
||||
// 1. Check if the output directory exists
|
||||
expect(existsSync(outputDir), `Output directory "${outputDir}" should exist`).toBe(true);
|
||||
|
||||
// 2. Check the number of files created
|
||||
const files = readdirSync(outputDir);
|
||||
expect(files.length, `Should have created ${expectedPageCount} files`).toBe(expectedPageCount);
|
||||
|
||||
// 3. Check filenames
|
||||
for (let i = 1; i <= expectedPageCount; i++) {
|
||||
const expectedFilename = `${expectedBaseName}-${i}.${expectedFormat}`;
|
||||
expect(files).toContain(expectedFilename);
|
||||
}
|
||||
});
|
||||
});
|
||||
BIN
packages/media/tests/pdf/e5dc.pdf
Normal file
BIN
packages/media/tests/pdf/e5dc.pdf
Normal file
Binary file not shown.
BIN
packages/media/tests/pdf/ifb.pdf
Normal file
BIN
packages/media/tests/pdf/ifb.pdf
Normal file
Binary file not shown.
181
packages/media/tests/pdf/lib/pdf.test.ts
Normal file
181
packages/media/tests/pdf/lib/pdf.test.ts
Normal file
@ -0,0 +1,181 @@
|
||||
// Test suite for src/lib/pdf.ts
|
||||
import { describe, it, expect, vi, beforeEach, Mock, beforeAll } from 'vitest';
|
||||
import { convertPdfToImages, PdfToImageOptions } from '../../../src/lib/pdf/convert.js';
|
||||
import { Logger } from 'tslog';
|
||||
import { Buffer } from 'node:buffer';
|
||||
|
||||
// --- Define Mock Functions FIRST ---
|
||||
const mockWriteFile = vi.fn();
|
||||
const mockAsPNG = vi.fn();
|
||||
const mockAsJPEG = vi.fn();
|
||||
const mockToPixmap = vi.fn();
|
||||
const mockLoadPage = vi.fn();
|
||||
const mockCountPages = vi.fn();
|
||||
const mockOpenDocument = vi.fn();
|
||||
const mockLoggerInfo = vi.fn();
|
||||
const mockLoggerError = vi.fn();
|
||||
|
||||
// Use beforeAll to ensure mocks are set before tests run
|
||||
beforeAll(() => {
|
||||
// Use vi.doMock for non-hoisted mocking
|
||||
vi.doMock('node:fs/promises', () => ({
|
||||
writeFile: mockWriteFile,
|
||||
}));
|
||||
vi.doMock('mupdf', () => ({
|
||||
Document: {
|
||||
openDocument: mockOpenDocument,
|
||||
},
|
||||
ColorSpace: {
|
||||
DeviceRGB: 'DeviceRGB'
|
||||
}
|
||||
}));
|
||||
vi.doMock('tslog', () => ({
|
||||
Logger: vi.fn().mockImplementation(() => ({
|
||||
info: mockLoggerInfo,
|
||||
error: mockLoggerError,
|
||||
})),
|
||||
}));
|
||||
});
|
||||
|
||||
describe('convertPdfToImages Function', () => {
|
||||
let convertPdfToImages: typeof import('../../../src/lib/pdf/convert.js').convertPdfToImages;
|
||||
|
||||
// Import the actual function *after* mocks are applied
|
||||
beforeAll(async () => {
|
||||
// Ensure mocks are ready before importing the module that uses them
|
||||
await vi.dynamicImportSettled();
|
||||
const pdfLib = await import('../../../src/lib/pdf/convert.js');
|
||||
convertPdfToImages = pdfLib.convertPdfToImages;
|
||||
});
|
||||
|
||||
const mockPdfData = Buffer.from('mock-pdf-data');
|
||||
const baseOptions: Omit<PdfToImageOptions, 'outputPathTemplate' | 'baseVariables'> = {
|
||||
dpi: 300,
|
||||
format: 'png',
|
||||
};
|
||||
|
||||
// Mocks returned by other mocks need to be configured within beforeEach
|
||||
const mockPixmap = { asPNG: mockAsPNG, asJPEG: mockAsJPEG };
|
||||
const mockPage = { toPixmap: mockToPixmap };
|
||||
const mockDoc = { countPages: mockCountPages, loadPage: mockLoadPage };
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
|
||||
// Configure mock implementations/return values
|
||||
mockWriteFile.mockResolvedValue(undefined);
|
||||
mockAsPNG.mockReturnValue(Buffer.from('mock-png-data'));
|
||||
mockAsJPEG.mockReturnValue(Buffer.from('mock-jpg-data'));
|
||||
mockToPixmap.mockReturnValue(mockPixmap);
|
||||
mockLoadPage.mockReturnValue(mockPage);
|
||||
mockCountPages.mockReturnValue(5);
|
||||
mockOpenDocument.mockReturnValue(mockDoc);
|
||||
});
|
||||
|
||||
it('should convert all pages to PNG by default', async () => {
|
||||
const options: PdfToImageOptions = { ...baseOptions, outputPathTemplate: 'output/image_${PAGE}.png', baseVariables: {} };
|
||||
const result = await convertPdfToImages(mockPdfData, options);
|
||||
|
||||
expect(mockOpenDocument).toHaveBeenCalledWith(mockPdfData, 'pdf');
|
||||
expect(mockCountPages).toHaveBeenCalled();
|
||||
expect(mockLoadPage).toHaveBeenCalledTimes(5);
|
||||
expect(mockToPixmap).toHaveBeenCalledTimes(5);
|
||||
expect(mockAsPNG).toHaveBeenCalledTimes(5);
|
||||
expect(mockAsJPEG).not.toHaveBeenCalled();
|
||||
expect(mockWriteFile).toHaveBeenCalledTimes(5);
|
||||
expect(mockWriteFile).toHaveBeenNthCalledWith(1, 'output/image_1.png', Buffer.from('mock-png-data'));
|
||||
expect(mockWriteFile).toHaveBeenNthCalledWith(5, 'output/image_5.png', Buffer.from('mock-png-data'));
|
||||
expect(result).toEqual([
|
||||
'output/image_1.png',
|
||||
'output/image_2.png',
|
||||
'output/image_3.png',
|
||||
'output/image_4.png',
|
||||
'output/image_5.png',
|
||||
]);
|
||||
});
|
||||
|
||||
it('should convert specified page range to JPG', async () => {
|
||||
const options: PdfToImageOptions = {
|
||||
...baseOptions,
|
||||
outputPathTemplate: 'jpg_images/page_${PAGE}.jpg',
|
||||
baseVariables: {},
|
||||
format: 'jpg',
|
||||
startPage: 2,
|
||||
endPage: 4,
|
||||
};
|
||||
const result = await convertPdfToImages(mockPdfData, options);
|
||||
|
||||
expect(mockLoadPage).toHaveBeenCalledTimes(3); // Pages 2, 3, 4
|
||||
expect(mockLoadPage).toHaveBeenNthCalledWith(1, 1); // 0-based index for page 2
|
||||
expect(mockLoadPage).toHaveBeenNthCalledWith(3, 3); // 0-based index for page 4
|
||||
expect(mockToPixmap).toHaveBeenCalledTimes(3);
|
||||
expect(mockAsJPEG).toHaveBeenCalledTimes(3);
|
||||
expect(mockAsPNG).not.toHaveBeenCalled();
|
||||
expect(mockWriteFile).toHaveBeenCalledTimes(3);
|
||||
expect(mockWriteFile).toHaveBeenNthCalledWith(1, 'jpg_images/page_2.jpg', Buffer.from('mock-jpg-data'));
|
||||
expect(mockWriteFile).toHaveBeenNthCalledWith(3, 'jpg_images/page_4.jpg', Buffer.from('mock-jpg-data'));
|
||||
expect(result).toEqual([
|
||||
'jpg_images/page_2.jpg',
|
||||
'jpg_images/page_3.jpg',
|
||||
'jpg_images/page_4.jpg',
|
||||
]);
|
||||
});
|
||||
|
||||
it('should throw error for invalid startPage', async () => {
|
||||
const options: PdfToImageOptions = { ...baseOptions, outputPathTemplate: 'err', baseVariables: {}, startPage: 0 };
|
||||
await expect(convertPdfToImages(mockPdfData, options))
|
||||
.rejects.toThrow('startPage (0) is out of valid range (1-5)');
|
||||
});
|
||||
|
||||
it('should throw error for invalid endPage', async () => {
|
||||
mockCountPages.mockReturnValue(3); // Adjust page count for this test
|
||||
const options: PdfToImageOptions = { ...baseOptions, outputPathTemplate: 'err', baseVariables: {}, endPage: 4 };
|
||||
await expect(convertPdfToImages(mockPdfData, options))
|
||||
.rejects.toThrow('endPage (4) is out of valid range (1-3)');
|
||||
});
|
||||
|
||||
it('should throw error if startPage > endPage', async () => {
|
||||
const options: PdfToImageOptions = { ...baseOptions, outputPathTemplate: 'err', baseVariables: {}, startPage: 4, endPage: 2 };
|
||||
await expect(convertPdfToImages(mockPdfData, options))
|
||||
.rejects.toThrow('startPage (4) cannot be greater than endPage (2)');
|
||||
});
|
||||
|
||||
it('should propagate errors from mupdf loadPage', async () => {
|
||||
const mupdfError = new Error('mupdf loadPage failed');
|
||||
mockLoadPage.mockImplementation(() => {
|
||||
throw mupdfError;
|
||||
});
|
||||
const options: PdfToImageOptions = { ...baseOptions, outputPathTemplate: 'mupdf_err', baseVariables: {} };
|
||||
await expect(convertPdfToImages(mockPdfData, options))
|
||||
.rejects.toThrow('mupdf loadPage failed');
|
||||
});
|
||||
|
||||
it('should propagate errors from writeFile', async () => {
|
||||
const fsError = new Error('fs failed');
|
||||
mockWriteFile.mockImplementation(async () => {
|
||||
throw fsError;
|
||||
});
|
||||
const options: PdfToImageOptions = { ...baseOptions, outputPathTemplate: 'fs_err', baseVariables: {} };
|
||||
await expect(convertPdfToImages(mockPdfData, options))
|
||||
.rejects.toThrow('fs failed');
|
||||
});
|
||||
|
||||
it('should use provided logger', async () => {
|
||||
const customLogger = { info: vi.fn(), error: vi.fn() };
|
||||
const options: PdfToImageOptions = {
|
||||
...baseOptions,
|
||||
outputPathTemplate: 'log_test_${PAGE}.png',
|
||||
baseVariables: {},
|
||||
logger: customLogger as any
|
||||
};
|
||||
await convertPdfToImages(mockPdfData, options);
|
||||
expect(customLogger.info).toHaveBeenCalledWith(expect.stringContaining('Processing pages 1 to 5'));
|
||||
expect(customLogger.info).toHaveBeenCalledWith(expect.stringContaining('Converted page 1 to log_test_1.png'));
|
||||
expect(customLogger.info).toHaveBeenCalledTimes(6);
|
||||
expect(mockLoggerInfo).not.toHaveBeenCalled(); // Ensure default mock logger wasn't used
|
||||
});
|
||||
});
|
||||
|
||||
// Need to alias the mock for use within the test file scope
|
||||
import * as fsPromises from 'node:fs/promises';
|
||||
import * as mupdf from 'mupdf';
|
||||
BIN
packages/media/tests/pdf/out/RS485-780.pdf
Normal file
BIN
packages/media/tests/pdf/out/RS485-780.pdf
Normal file
Binary file not shown.
BIN
packages/media/tests/pdf/out/e5dc/_3.png
Normal file
BIN
packages/media/tests/pdf/out/e5dc/_3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
BIN
packages/media/tests/pdf/out/e5dc/_4.png
Normal file
BIN
packages/media/tests/pdf/out/e5dc/_4.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 88 KiB |
BIN
packages/media/tests/pdf/out/e5dc/_5.png
Normal file
BIN
packages/media/tests/pdf/out/e5dc/_5.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
BIN
packages/media/tests/pdf/out/simple_test.png
Normal file
BIN
packages/media/tests/pdf/out/simple_test.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
Loading…
Reference in New Issue
Block a user