"use strict";
/*
 * @poppinss/utils
 *
 * (c) Harminder Virk <virk@adonisjs.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.ObjectBuilder = void 0;
/**
 * A simple class to build an object incrementally. It is helpful when you
 * want to add properties to the object conditionally.
 *
 * Instead of writing
 * ```
 * const obj = {
 *   ...(user.id ? { id: user.id } : {}),
 *   ...(user.firstName && user.lastName ? { name: `${user.firstName} ${user.lastName}` } : {}),
 * }
 * ```
 *
 * You can write
 *
 * const obj = new ObjectBuilder()
 *   .add('id', user.id)
 *   .add(
 *     'fullName',
 *     user.firstName && user.lastName ? `${user.firstName} ${user.lastName}` : undefined
 *   )
 *   .value
 */
class ObjectBuilder {
    constructor(ignoreNull) {
        this.ignoreNull = ignoreNull;
        this.value = {};
    }
    /**
     * Add value to the property.
     *
     * - Undefined values are ignored
     * - Null values are ignored, when `ignoreNull` is set to true
     */
    add(key, value) {
        if (value === undefined) {
            return this;
        }
        if (this.ignoreNull === true && value === null) {
            return this;
        }
        this.value[key] = value;
        return this;
    }
    /**
     * Remove value from the object
     */
    remove(key) {
        delete this.value[key];
        return this;
    }
    /**
     * Find if a value exists
     */
    has(key) {
        return this.get(key) !== undefined;
    }
    /**
     * Get the existing value
     */
    get(key) {
        return this.value[key];
    }
}
exports.ObjectBuilder = ObjectBuilder;
