UNPKG

edge-fragment

Version:

Add ability to render fragments from Edge template engine

90 lines (85 loc) 2.62 kB
// src/provider.ts import edge2 from "edge.js"; // src/fragment_tag.ts var fragmentTag = { block: true, seekable: true, tagName: "fragment", compile(parser, buffer, token) { token.children.forEach((child) => { parser.processToken(child, buffer); }); } }; // src/renderer.ts import edge from "edge.js"; // src/utils.ts function extractFragment(content, sectionName) { const lines = content.split("\n").map((x) => x.trim()); const found = lines.findIndex( (item) => item.startsWith(`@fragment("${sectionName}")`) || item.startsWith(`@fragment('${sectionName}')`) ); if (found < 0) { throw new Error(`Fragment ${sectionName} not found`); } let endCount = 1; let fragmentEnd = -1; for (const [i, line] of lines.slice(found + 1).entries()) { const isEnd = line.startsWith("@end"); const isSelfClosedComponent = line.startsWith("@!"); const isComponent = line.startsWith("@"); if (isEnd) { endCount -= 1; } else if (isComponent && !isSelfClosedComponent) { endCount += 1; } if (endCount === 0) { fragmentEnd = i; break; } } if (endCount !== 0) { throw new Error("Unbalanced edge template"); } if (fragmentEnd === -1) { fragmentEnd = lines.length - 1; } return lines.slice(found + 1, found + fragmentEnd + 1).join("\n"); } // src/renderer.ts var enrichRenderer = (renderer) => { const { render, renderSync, renderRaw, renderRawSync } = renderer; renderer.render = async function(combinedPath, state) { const [templatePath, fragmentName] = combinedPath.split("#"); if (fragmentName) { const rawTemplate = edge.loader.resolve(templatePath).template; const extracted = extractFragment(rawTemplate, fragmentName); return renderRaw.apply(renderer, [extracted, state]); } return render.apply(renderer, [templatePath, state]); }; renderer.renderSync = function(combinedPath, state) { const [templatePath, fragmentName] = combinedPath.split("#"); if (fragmentName) { const rawTemplate = edge.loader.resolve(templatePath).template; const extracted = extractFragment(rawTemplate, fragmentName); return renderRawSync.apply(renderer, [extracted, state]); } return renderSync.apply(renderer, [templatePath, state]); }; return renderer; }; // src/provider.ts var EdgeFragmentServiceProvider = class { constructor(app) { this.app = app; } async boot() { edge2.registerTag(fragmentTag); edge2.onRender(enrichRenderer); } }; export { EdgeFragmentServiceProvider as default }; //# sourceMappingURL=provider.js.map