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    
@skava/identifier / src / decorateWithIdentity.ts
Size: Mime:
/* eslint-disable max-statements */
/* eslint-disable brace-style */
/* @lint ^ 1 is for tests, 1 is for readable long conditionals */
import { defineFinal, always } from 'chain-able-boost'
import { hasOwnProp } from 'exotic'
// import decorateComponentStatics from './decorateComponentStatics'
// @todo remove
import decorateComponentStatics from '@skava/modules/___dist/observable-utils/deps/decorateComponentStatics'
// local
import toIdentifier from './toIdentifier'

// @alias stamp
const CLASS_IDENTIFIER = Symbol.for('@@classidentifier')
const INSTANCE_IDENTIFIER = Symbol.for('@@instanceidentifier')

/**
 * @description defines 2 symbols on a class for unique identifiers
 *              based on class & instance
 *              allowing id gen & weakmap scope for multi-instance context
 * @param {React.Component} Target
 * @return {React.Component}
 */
function decorateWithIdentifier(Target) {
  const classIdentifier = toIdentifier(Target)

  class Identity extends Target {
    constructor(...args) {
      super(...args)
      const instanceIdentifier = toIdentifier(Target)

      if (hasOwnProp(this, Symbol.toPrimitive) === false) {
        defineFinal(Identity, Symbol.toPrimitive, always(instanceIdentifier))
      }
      defineFinal(Identity, INSTANCE_IDENTIFIER, instanceIdentifier)
      return this
    }
  }

  decorateComponentStatics(Identity, Target)
  defineFinal(Identity, CLASS_IDENTIFIER, classIdentifier)

  return Identity
}

export { decorateWithIdentifier }