import { NativeResult } from './imageMagick/createMain'; /** * Representation of input and output files. Use [[File]] class static methods to easily build files from * filesystem files or urls . */ export interface IFile { /** * Name for this file. Commands referencing this file must do so using this exact name. */ name: string; /** * The content of the file. */ content: ArrayBufferView; } export interface NativeOptions extends BaseOptions { /** * (Node.js and CLI only). In Node.js the local file system will be used to read/write files instead of * memory (like in the browser). This folder will be used for that, by default, ./working_tmp. IMPORTANT: * the content of this folder will be removed each time the tool is executed. */ nodeFsLocalRoot: string; /** * Internal root FS directed path. This should rarely be configured by users. */ emscriptenNodeFsRoot: string; /** * (CLI only). Output files will be written in this folder. By default is current directory. */ outputDir: string; /** * Don't use system's filesystem in Node.js but memory filesystem (just like in the browser). This could be * faster if read/write many images but consumes more memory. */ disableNodeFs?: boolean; /** * If true and when running on node.js, and only if image magick commands are available in the local system, * it will execute the commands using the local native ImageMagick commands, instead of running them though * the emscripten port (which is slower and support less capabilities). */ useNative?: boolean; /** * main() commands are queued and this defines de limit of running commands at the same time. it's no so * important since the main() call is synch but files/urls are resolved also so this has an impact on those * async operations */ mainConcurrency: number; /** * main() commands are queued and this is the milliseconds to wait before starting a new main command */ mainInterval: 0; customCommandPrefix?: string; } interface BaseOptions { debug?: boolean; } export interface Options extends NativeOptions { /** * Will register output files as protected files so they are not deleted in the future calls. Are managed by * the user. * * Notice that protected files are not returned as [[output files]] */ protectOutputFiles?: boolean; /** * An ImageMagick command, for example: `['convert', 'foo/bar.png', '-scale', '50%', 'out.gif']`. If it's a string it will be * splited by white spaces. IMPORTANT: If you need to escape arguments like file names with spaces, use single quotes `'` */ command: string | string[]; /** * The list of input files referenced in given [[command]]. It's important that the name of this files match * the file names given in the command. If string and a file exists (node.js) then that file will be used. * Otherwise it will be considered a url. In later cases, the filename will be the base name of file or url. */ inputFiles?: (string | IFile | undefined)[]; /** * Will automatically add -verbose argument to convert command and parse stdout returning [VerboseInfo] in * the result's [verbose] property. */ verbose?: boolean; } export interface Result extends NativeResult { outputFiles: T[]; times?: { total: number; }; verbose?: VerboseInfo[]; } interface VerboseInfo { inputName: string; outputName: string; inputFormat: string; inputSize: { width: number; height: number; }; outputSize: { width: number; height: number; }; } export interface CliOptions extends Options { help?: boolean; input: string[]; } export interface ScriptEvent { name: 'beforeCommand' | 'afterCommand' | 'onScriptStart' | 'onScriptEnd'; stopPropagation: boolean; scriptOptions: RunOptions; scriptInterrupt: boolean; commandOptions?: Partial; commandResult?: Result; } export interface RunOptions extends Partial { /** * If an array of string is given each item will be executed just like main's [[Options.command]]. * * If a string is provided, then it will be parsed and executed as shell script. * * IMPORTANT: If you need to escape arguments like file names or expressions containing white spaces, use single quotes `'`. Double quotes currently won't work. * * Examples: * * ```js * const result = await run({script: ` * * # lines starting with # like this one are omitted (comments) * convert rose: -sharpen 0x1 reconstruct.jpg * * # The next command reads input file reconstruct.jpg which was previous' command output file: * compare rose: reconstruct.jpg difference.png * * # Like shell scripts the same command can be divided in multiple lines by using `\` like in: * convert -size 250x100 xc: +noise Random -channel R -threshold .4% \\ * -negate -channel RG -separate +channel \\ * ( +clone ) -compose multiply -flatten \\ * -virtual-pixel Tile -background Black \\ * -blur 0x.6 -motion-blur 0x15-90 -normalize \\ * +distort Polar 0 +repage 'star inward.gif' * `}) * ``` */ script?: string | string[]; } /** * Represent the result of executing a sequence of commands. In this case outputFiles are the output files of * just the last command, while stdout, stderr are the concatenation of all commands output. */ export interface RunResult extends Result { /** * Sequence of results for each command found in the script, in order. */ results: Result[]; /** * The command sequence decoded from given script. */ commands: string[][]; } export interface CommandPreprocessor { name: string; fnCompileTime?(context: O): Promise; fnRuntime?(commandOptions: RO, commandIndex: number, runOptions: O): Promise; } export interface Size { width: number; height: number; } export interface Point { x: number; y: number; } export interface Rectangle extends Size, Point { } export interface Rgba { r: number; g: number; b: number; a: number; } export {};