UNPKG

@paroicms/server

Version:
63 lines 2.93 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 createSetLiquidTag() { const handlers = new Map(); return { tagClass: class GetTag extends Tag { #varName; #handlerName; #positionalTokens = []; #namedEntries = []; constructor(token, remainTokens, liquid) { super(token, remainTokens, liquid); const varId = this.tokenizer.readIdentifier(); this.#varName = varId?.content ?? ""; this.tokenizer.skipBlank(); this.tokenizer.assert(this.tokenizer.peek() === "=", "Syntax error, expected '='"); this.tokenizer.advance(); 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)); let val; try { const result = handler(renderingContext, { positionedParameters, namedParameters, variableName: this.#varName, ctx, }); if (isGeneratorObject(result)) { val = consumeGenerator(result); } else if (isPromise(result)) { val = yield wrapLiquidTagPromise(renderingContext, result, `set:${this.#handlerName}`); } else { val = result; } } catch (error) { logger.error(`Error in {% set ${this.#varName} = ${this.#handlerName}(...) %}"`, error); val = undefined; } ctx.bottom()[this.#varName] = val; } }, registerHandler(name, handler) { handlers.set(name, handler); }, }; } //# sourceMappingURL=set-liquid-tag.js.map