The static deep properties are properties attached to stamp itself. But unlike regular (shallow) static properties these are deeply merged together by stamp deep merging algorithm.

const SchemaTypes = stampit.deepStatics({
Types: {
String,
Number,
Array
}
})
const ObjectIdSchemaType = stampit.deepStatics({
Types: {
ID: String,
ObjectId: require('./object-id')
}
})
const Schema = stampit(SchemaTypes, ObjectIdSchemaType, { // stamp deep merging kicks in this line
init(data, { stamp }) {
// stamp.Types.String, stamp.Types.ID, ...
}
})
// Schema.Types.String
// Schema.Types.Number
// Schema.Types.Array
// as well as
// Schema.Types.ID
// Schema.Types.ObjectId

Descriptor merging algorithm

The staticDeepProperties are deeply merged using stamp deep merging algorithm. See below - the Types value is always a new object.

SchemaTypes.Types !== Schema.Types // NEVER EQUAL! NO MATTER WHAT!

Sometimes a regular (shallow) static property has the same name as a deep static property. The shallow static property always wins.

const NullTypes = stampit.statics({
Types: null
})
const NoTypesSchema = Schema.compose(NullTypes)
NoTypesSchema.Types === null // the regular property overwrites deep property

Other ways to add static deep properties

Exactly the same stamp can be created in few ways. Here they all are.

const myTypes = { String, ID: String, Number, Array }
const AuthServiceToken = stampit({
deepStatics: {
Types: myTypes
}
})
const HasLog = stampit({
staticDeepProperties: {
Types: myTypes
}
})
const HasLog = stampit.deepStatics({
Types: myTypes
})
const HasLog = stampit.staticDeepProperties({
Types: myTypes
})
const HasLog = stampit().deepStatics({
Types: myTypes
})
const HasLog = stampit().staticDeepProperties({
Types: myTypes
})