UNPKG

@paroicms/server

Version:
51 lines 2.4 kB
import { Tag, } from "liquidjs"; import { isPromise } from "node:util/types"; import { extractRenderingContext } from "../../liquidjs-tools/liquidjs-utils.js"; import { evaluateFunctionCallArgs, parseFunctionCallFromTokenizer, } from "./liquid-function-call-args.js"; import { consumeGenerator, isGeneratorObject, wrapLiquidTagPromise } from "./liquid-tag-helpers.js"; export function createOutLiquidTag() { const handlers = new Map(); return { tagClass: class OutTag extends Tag { #handlerName; #positionalTokens = []; #namedEntries = []; constructor(token, remainTokens, liquid) { super(token, remainTokens, liquid); const parsed = parseFunctionCallFromTokenizer(this.tokenizer); this.#handlerName = parsed.handlerName; this.#positionalTokens = parsed.positionalTokens; this.#namedEntries = parsed.namedEntries; } *render(ctx, emitter) { const renderingContext = extractRenderingContext(ctx); const { logger } = renderingContext.siteContext; const handler = handlers.get(this.#handlerName); if (!handler) throw new Error(`Unknown handler '${this.#handlerName}'`); const { positionedParameters, namedParameters } = (yield* evaluateFunctionCallArgs(ctx, this.#positionalTokens, this.#namedEntries)); const result = handler(renderingContext, { positionedParameters, namedParameters, ctx }); let val; try { if (isGeneratorObject(result)) { val = consumeGenerator(result); } else if (isPromise(result)) { val = yield wrapLiquidTagPromise(renderingContext, result, `out:${this.#handlerName}`); } else { val = result; } emitter.write(String(val)); } catch (error) { logger.error(`Error in {% out ${this.#handlerName}(...) %}"`, error); } } }, registerHandler(name, handler) { handlers.set(name, handler); }, }; } //# sourceMappingURL=out-liquid-tag.js.map