UNPKG

@micro-frame/marko

Version:

A Marko tag for building SSR friendly micro frontends.

86 lines (85 loc) 3 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __reExport = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); } return target; }; var __toModule = (module2) => { return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); }; var import_writable_dom = __toModule(require("writable-dom")); module.exports = { onCreate() { const ssrEl = document.getElementById(this.id); let loading = true; if (ssrEl) { this.src = ssrEl.dataset.src; ssrEl.removeAttribute("data-src"); ssrEl.removeAttribute("id"); loading = false; } this.state = { loading, err: void 0 }; }, onMount() { this.onUpdate(); }, onDestroy() { var _a; (_a = this.controller) == null ? void 0 : _a.abort(); }, async onUpdate() { var _a; if (this.src === this.input.src) return; (_a = this.controller) == null ? void 0 : _a.abort(); this.state.loading = true; this.state.err = void 0; this.src = this.input.src; const controller = this.controller = new AbortController(); let writable; let err; try { const options = { cache: this.input.cache, signal: controller.signal, headers: Object.assign({}, this.input.headers, { accept: "text/html" }) }; const res = await (this.input.fetch ? this.input.fetch(this.src, options, fetch) : fetch(this.src, options)); if (!res.ok) throw new Error(res.statusText); writable = (0, import_writable_dom.default)(this.el, this.el.lastChild.previousSibling); if (this.input.clientReorder) { writable.write(await res.text()); } else { const reader = res.body.getReader(); const decoder = new TextDecoder(); let value; while (value = (await reader.read()).value) { writable.write(decoder.decode(value)); } } await writable.close(); } catch (_err) { err = _err; writable == null ? void 0 : writable.abort(err); } if (controller === this.controller) { if (err && !this.input.catch) throw err; this.state.loading = false; this.state.err = err; } } };