/** * @import {Space} from 'property-information' */ import {Info} from './info.js' import * as types from './types.js' const checks = /** @type {ReadonlyArray} */ ( Object.keys(types) ) export class DefinedInfo extends Info { /** * @constructor * @param {string} property * Property. * @param {string} attribute * Attribute. * @param {number | null | undefined} [mask] * Mask. * @param {Space | undefined} [space] * Space. * @returns * Info. */ constructor(property, attribute, mask, space) { let index = -1 super(property, attribute) mark(this, 'space', space) if (typeof mask === 'number') { while (++index < checks.length) { const check = checks[index] mark(this, checks[index], (mask & types[check]) === types[check]) } } } } DefinedInfo.prototype.defined = true /** * @template {keyof DefinedInfo} Key * Key type. * @param {DefinedInfo} values * Info. * @param {Key} key * Key. * @param {DefinedInfo[Key]} value * Value. * @returns {undefined} * Nothing. */ function mark(values, key, value) { if (value) { values[key] = value } }