UNPKG

stencil-quantum

Version:

Experience the quantum realm of stencil.

99 lines (98 loc) 3.39 kB
import { Provider } from "./provider"; import { hookComponent } from "./utils"; import { getElement } from "@stencil/core"; const $error = Symbol.for("stencil-quantum-error"); export class QuantumError extends Error { constructor(err, target) { super(err instanceof Error ? err.message : err); this.target = target; if (err instanceof Error) Object.assign(this, err); } } export function throwQuantum(el, error) { const err = new QuantumError(error, el); console.error(err); try { const provider = Provider.find(el, $error); provider.provide(err); } catch (e) { throw err; } } export function Throw(opts) { return function (prototype, propertyName) { let provider; hookComponent(prototype, "componentWillLoad", obj => { const el = getElement(obj); try { provider = Provider.find(el, $error, opts === null || opts === void 0 ? void 0 : opts.namespace); provider.attach(el); provider.hook(el); } catch (err) { throwQuantum(el, err); } }); if (delete prototype[propertyName]) { Object.defineProperty(prototype, propertyName, { get: () => provider === null || provider === void 0 ? void 0 : provider.retrieve(), set: (v) => provider === null || provider === void 0 ? void 0 : provider.provide(v), enumerable: true, configurable: true }); } }; } export function ContextError(opts) { return function (prototype, propertyName) { let provider; hookComponent(prototype, "componentWillLoad", obj => { const el = getElement(obj); provider = Provider.create(el, $error, prototype[propertyName], opts === null || opts === void 0 ? void 0 : opts.namespace); try { provider.attach(el); provider.hook(el); } catch (err) { throwQuantum(el, err); } }); if (delete prototype[propertyName]) { Object.defineProperty(prototype, propertyName, { get: () => provider === null || provider === void 0 ? void 0 : provider.retrieve(), set: (v) => provider === null || provider === void 0 ? void 0 : provider.provide(v), enumerable: true, configurable: true }); } }; } export function Catch(opts) { return function (prototype, propertyName, propertyDesciptor) { hookComponent(prototype, "componentWillLoad", obj => { const el = getElement(obj); const provider = Provider.create(el, $error, undefined, opts === null || opts === void 0 ? void 0 : opts.namespace); const responseProvider = (opts === null || opts === void 0 ? void 0 : opts.provide) ? Provider.create(el, opts.provide, undefined, opts.namespace) : undefined; try { provider.attach(el); responseProvider === null || responseProvider === void 0 ? void 0 : responseProvider.attach(el); provider.listen(async (v) => { var _a; try { const response = await ((_a = propertyDesciptor.value) === null || _a === void 0 ? void 0 : _a.apply(obj, [v])); responseProvider === null || responseProvider === void 0 ? void 0 : responseProvider.provide(response); } catch (err) { throwQuantum(el, err); } }); } catch (err) { throwQuantum(el, err); } }); return propertyDesciptor; }; }