Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
chain-able-lego / src / patch / patch.ts
Size: Mime:
// https://github.com/jamesallardice/patchwork.js
var patch = (function() {
  /*jshint evil: true */

  'use strict'

  // Get a reference to the global object
  var global = new Function('return this;')()

  // Get the own ("static") properties of the Function constructor
  var fnProps = Object.getOwnPropertyNames(Function)

  return function(original, originalRef, patches) {
    var ref = (global[originalRef] = original), // Maintain a reference to the original constructor as a new property on the global object
      args = [],
      newRef, // This will be the new patched constructor
      i

    patches.called = patches.called || originalRef // If we are not patching static calls just pass them through to the original function

    for (i = 0; i < original.length; i++) {
      // Match the arity of the original constructor
      args[i] = 'a' + i // Give the arguments a name (native constructors don't care, but user-defined ones will break otherwise)
    }

    if (patches.constructed) {
      // This string is evaluated to create the patched constructor body in the case that we are patching newed calls
      args.push(
        '\'use strict\'; return (!!this ? ' +
          patches.constructed +
          ' : ' +
          patches.called +
          ').apply(null, arguments);'
      )
    }
    else {
      // This string is evaluated to create the patched constructor body in the case that we are only patching static calls
      args.push(
        '\'use strict\'; return (!!this ? new (Function.prototype.bind.apply(' +
          originalRef +
          ', [{}].concat([].slice.call(arguments))))() : ' +
          patches.called +
          '.apply(null, arguments));'
      )
    }

    newRef = new (Function.prototype.bind.apply(Function, [{}].concat(args)))() // Create a new function to wrap the patched constructor
    newRef.prototype = original.prototype // Keep a reference to the original prototype to ensure instances of the patch appear as instances of the original
    newRef.prototype.constructor = newRef // Ensure the constructor of patched instances is the patched constructor

    Object.getOwnPropertyNames(ref).forEach(function(property) {
      // Add any "static" properties of the original constructor to the patched one
      if (fnProps.indexOf(property) < 0) {
        // Don't include static properties of Function since the patched constructor will already have them
        newRef[property] = ref[property]
      }
    })

    return newRef // Return the patched constructor
  }
})()