UNPKG

@antischematic/angular-state-library

Version:
87 lines 16.1 kB
import { inject, InjectionToken, INJECTOR } from "@angular/core"; import { defer, filter, map, Observable } from "rxjs"; import { EventType } from "./interfaces"; import { EVENTS, ROOT_CONFIG, STORE_CONFIG } from "./providers"; import { track, untrack } from "./proxy"; export function isPlainObject(obj) { const proto = Object.getPrototypeOf(obj); return proto === null || proto === Object.prototype; } export function call(target, key, ...args) { return target[key].apply(target, args); } export function wrap(target, property, fn) { const descriptor = Object.getOwnPropertyDescriptor(target, property); const object = descriptor ? descriptor : target; const getOrValue = descriptor?.get ? "get" : "value"; const originalFunction = (descriptor ? descriptor[getOrValue] : object[property]) ?? noop; Object.defineProperty(target, property, { configurable: true, [getOrValue]: function (...args) { return fn.call(untrack(this), originalFunction, ...args); } }); return originalFunction === noop; } export function noop() { } export const UID = new InjectionToken("UID", { factory() { let id = 0; return function getId() { return id++; }; } }); export function events(token, injector = inject(INJECTOR)) { return defer(() => { const context = typeof token === "function" ? injector.get(token) : token; return injector.get(EVENTS).pipe(filter(event => event.context === context)); }); } export function configureStore(config) { return { provide: config.root ? ROOT_CONFIG : STORE_CONFIG, useValue: config }; } export function observeInZone(source, zone) { return new Observable(subscriber => { return zone.run(() => { return source.subscribe(subscriber); }); }); } export function get(token) { return track(inject(token).value); } export function set(token, value) { inject(token).next(value); } function filterByNameType(name, type) { return filter((event) => event.name === name && event.type === type); } export function actionEvent(token, name, injector) { return events(token, injector).pipe(filterByNameType(name, EventType.Dispatch)); } export function action(token, name, injector) { return actionEvent(token, name, injector).pipe(map((event) => event.value)); } export function nextEvent(token, name, injector) { return events(token, injector).pipe(filterByNameType(name, EventType.Next)); } export function next(token, name, injector) { return nextEvent(token, name, injector).pipe(map((event) => event.value)); } export function errorEvent(token, name, injector) { return events(token, injector).pipe(filterByNameType(name, EventType.Error)); } export function error(token, name, injector) { return errorEvent(token, name, injector).pipe(map((event) => event.value)); } export function completeEvent(token, name, injector) { return events(token, injector).pipe(filterByNameType(name, EventType.Complete)); } export function complete(token, name, injector) { return completeEvent(token, name, injector).pipe(filterByNameType(name, EventType.Complete), map(() => undefined)); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBWSxRQUFRLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQXdCLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFHSixTQUFTLEVBS1gsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBVztJQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hDLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsQ0FBQTtBQUN0RCxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUksQ0FBQyxNQUF3QixFQUFFLEdBQVcsRUFBRSxHQUFHLElBQVc7SUFDdkUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN6QyxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUksQ0FBQyxNQUFtQyxFQUFFLFFBQXFCLEVBQUUsRUFBc0M7SUFDcEgsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUUsQ0FBQTtJQUNyRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO0lBQy9D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Q0osQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQTBCLEtBQXVCLEVBQUUsSUFBVSxFQUFFLFFBQW1CO0lBQ3BHLE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUMxQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDN0IsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUEwQixLQUF1QixFQUFFLElBQVUsRUFBRSxRQUFtQjtJQUM1RyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUNoQyxnQkFBZ0IsQ0FBZ0IsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDM0QsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUEwQixLQUF1QixFQUFFLElBQVUsRUFBRSxRQUFtQjtJQUN2RyxPQUFPLGFBQWEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDN0MsZ0JBQWdCLENBQWdCLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQ3pELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FDdEIsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yLCBJTkpFQ1RPUiwgUHJvdmlkZXJUb2tlbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7ZGVmZXIsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBPcGVyYXRvckZ1bmN0aW9uLCB0YXB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1xuICAgQ29tcGxldGVFdmVudCxcbiAgIERpc3BhdGNoRXZlbnQsIEVycm9yRXZlbnQsXG4gICBFdmVudFR5cGUsXG4gICBFeHRyYWN0RXZlbnRzLCBOZXh0RXZlbnQsXG4gICBTdG9yZUNvbmZpZyxcbiAgIFN0b3JlRXZlbnQsXG4gICBab25lQ29tcGF0aWJsZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQge0VWRU5UUywgUk9PVF9DT05GSUcsIFNUT1JFX0NPTkZJR30gZnJvbSBcIi4vcHJvdmlkZXJzXCI7XG5pbXBvcnQge3RyYWNrLCB1bnRyYWNrfSBmcm9tIFwiLi9wcm94eVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmo6IG9iamVjdCkge1xuICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKVxuICAgcmV0dXJuIHByb3RvID09PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsKHRhcmdldDogUmVjb3JkPGFueSwgYW55Piwga2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICByZXR1cm4gdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmdzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcCh0YXJnZXQ6IHsgW2tleTogUHJvcGVydHlLZXldOiBhbnkgfSwgcHJvcGVydHk6IFByb3BlcnR5S2V5LCBmbjogKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueSkge1xuICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eSkhXG4gICBjb25zdCBvYmplY3QgPSBkZXNjcmlwdG9yID8gZGVzY3JpcHRvciA6IHRhcmdldFxuICAgY29uc3QgZ2V0T3JWYWx1ZSA9IGRlc2NyaXB0b3I/LmdldCA/IFwiZ2V0XCIgOiBcInZhbHVlXCJcbiAgIGNvbnN0IG9yaWdpbmFsRnVuY3Rpb24gPSAoZGVzY3JpcHRvciA/IGRlc2NyaXB0b3JbZ2V0T3JWYWx1ZV0gOiBvYmplY3RbcHJvcGVydHldKSA/PyBub29wXG5cbiAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBbZ2V0T3JWYWx1ZV06IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgcmV0dXJuIGZuLmNhbGwodW50cmFjayh0aGlzKSwgb3JpZ2luYWxGdW5jdGlvbiwgLi4uYXJncylcbiAgICAgIH1cbiAgIH0pXG5cbiAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uID09PSBub29wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wKCkge31cblxuZXhwb3J0IGNvbnN0IFVJRCA9IG5ldyBJbmplY3Rpb25Ub2tlbihcIlVJRFwiLCB7XG4gICBmYWN0b3J5KCkge1xuICAgICAgbGV0IGlkID0gMFxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGdldElkKCkge1xuICAgICAgICAgcmV0dXJuIGlkKytcbiAgICAgIH1cbiAgIH1cbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudHM8VD4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPEV4dHJhY3RFdmVudHM8VCwgRXh0cmFjdDxrZXlvZiBULCBzdHJpbmc+Pj5cbmV4cG9ydCBmdW5jdGlvbiBldmVudHM8VD4oY29udGV4dDogVCk6IE9ic2VydmFibGU8RXh0cmFjdEV2ZW50czxULCBFeHRyYWN0PGtleW9mIFQsIHN0cmluZz4+PlxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50czxUPih0b2tlbjogUHJvdmlkZXJUb2tlbjxUPiB8IFQsIGluamVjdG9yID0gaW5qZWN0KElOSkVDVE9SKSk6IE9ic2VydmFibGU8RXh0cmFjdEV2ZW50czxULCBFeHRyYWN0PGtleW9mIFQsIHN0cmluZz4+PiB7XG4gICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHR5cGVvZiB0b2tlbiA9PT0gXCJmdW5jdGlvblwiID8gaW5qZWN0b3IuZ2V0KHRva2VuKSA6IHRva2VuXG4gICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0KEVWRU5UUykucGlwZShcbiAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICAgKVxuICAgfSkgYXMgT2JzZXJ2YWJsZTxFeHRyYWN0RXZlbnRzPFQsIEV4dHJhY3Q8a2V5b2YgVCwgc3RyaW5nPj4+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTdG9yZShjb25maWc6IFN0b3JlQ29uZmlnKSB7XG4gICByZXR1cm4ge1xuICAgICAgcHJvdmlkZTogY29uZmlnLnJvb3QgPyBST09UX0NPTkZJRyA6IFNUT1JFX0NPTkZJRyxcbiAgICAgIHVzZVZhbHVlOiBjb25maWdcbiAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVJblpvbmU8VD4oc291cmNlOiBPYnNlcnZhYmxlPFQ+LCB6b25lOiBab25lQ29tcGF0aWJsZSk6IE9ic2VydmFibGU8VD4ge1xuICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgcmV0dXJuIHpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gICAgICB9KVxuICAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldDxUIGV4dGVuZHMgeyB2YWx1ZTogdW5rbm93biB9Pih0b2tlbjogUHJvdmlkZXJUb2tlbjxUPik6IFRbXCJ2YWx1ZVwiXSB7XG4gICByZXR1cm4gdHJhY2soaW5qZWN0KHRva2VuKS52YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldDxUIGV4dGVuZHMgeyB2YWx1ZTogdW5rbm93biwgbmV4dDogKHZhbHVlOiBUW1widmFsdWVcIl0pID0+IHZvaWQgfT4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIHZhbHVlOiBUW1widmFsdWVcIl0pOiB2b2lkIHtcbiAgIGluamVjdCh0b2tlbikubmV4dCh2YWx1ZSlcbn1cblxudHlwZSBBY3Rpb25QYXJhbXM8VD4gPSBUIGV4dGVuZHMgKC4uLnBhcmFtczogaW5mZXIgUGFyYW1zKSA9PiBhbnkgPyBQYXJhbXMgZXh0ZW5kcyB7IGxlbmd0aDogMSB9ID8gUGFyYW1zWzBdIDogUGFyYW1zIDogbmV2ZXJcblxuZnVuY3Rpb24gZmlsdGVyQnlOYW1lVHlwZTxUIGV4dGVuZHMgU3RvcmVFdmVudD4obmFtZTogUHJvcGVydHlLZXksIHR5cGU6IEV2ZW50VHlwZSk6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBUPiB7XG4gICByZXR1cm4gZmlsdGVyKChldmVudDogU3RvcmVFdmVudCk6IGV2ZW50IGlzIFQgPT4gZXZlbnQubmFtZSA9PT0gbmFtZSAmJiBldmVudC50eXBlID09PSB0eXBlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWN0aW9uRXZlbnQ8VCwgVEtleSBleHRlbmRzIGtleW9mIFQ+KHRva2VuOiBQcm92aWRlclRva2VuPFQ+LCBuYW1lOiBUS2V5LCBpbmplY3Rvcj86IEluamVjdG9yKTogT2JzZXJ2YWJsZTxEaXNwYXRjaEV2ZW50PiB7XG4gICByZXR1cm4gZXZlbnRzKHRva2VuLCBpbmplY3RvcikucGlwZShcbiAgICAgIGZpbHRlckJ5TmFtZVR5cGU8RGlzcGF0Y2hFdmVudDxhbnksIGFueSwgYW55W10+PihuYW1lLCBFdmVudFR5cGUuRGlzcGF0Y2gpLFxuICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWN0aW9uPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPih0b2tlbjogUHJvdmlkZXJUb2tlbjxUPiwgbmFtZTogVEtleSwgaW5qZWN0b3I/OiBJbmplY3Rvcik6IE9ic2VydmFibGU8QWN0aW9uUGFyYW1zPFRbVEtleV0+PiB7XG4gICByZXR1cm4gYWN0aW9uRXZlbnQodG9rZW4sIG5hbWUsIGluamVjdG9yKS5waXBlKFxuICAgICAgbWFwKChldmVudDogYW55KSA9PiBldmVudC52YWx1ZSlcbiAgIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5leHRFdmVudDxULCBUS2V5IGV4dGVuZHMga2V5b2YgVD4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIG5hbWU6IFRLZXksIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPE5leHRFdmVudD4ge1xuICAgcmV0dXJuIGV2ZW50cyh0b2tlbiwgaW5qZWN0b3IpLnBpcGUoXG4gICAgICBmaWx0ZXJCeU5hbWVUeXBlPE5leHRFdmVudD4obmFtZSwgRXZlbnRUeXBlLk5leHQpXG4gICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0PFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPih0b2tlbjogUHJvdmlkZXJUb2tlbjxUPiwgbmFtZTogVEtleSwgaW5qZWN0b3I/OiBJbmplY3Rvcik6IE9ic2VydmFibGU8VFtUS2V5XSBleHRlbmRzICgpID0+IGluZmVyIFIgPyBSIGV4dGVuZHMgT2JzZXJ2YWJsZTxpbmZlciBTPiA/IFMgOiBuZXZlciA6IG5ldmVyPiB7XG4gICByZXR1cm4gbmV4dEV2ZW50KHRva2VuLCBuYW1lLCBpbmplY3RvcikucGlwZShcbiAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50LnZhbHVlKVxuICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JFdmVudDxULCBUS2V5IGV4dGVuZHMga2V5b2YgVD4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIG5hbWU6IFRLZXksIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPEVycm9yRXZlbnQ+IHtcbiAgIHJldHVybiBldmVudHModG9rZW4sIGluamVjdG9yKS5waXBlKFxuICAgICAgZmlsdGVyQnlOYW1lVHlwZTxFcnJvckV2ZW50PihuYW1lLCBFdmVudFR5cGUuRXJyb3IpXG4gICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcjxULCBUS2V5IGV4dGVuZHMga2V5b2YgVD4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIG5hbWU6IFRLZXksIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgIHJldHVybiBlcnJvckV2ZW50KHRva2VuLCBuYW1lLCBpbmplY3RvcikucGlwZShcbiAgICAgIG1hcCgoZXZlbnQpID0+IGV2ZW50LnZhbHVlKVxuICAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGxldGVFdmVudDxULCBUS2V5IGV4dGVuZHMga2V5b2YgVD4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIG5hbWU6IFRLZXksIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPENvbXBsZXRlRXZlbnQ+IHtcbiAgIHJldHVybiBldmVudHModG9rZW4sIGluamVjdG9yKS5waXBlKFxuICAgICAgZmlsdGVyQnlOYW1lVHlwZTxDb21wbGV0ZUV2ZW50PihuYW1lLCBFdmVudFR5cGUuQ29tcGxldGUpXG4gICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV0ZTxULCBUS2V5IGV4dGVuZHMga2V5b2YgVD4odG9rZW46IFByb3ZpZGVyVG9rZW48VD4sIG5hbWU6IFRLZXksIGluamVjdG9yPzogSW5qZWN0b3IpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgIHJldHVybiBjb21wbGV0ZUV2ZW50KHRva2VuLCBuYW1lLCBpbmplY3RvcikucGlwZShcbiAgICAgIGZpbHRlckJ5TmFtZVR5cGU8Q29tcGxldGVFdmVudD4obmFtZSwgRXZlbnRUeXBlLkNvbXBsZXRlKSxcbiAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpXG4gICApXG59XG4iXX0=