ooshbin

dune Serialiser test

Apr 10th, 2022 (edited)
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. export class Serialiser {
  2.  
  3.   // Simple copy object
  4.   static #copyObj(inp) { typeof(inp) === 'object' ? JSON.parse(JSON.stringify(inp)) : inp }
  5.  
  6.   // Grab private field references. Function must be bound to target class instance.
  7.   static #processPrivates(whitelistName) {
  8.     let appendPrivates = {};
  9.     const privateFields = this[whitelistName] || {};
  10.     for (const field in privateFields) {
  11.             console.log(field);
  12.       appendPrivates[field] = privateFields[field];
  13.     }
  14.     return appendPrivates;
  15.   }
  16.  
  17.   // Function clone, if required
  18.   static #copyFunction(originalFunction) {
  19.     const rxParams = /^[^(]*\(([^)]*)\)\s*(=>)?(.*)/i;
  20.     let body, params, output, error;
  21.     `${originalFunction}`.replace(rxParams, (m, p1, p2, p3) => {
  22.       body = p3 ?? null;
  23.       params = p1?.split(/\s*,\s*/g) ?? [];
  24.     });
  25.     try { output = new Function(...params, body) }
  26.     catch(e) { error = e }
  27.     return output ? output : { err: error }
  28.   }
  29.  
  30.   static serialise(target, options = {}) {
  31.     // Default options
  32.     Object.assign(options, {
  33.       includeMethods: options.includeMethods ?? false,
  34.       privateWhitelist: options.privateWhitelist || 'appendFields',
  35.       publicBlacklist: options.publicBlacklist || 'blockFields'
  36.     });
  37.     // Main process
  38.     const processObject = (targetObj) => {
  39.       const processKeys = (baseObj) => {
  40.         for (const prop in baseObj) {
  41.           if (blacklist.includes(prop)) continue; // Skip blocked public fields
  42.           if (typeof(baseObj[prop]) === 'object' && baseObj[prop] !== null) output[prop] = processObject(baseObj[prop]); // Recursion for nested objects
  43.           else {
  44.             if (typeof(baseObj[prop]) === 'function' && options.includeMethods) {
  45.               const cloneFunc = this.#copyFunction(baseObj[prop]); // optional method copy
  46.               if (!cloneFunc.err) output[prop] = cloneFunc;
  47.             } else {
  48.               output[prop] = baseObj[prop]; // primitives
  49.             }
  50.           }
  51.         }
  52.       }
  53.       const output = Array.isArray(targetObj) ? [] : {},
  54.         conName = target.constructor?.name || '',
  55.         toAppend = {},
  56.         blacklist = targetObj[options.publicBlacklist] || [];
  57.       // Grab whitelisted private fields, if any
  58.       if (/* conName !== 'Object' && */ conName !== 'Array') Object.assign(toAppend, this.#processPrivates.bind(targetObj)(options.privateWhitelist));
  59.       processKeys(targetObj);
  60.       processKeys(toAppend);
  61.       return output;
  62.     }
  63.     // Push the button that makes things go
  64.     return (typeof(target) === 'object' && target !== null) ? processObject(target) : new Error(`Non-object or null passed to serialiser.`);
  65.   }
  66.  
  67. }
Add Comment
Please, Sign In to add comment