var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var attribute_exports = {};
__export(attribute_exports, {
  ATTRIBUTE_METADATA_KEY: () => ATTRIBUTE_METADATA_KEY,
  attribute: () => attribute,
  getAttributeMetadataList: () => getAttributeMetadataList
});
module.exports = __toCommonJS(attribute_exports);
var import_ReflectUtils = require("@dooboostore/core/reflect/ReflectUtils");
const ATTRIBUTE_METADATA_KEY = Symbol("simple-web-component:attribute");
function attribute(arg1, arg2) {
  const decorator = (options, target, propertyKey) => {
    const constructor = target.constructor;
    if (!options.name) options.name = String(propertyKey);
    if (!options.type) options.type = String;
    if (options.disableReflect === void 0) options.disableReflect = false;
    let list = import_ReflectUtils.ReflectUtils.getMetadata(ATTRIBUTE_METADATA_KEY, constructor);
    if (!list) {
      list = [];
      import_ReflectUtils.ReflectUtils.defineMetadata(ATTRIBUTE_METADATA_KEY, list, constructor);
    }
    list.push({ propertyKey, options });
    const internalKey = Symbol(String(propertyKey));
    Object.defineProperty(target, propertyKey, {
      get() {
        return this[internalKey];
      },
      set(val) {
        const oldVal = this[internalKey];
        if (oldVal === val) return;
        let convertedVal = val;
        if (options.type === Number) convertedVal = Number(val);
        else if (options.type === Boolean) convertedVal = Boolean(val);
        else if (options.type === Object && typeof val === "string") {
          try {
            convertedVal = JSON.parse(val);
          } catch (e) {
            convertedVal = val;
          }
        }
        this[internalKey] = convertedVal;
        if (typeof this._updateState === "function") {
          this._updateState(options.name);
        }
        if (!options.disableReflect && this.setAttribute) {
          if (convertedVal === null || convertedVal === void 0 || convertedVal === false) {
            this.removeAttribute(options.name);
          } else {
            const attrVal = typeof convertedVal === "object" ? JSON.stringify(convertedVal) : String(convertedVal);
            if (this.getAttribute(options.name) !== attrVal) {
              this.setAttribute(options.name, attrVal);
            }
          }
        }
      },
      enumerable: true,
      configurable: true
    });
  };
  if (arg1 && typeof arg2 === "string") {
    return decorator({}, arg1, arg2);
  }
  return (target, propertyKey) => {
    const options = typeof arg1 === "string" ? { name: arg1 } : arg1 || {};
    decorator(options, target, propertyKey);
  };
}
const getAttributeMetadataList = (target) => {
  const constructor = target instanceof Function ? target : target.constructor;
  return import_ReflectUtils.ReflectUtils.getMetadata(ATTRIBUTE_METADATA_KEY, constructor);
};
//# sourceMappingURL=attribute.js.map
