From b105d533a2f5f8a8779ec0372745726b963da118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Urba=C5=84czyk?= Date: Thu, 4 Mar 2021 11:44:51 +0100 Subject: [PATCH] feat: file-templates as array (#38) --- README.md | 2 +- .../__tests__/file-tests/file-templates.js | 12 +++++++++ .../__tests__/file-tests/single-template.js | 8 ++++++ src/renderer/__tests__/template.spec.ts | 27 +++++++++++++++++++ src/renderer/template.ts | 6 ++++- src/transpiler/__tests__/transpiler.spec.tsx | 14 +++++----- 6 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 src/renderer/__tests__/file-tests/file-templates.js create mode 100644 src/renderer/__tests__/file-tests/single-template.js create mode 100644 src/renderer/__tests__/template.spec.ts diff --git a/README.md b/README.md index 49b221c9..84a1507f 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Restrictions: - HTML tags at the moment is not supported. - React internal components like Fragments, Suspense etc. are skipped. -### The debug flag +## The debug flag When rendering you have the option of passing a `debug` flag which does not remove the transpiled files after the rendering process is done. diff --git a/src/renderer/__tests__/file-tests/file-templates.js b/src/renderer/__tests__/file-tests/file-templates.js new file mode 100644 index 00000000..84cfc361 --- /dev/null +++ b/src/renderer/__tests__/file-tests/file-templates.js @@ -0,0 +1,12 @@ +/* eslint-disable */ + +const React = require('react'); +const { File } = require('../../../components'); + +module.exports = function() { + return [ + React.createElement(File, { name: 'file1.html' }, ['Content1']), + undefined, + React.createElement(File, { name: 'file2.html' }, ['Content2']) + ]; +}; diff --git a/src/renderer/__tests__/file-tests/single-template.js b/src/renderer/__tests__/file-tests/single-template.js new file mode 100644 index 00000000..ac52d59b --- /dev/null +++ b/src/renderer/__tests__/file-tests/single-template.js @@ -0,0 +1,8 @@ +/* eslint-disable */ + +const React = require('react'); +const { File } = require('../../../components'); + +module.exports = function() { + return React.createElement(File, { name: 'file.html' }, ['Content']); +}; diff --git a/src/renderer/__tests__/template.spec.ts b/src/renderer/__tests__/template.spec.ts new file mode 100644 index 00000000..ea28b6e1 --- /dev/null +++ b/src/renderer/__tests__/template.spec.ts @@ -0,0 +1,27 @@ +import path from "path"; +import { renderTemplate } from "../template"; +import { TemplateRenderResult } from "../../types"; + +describe('renderTemplate', () => { + test('should render a single File template', async () => { + const filePath = path.resolve(__dirname, './file-tests/single-template.js'); + const renderedContent = await renderTemplate(filePath, {} as any) as TemplateRenderResult; + + expect(typeof renderedContent).toEqual('object'); + expect(renderedContent.content).toEqual('Content'); + expect(renderedContent.metadata.fileName).toEqual('file.html'); + }); + + test('should render an array of File templates', async () => { + const filePath = path.resolve(__dirname, './file-tests/file-templates.js'); + const renderedContent = await renderTemplate(filePath, {} as any) as TemplateRenderResult[]; + + expect(Array.isArray(renderedContent)).toEqual(true); + expect(typeof renderedContent[0]).toEqual('object'); + expect(renderedContent[0].content).toEqual('Content1'); + expect(renderedContent[0].metadata.fileName).toEqual('file1.html'); + expect(typeof renderedContent[1]).toEqual('object'); + expect(renderedContent[1].content).toEqual('Content2'); + expect(renderedContent[1].metadata.fileName).toEqual('file2.html'); + }); +}); diff --git a/src/renderer/template.ts b/src/renderer/template.ts index 322b5ed9..463e4fef 100644 --- a/src/renderer/template.ts +++ b/src/renderer/template.ts @@ -9,7 +9,7 @@ import { TemplateContext, TemplateRenderResult } from "../types"; * * @param filepath the path to file to render */ -export async function renderTemplate(filepath: string, context: TemplateContext): Promise { +export async function renderTemplate(filepath: string, context: TemplateContext): Promise { if (!isJsFile(filepath)) { return undefined; } @@ -25,6 +25,10 @@ export async function renderTemplate(filepath: string, context: TemplateContext) if (!data) { return undefined; } + + if (Array.isArray(data)) { + return data.map(file => file && renderFile(file)).filter(Boolean); + } return renderFile(data); } diff --git a/src/transpiler/__tests__/transpiler.spec.tsx b/src/transpiler/__tests__/transpiler.spec.tsx index 7be86956..7a4449d6 100644 --- a/src/transpiler/__tests__/transpiler.spec.tsx +++ b/src/transpiler/__tests__/transpiler.spec.tsx @@ -1,11 +1,13 @@ -import { transpileFiles } from "../"; import fs from 'fs'; import path from 'path'; import { promisify } from 'util'; -import { renderTemplate } from "../../renderer/index"; import { AsyncAPIDocument } from "@asyncapi/parser"; -const readFile = promisify(fs.readFile); +import { transpileFiles } from "../transpiler"; +import { renderTemplate } from "../../renderer"; +import { TemplateRenderResult } from "../../types"; + +const readFile = promisify(fs.readFile); describe('Transpiler', () => { const testFiles = path.resolve(__dirname, './testfiles'); @@ -34,7 +36,7 @@ describe('Transpiler', () => { }); test('and render correctly', async () => { const content = await renderTemplate(commonjs_testFile, { asyncapi: {} as AsyncAPIDocument, originalAsyncAPI: "", params: {} }); - expect(content?.content).toBe("hello Test"); + expect((content as TemplateRenderResult)?.content).toBe("hello Test"); }); }); }); @@ -51,7 +53,7 @@ describe('Transpiler', () => { }); test('and render correctly', async () => { const content = await renderTemplate(es5_testFile, { asyncapi: {} as AsyncAPIDocument, originalAsyncAPI: "", params: {} }); - expect(content?.content).toBe("hello Test"); + expect((content as TemplateRenderResult)?.content).toBe("hello Test"); }); }); }); @@ -68,7 +70,7 @@ describe('Transpiler', () => { }); test('and render correctly', async () => { const content = await renderTemplate(es6_testFile, { asyncapi: {} as AsyncAPIDocument, originalAsyncAPI: "", params: {} }); - expect(content?.content).toBe("hello Test"); + expect((content as TemplateRenderResult)?.content).toBe("hello Test"); }); }); });