@pnp/odata
Version:
pnp - provides shared odata functionality and base classes
132 lines • 4.74 kB
JavaScript
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