UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

70 lines (66 loc) 3.36 kB
'use strict'; var node_util = require('node:util'); var securitySnapshot_class = require('./security-snapshot.class.js'); var exception_utility = require('../../../../utility/error/exception.utility.js'); /** * Isolates generated mutation hydration from GET AFTER subscriber replacements and mutations. */ class ApiControllerGeneratedWriteHydrationContract { static assertUnchanged(rawItem, rawSnapshot, subscriberItem, subscriberSnapshot, subscriberResult, allowedRootAccessors) { this.assertDataGraph(rawItem, allowedRootAccessors); this.assertDataGraph(subscriberItem, allowedRootAccessors); if ((subscriberResult !== undefined && subscriberResult !== subscriberItem) || !node_util.isDeepStrictEqual(rawItem, rawSnapshot) || !node_util.isDeepStrictEqual(subscriberItem, subscriberSnapshot)) { throw exception_utility.ErrorException("Generated mutation GET subscriber changed the protected hydration entity"); } } static createSnapshot(item, allowedRootAccessors) { this.assertDataGraph(item, allowedRootAccessors); return securitySnapshot_class.ApiControllerGeneratedSecuritySnapshot.detach(item); } static assertDataGraph(value, allowedRootAccessors, visited = new WeakSet(), isRoot = true) { if (typeof value === "function") { throw exception_utility.ErrorException("Generated mutation hydration entity cannot contain function values"); } if (!value || typeof value !== "object" || visited.has(value)) { return; } visited.add(value); if (value instanceof ArrayBuffer || ArrayBuffer.isView(value) || value instanceof Date || value instanceof RegExp) { return; } if (value instanceof Promise || value instanceof WeakMap || value instanceof WeakSet) { throw exception_utility.ErrorException("Generated mutation hydration entity contains an unsupported mutable value"); } if (value instanceof Map) { for (const [key, item] of value) { this.assertDataGraph(key, allowedRootAccessors, visited, false); this.assertDataGraph(item, allowedRootAccessors, visited, false); } return; } if (value instanceof Set) { for (const item of value) { this.assertDataGraph(item, allowedRootAccessors, visited, false); } return; } for (const key of Reflect.ownKeys(value)) { if (Array.isArray(value) && key === "length") { continue; } const descriptor = Object.getOwnPropertyDescriptor(value, key); if (!descriptor) { continue; } if (!("value" in descriptor)) { if (isRoot && !descriptor.enumerable && allowedRootAccessors.has(key)) { continue; } throw exception_utility.ErrorException("Generated mutation hydration entity must contain data properties only"); } this.assertDataGraph(descriptor.value, allowedRootAccessors, visited, false); } } } exports.ApiControllerGeneratedWriteHydrationContract = ApiControllerGeneratedWriteHydrationContract; //# sourceMappingURL=write-hydration-contract.class.js.map