PropTypes = require('prop-types')
immutable_types = require('./immutable-types')
if process?.env?.DEVEL and not process?.env?.SMC_TEST
DEBUG = true
else
DEBUG = false
if DEBUG
console.debug = console.log
else
console.debug = ->
if process?.env?.SMC_TEST
TEST_MODE = true
types = exports.types = (target, declaration, identifier="check.types") ->
if typeof(target) != 'object'
throw new Error("Types was given a non-object to check")
if typeof(declaration) != 'object'
throw new Error("Types was given a #{typeof declaration} as a declaration instead of an object")
PropTypes.checkPropTypes(declaration, target, 'checking a', identifier)
for key, val of PropTypes
if key != 'checkPropTypes' and key != 'PropTypes'
types[key] = val
types.immutable = immutable_types.immutable
exports.defaults = (obj1, obj2, allow_extra, strict=false) ->
if not obj1?
obj1 = {}
error = () ->
try
return "(obj1=#{exports.trunc(exports.to_json(obj1),1024)}, obj2=#{exports.trunc(exports.to_json(obj2),1024)})"
catch err
return ""
if not obj1?
obj1 = {}
if typeof(obj1) != 'object'
err = "BUG -- Traceback -- misc.defaults -- TypeError: function takes inputs as an object #{error()}"
if strict or DEBUG or TEST_MODE
throw new Error(err)
else
console.log(err)
console.trace()
return obj2
r = {}
for prop, val of obj2
if obj1.hasOwnProperty(prop) and obj1[prop]?
if obj2[prop] == exports.defaults.required and not obj1[prop]?
err = "misc.defaults -- TypeError: property '#{prop}' must be specified: #{error()}"
if strict or DEBUG or TEST_MODE
throw new Error(err)
else
console.warn(err)
console.trace()
r[prop] = obj1[prop]
else if obj2[prop]?
if obj2[prop] == exports.defaults.required
err = "misc.defaults -- TypeError: property '#{prop}' must be specified: #{error()}"
if strict or DEBUG or TEST_MODE
throw new Error(err)
else
console.warn(err)
console.trace()
else
r[prop] = obj2[prop]
if not allow_extra
for prop, val of obj1
if not obj2.hasOwnProperty(prop)
err = "misc.defaults -- TypeError: got an unexpected argument '#{prop}' #{error()}"
if strict or DEBUG or TEST_MODE
throw new Error(err)
else
console.warn(err)
console.trace()
return r
required = exports.required = exports.defaults.required = "__!!!!!!this is a required property!!!!!!__"