Repository URL to install this package:
|
Version:
1.3.2 ▾
|
/* 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 }