UNPKG

@pnp/odata

Version:

pnp - provides shared odata functionality and base classes

132 lines 4.74 kB
import { __read, __spreadArray } from "tslib"; import { isFunc, getGUID } from "@pnp/common"; var _enableExtensions = false; var globalExtensions = []; var factoryExtensions = new Map(); var ObjExtensionsSym = Symbol.for("43f7a601"); /** * Creates global extensions across all invokable objects * * @param e The global extensions to apply */ export var extendGlobal = function (e) { _enableExtensions = true; extendCol(globalExtensions, e); }; /** * Applies the supplied extensions to a single instance * * @param target Object to which extensions are applied * @param extensions Extensions to apply */ // eslint-disable-next-line @typescript-eslint/ban-types export var extendObj = function (target, extensions) { _enableExtensions = true; if (!Reflect.has(target, ObjExtensionsSym)) { Reflect.set(target, ObjExtensionsSym, []); } extendCol(Reflect.get(target, ObjExtensionsSym), extensions); return target; }; /** * Allows applying extensions to all instances created from the supplied factory * * @param factory The Invokable Factory method to extend * @param extensions Extensions to apply */ export var extendFactory = function (factory, extensions) { _enableExtensions = true; // factoryExtensions var proto = Reflect.getPrototypeOf(factory); if (!Reflect.has(proto, ObjExtensionsSym)) { Reflect.defineProperty(proto, ObjExtensionsSym, { value: getGUID(), }); } var key = proto[ObjExtensionsSym]; if (!factoryExtensions.has(key)) { factoryExtensions.set(key, []); } extendCol(factoryExtensions.get(key), extensions); }; function extendCol(a, e) { if (Array.isArray(e)) { a.push.apply(a, __spreadArray([], __read(e), false)); } else { a.push(e); } } /** * Clears all global extensions */ export var clearGlobalExtensions = function () { globalExtensions.length = 0; }; /** * Disables all extensions */ export var disableExtensions = function () { _enableExtensions = false; }; /** * Enables all extensions */ export var enableExtensions = function () { _enableExtensions = true; }; /** * Applies a set of extension previously applied to a factory using extendFactory to an object created from that factory * * @param factory * @param args */ // eslint-disable-next-line @typescript-eslint/ban-types export var applyFactoryExtensions = function (factory, args) { var o = factory(args); var proto = Reflect.getPrototypeOf(factory); if (Reflect.has(proto, ObjExtensionsSym)) { var extensions = factoryExtensions.get(Reflect.get(proto, ObjExtensionsSym)); o = extendObj(o, extensions); } return o; }; export function extensionOrDefault(op, or, target) { var rest = []; for (var _i = 3; _i < arguments.length; _i++) { rest[_i - 3] = arguments[_i]; } if (_enableExtensions) { var extensions = []; // we need to first invoke extensions tied to only this object if (Reflect.has(target, ObjExtensionsSym)) { extensions.push.apply(extensions, __spreadArray([], __read(Reflect.get(target, ObjExtensionsSym)), false)); } // second we need to process any global extensions extensions.push.apply(extensions, __spreadArray([], __read(globalExtensions), false)); for (var i = 0; i < extensions.length; i++) { var extension = extensions[i]; var result = undefined; if (isFunc(extension)) { // this extension is a function which we call result = extension.apply(void 0, __spreadArray([op, target], __read(rest), false)); } else if (op === "get" && Reflect.has(extension, rest[0])) { // this extension is a named extension meaning we are overriding a specific method/property result = Reflect.get(extension, rest[0], target); } else if (Reflect.has(extension, op)) { // this extension is a ProxyHandler that has a handler defined for {op} so we pass control and see if we get a result result = Reflect.get(extension, op).apply(void 0, __spreadArray([target], __read(rest), false)); } if (typeof result !== "undefined") { // if a extension returned a result, we return that // this means that this extension overrides any other extensions and no more are executed // first extension in the list to return "wins" return result; } } } return or.apply(void 0, __spreadArray([target], __read(rest), false)); } //# sourceMappingURL=invokable-extensions.js.map