UNPKG

twing

Version:

First-class Twig engine for Node.js

118 lines (117 loc) 3.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createOutputBuffer = void 0; const stream_1 = require("stream"); const createOutputHandler = () => { let content = ''; return { getContent: () => { return content; }, write: (value) => { content = value; }, append: (value) => { content += value; } }; }; const createOutputBuffer = () => { const handlers = []; const outputStream = new stream_1.PassThrough(); /** * Append the string to the top-most buffer or write it to the output stream if there is none * * @param {string} string | void */ const outputWrite = (string) => { const active = getActive(); if (active) { active.append(string); } else { outputStream.write(string); } }; const getActive = () => { if (handlers.length > 0) { return handlers[handlers.length - 1]; } else { return null; } }; const outputBuffer = { get outputStream() { return outputStream; }, clean: () => { const active = getActive(); if (!active) { throw new Error('Failed to clean buffer: no buffer to clean.'); } active.write(''); return true; }, echo(value) { if (typeof value === 'boolean') { value = (value === true) ? '1' : ''; } else if (typeof value === "number") { value = String(value); } else if (value === null || value === undefined) { value = ''; } return outputWrite(value); }, endAndClean: () => { outputBuffer.clean(); handlers.pop(); return true; }, endAndFlush: () => { if (!getActive()) { throw new Error('Failed to delete and flush buffer: no buffer to delete or flush.'); } outputBuffer.flush(); handlers.pop(); return true; }, flush: () => { let active = getActive(); if (!active) { throw new Error('Failed to flush buffer: no buffer to flush.'); } handlers.pop(); outputWrite(active.getContent()); active.write(''); handlers.push(active); return true; }, getAndClean: () => { const content = outputBuffer.getContents(); outputBuffer.endAndClean(); return content; }, getAndFlush: () => { const content = outputBuffer.getContents(); outputBuffer.endAndFlush(); return content; }, getContents: () => { const activeOutputHandler = getActive(); return activeOutputHandler ? activeOutputHandler.getContent() : ''; }, getLevel: () => { return handlers.length; }, start: () => { const handler = createOutputHandler(); handlers.push(handler); return true; } }; return outputBuffer; }; exports.createOutputBuffer = createOutputBuffer;