stencil-quantum
Version:
Experience the quantum realm of stencil.
99 lines (98 loc) • 3.39 kB
JavaScript
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;
};
}