@paroicms/server
Version:
The ParoiCMS server
63 lines • 2.93 kB
JavaScript
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