class Organisation { constructor (data) { this.read = !!data?.read; this.write = !!data?.write; this.edit = !!data?.edit; this.other = {}; return new Proxy(this, { get (target, prop) { if (prop in target) { return target[prop] } else { return target.other[prop]; } }, set (target, prop, value) { const oldValue = target[prop] !== undefined ? target[prop] : target.other[prop]; const newValue = Boolean(value); if (["read", "write", "edit"].includes(prop)) { target[prop] = newValue; } else { target.other[prop] = newValue; } return true; } }); } toJSON () { return { read: this.read, write: this.write, edit: this.edit, ...this.other } } toString (replacer, space) { return JSON.stringify(this.toJSON(), replacer, space); } /** Limit the operations to only those allowed by `other` */ filter (other) { const filteredOrganisation = new Organisation(); filteredOrganisation.read = this.read && other.read; filteredOrganisation.write = this.write && other.write; filteredOrganisation.edit = this.edit && other.edit; return filteredOrganisation; } intersect (other) { return this.filter(other); } } if (typeof module !== 'undefined' && module.exports) { module.exports = Organisation; // CJS export } // ESM export if (typeof exports !== 'undefined' && !exports.default) { exports.default = Organisation; // ESM export }