diff --git a/spec/executionContextSpec.ts b/spec/executionContextSpec.ts index dfa0096..e6744f2 100644 --- a/spec/executionContextSpec.ts +++ b/spec/executionContextSpec.ts @@ -83,8 +83,7 @@ export default describe('executionContext', () => { it('should addBuiltInImages()', async done => { let all = await context.getAllFiles() expect(all.find(i => i.name === 'rose:')).toBeUndefined() - const builtIn = await context.addBuiltInImages() - expect(builtIn.find(i => i.name === 'rose:')).toBeDefined() + await context.addBuiltInImages() all = await context.getAllFiles() expect(all.find(i => i.name === 'rose:')).toBeDefined() done() diff --git a/spec/imageHomeSpec.ts b/spec/imageHomeSpec.ts index a367ca5..fa93920 100644 --- a/spec/imageHomeSpec.ts +++ b/spec/imageHomeSpec.ts @@ -20,4 +20,18 @@ export default describe('imageHome', () => { expect(all.find(f => f.name === 'holocaust.jpg')).toBeTruthy() done() }) + + it('should addBuiltInImages()', async done => { + + const imageHome = createImageHome() + let all = await imageHome.getAll() + expect(all.find(i => i.name === 'rose:')).toBeUndefined() + // const builtIn = await context.addBuiltInImages() + // expect(builtIn.find(i => i.name === 'rose:')).toBeDefined() + await imageHome.addBuiltInImages() + all = await imageHome.getAll()// .getAllFiles() + expect(all.find(i => i.name === 'rose:')).toBeDefined() + done() + }) + }) diff --git a/src/executionContext.ts b/src/executionContext.ts index a3f7d81..174fbd2 100644 --- a/src/executionContext.ts +++ b/src/executionContext.ts @@ -1,22 +1,23 @@ -import { ImageHome, ExecuteConfig, ExecuteResult, execute, ExecuteCommand, createImageHome, MagickInputFile, MagickFile, extractInfo } from '.' -import pMap from 'p-map' -import { asOutputFile, asInputFile, getBuiltInImages } from './util' +import { createImageHome, execute, ExecuteCommand, ExecuteConfig, ExecuteResult, ImageHome, MagickFile, MagickInputFile } from '.' +import { getBuiltInImages } from './util' /** - * Allow multiple execute() calls remembering previus execute() generated output files and previous given input files that can be used as input files in next calls. + * Allow multiple execute() calls remembering previus execute() generated output files and previous given input files that + * can be used as input files in next calls. */ export interface ExecutionContext { execute(configOrCommands: ExecuteConfig|ExecuteCommand|string): Promise + /** programmatically add new files so they are available if following execute() calls */ addFiles(files: MagickFile[]): void + /** get all the files currently available in this context */ getAllFiles(): Promise - addBuiltInImages(): Promise + // /** add built-in images like `rose:` to this execution context so they are present in getAllFiles() */ + addBuiltInImages(): Promise getFile(name: string): Promise } class ExecutionContextImpl implements ExecutionContext { - private builtInImages: MagickInputFile[] = [] - constructor(private imageHome: ImageHome = createImageHome()) { } @@ -39,26 +40,14 @@ class ExecutionContextImpl implements ExecutionContext { async getAllFiles(): Promise { const all = await this.imageHome.getAll() - return all.concat(this.builtInImages) + return all// .concat(this.builtInImages) } async getFile(name: string): Promise { - return (await this.imageHome.get(name)) || this.builtInImages.find(i => i.name === name) + return (await this.imageHome.get(name))// || this.builtInImages.find(i => i.name === name) } - async addBuiltInImages() { - if (!this.builtInImages.length) { - this.builtInImages = await getBuiltInImages() - // const builtInImages = ['rose:', 'logo:', 'wizard:', 'granite:', 'netscape:'] - // this.builtInImages = await pMap(builtInImages, async name=>{ - // const info = await extractInfo(name) - // // const outputName = `output1.${info[0].image.format.toLowerCase()}` - // const {outputFiles} = await execute({commands:`convert ${name} ${`output1.${info[0].image.format.toLowerCase()}`}`} ) - // outputFiles[0].name = name - // return await asInputFile(outputFiles[0]) - // }) - } - return this.builtInImages + return this.imageHome.addBuiltInImages() } static create(inheritFrom?: ExecutionContext) { diff --git a/src/imageHome.ts b/src/imageHome.ts index a557cfe..74bc036 100644 --- a/src/imageHome.ts +++ b/src/imageHome.ts @@ -1,11 +1,12 @@ -import { MagickInputFile, MagickFile } from '.' -import { asInputFile } from './util/file' +import { MagickInputFile, MagickFile, asInputFile, getBuiltInImages } from '.' +import pMap from 'p-map' export interface ImageHome { get(name: string): Promise register(file: MagickFile, name?: string): void isRegistered(name: string): boolean getAll(): Promise + addBuiltInImages(): Promise } type MagickInputFilePromise = Promise & { resolved: true } @@ -13,6 +14,7 @@ type MagickInputFilePromise = Promise & { resolved: true } class ImageHomeImpl implements ImageHome { private images: { [name: string]: MagickInputFilePromise } = {} + private builtInImagesAdded: boolean = false get(name: string): Promise { return this.images[name] @@ -34,5 +36,13 @@ class ImageHomeImpl implements ImageHome { isRegistered(name: string, andReady: boolean= true): boolean { return this.images[name] && (andReady && this.images[name].resolved) } + + async addBuiltInImages() { + if (!this.builtInImagesAdded) { + await pMap(await getBuiltInImages(), img => this.register(img)) + this.builtInImagesAdded = true + } + } + } export function createImageHome() {return new ImageHomeImpl()}