{"mappings":"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","names":["getComponentElements","getEventTarget","addToQueue","addInstance","deleteInstance","addToRegistry","hasInstance","ChildrenManager","RefsManager","ServicesManager","EventsManager","OptionsManager","getInstanceFromElement","queryComponentAll","closestComponent","noop","isDev","isFunction","isArray","id","Base","parent","root","el","baseMap","instance","components","proto","config","query","method","args","event","eventHandlers","element","$config","service","ctor","index","listener","options","set","target","nameOrSelector"],"sources":["../esm/npm/@studiometa/js-toolkit@3.6.0/node_modules/@studiometa/packages/js-toolkit/Base/Base.ts"],"sourcesContent":["/* eslint-disable no-use-before-define */\nimport {\n  getComponentElements,\n  getEventTarget,\n  addToQueue,\n  addInstance,\n  deleteInstance,\n  addToRegistry,\n  hasInstance,\n} from './utils.js';\nimport {\n  ChildrenManager,\n  RefsManager,\n  ServicesManager,\n  EventsManager,\n  OptionsManager,\n} from './managers/index.js';\nimport { getInstanceFromElement } from '../helpers/getInstanceFromElement.js';\nimport { queryComponentAll, closestComponent } from '../helpers/queryComponent.js';\nimport { noop, isDev, isFunction, isArray } from '../utils/index.js';\n\nlet id = 0;\n\nexport type BaseEl = HTMLElement \u0026 { __base__?: Map\u003cstring, Base | 'terminated'\u003e };\nexport type BaseConstructor\u003cT extends Base = Base\u003e = {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  new (...args: any[]): T;\n  prototype: Base;\n} \u0026 Pick\u003ctypeof Base, keyof typeof Base\u003e;\nexport type BaseAsyncConstructor\u003cT extends Base = Base\u003e = (\n  instance: Base,\n) =\u003e Promise\u003cBaseConstructor\u003cT\u003e | { default: BaseConstructor\u003cT\u003e }\u003e;\nexport type BaseOptions = { [name: string]: unknown };\nexport type BaseRefs = { [name: string]: HTMLElement | HTMLElement[] };\nexport type BaseChildren = { [nameOrSelector: string]: Base[] | Promise\u003cBase\u003e[] };\nexport type BaseConfigComponents = {\n  [nameOrSelector: string]: BaseConstructor | BaseAsyncConstructor;\n};\n\nexport type BaseConfig = {\n  name: string;\n  debug?: boolean;\n  log?: boolean;\n  refs?: string[];\n  emits?: string[];\n  components?: BaseConfigComponents;\n  options?: import('./managers/OptionsManager').OptionsSchema;\n};\n\nexport type BaseProps = {\n  $el?: HTMLElement;\n  $options?: BaseOptions;\n  $refs?: BaseRefs;\n  $children?: BaseChildren;\n  $parent?: Base;\n};\n\nexport type Managers = {\n  ChildrenManager: typeof ChildrenManager;\n  EventsManager: typeof EventsManager;\n  OptionsManager: typeof OptionsManager;\n  RefsManager: typeof RefsManager;\n  ServicesManager: typeof ServicesManager;\n};\n\n/**\n * Base class.\n *\n * @link https://js-toolkit.studiometa.dev/api/\n */\nexport class Base\u003cT extends BaseProps = BaseProps\u003e {\n  /**\n   * Declare the `this.constructor` type\n   * @link https://github.com/microsoft/TypeScript/issues/3841#issuecomment-2381594311\n   */\n  declare ['constructor']: BaseConstructor;\n\n  /**\n   * This is a Base instance.\n   */\n  static readonly $isBase = true as const;\n\n  /**\n   * Config.\n   * @link https://js-toolkit.studiometa.dev/api/configuration.html\n   */\n  static config: BaseConfig = {\n    name: 'Base',\n    emits: [\n      // hook events\n      'before-mounted',\n      'mounted',\n      'after-mounted',\n      'updated',\n      'before-destroyed',\n      'destroyed',\n      'after-destroyed',\n      'terminated',\n      // default services' events\n      'ticked',\n      'scrolled',\n      'resized',\n      'moved',\n      'loaded',\n      'keyed',\n    ],\n  };\n\n  /**\n   * The instance id.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#id\n   */\n  $id: string;\n\n  /**\n   * The root element.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#el\n   */\n  $el: T['$el'] \u0026 BaseEl;\n\n  /**\n   * The state of the component.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#isMounted\n   */\n  $isMounted = false;\n\n  /**\n   * Is the component currently mounting itself and its children?\n   * @private\n   */\n  __isMounting = false;\n\n  /**\n   * Store the event handlers.\n   * @private\n   */\n  __eventHandlers: Map\u003cstring, Set\u003cEventListenerOrEventListenerObject\u003e\u003e = new Map();\n\n  /**\n   * Get the root instance of the app.\n   * @deprecated Use `$closest(name)` instead. Will be removed in v4.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#root\n   */\n  get $root(): Base {\n    if (isDev) {\n      console.warn(\n        `[${this.$id}] $root is deprecated and will be removed in v4. Use $closest(name) instead.`,\n      );\n    }\n\n    if (!this.__parent) {\n      return this;\n    }\n\n    let parent = this.__parent;\n    let root = this.__parent;\n\n    while (parent) {\n      if (!parent.__parent) {\n        root = parent;\n      }\n\n      parent = parent.__parent;\n    }\n\n    return root;\n  }\n\n  /**\n   * The parent instance if the current instance is registered as a child component in a parent component.\n   * @deprecated Use `$closest(name)` instead. Will be removed in v4.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#parent\n   */\n  get $parent(): (T['$parent'] \u0026 Base) | null {\n    if (isDev) {\n      console.warn(\n        `[${this.$id}] $parent is deprecated and will be removed in v4. Use $closest(name) instead.`,\n      );\n    }\n\n    return this.__parent;\n  }\n\n  /**\n   * Internal parent resolution without deprecation warning.\n   * @internal\n   */\n  get __parent(): (T['$parent'] \u0026 Base) | null {\n    // Walk up the DOM ancestors and resolve the closest mounted instance whose\n    // config declares this component as a child, using each element's `__base__`\n    // map for an O(1)-per-ancestor lookup. This is O(tree depth) instead of the\n    // O(N_instances) global scan (plus `Set` copy) it replaces.\n    let el = this.$el.parentElement;\n\n    while (el) {\n      const baseMap = (el as BaseEl).__base__;\n\n      if (baseMap) {\n        for (const instance of baseMap.values()) {\n          if (instance === 'terminated' || !hasInstance(instance)) continue;\n\n          const { components } = instance.$config;\n          if (components \u0026\u0026 Object.values(components).includes(this.constructor)) {\n            return instance as T['$parent'] \u0026 Base;\n          }\n        }\n      }\n\n      el = el.parentElement;\n    }\n\n    return null;\n  }\n\n  /**\n   * Merge configuration with the parents' configurations.\n   * @private\n   */\n  get __config(): BaseConfig {\n    let proto = Object.getPrototypeOf(this);\n    let { config } = proto.constructor;\n\n    while (proto.constructor.config \u0026\u0026 proto.constructor.$isBase) {\n      config = { ...proto.constructor.config, ...config };\n\n      if (proto.constructor.config.options) {\n        config.options = { ...proto.constructor.config.options, ...config.options };\n      }\n\n      if (proto.constructor.config.emits \u0026\u0026 config.emits) {\n        config.emits = [...proto.constructor.config.emits, ...config.emits];\n      }\n\n      proto = Object.getPrototypeOf(proto);\n    }\n\n    config.options = config.options ?? {};\n    config.refs = config.refs ?? [];\n    config.components = config.components ?? {};\n\n    return config;\n  }\n\n  /**\n   * The normalized config of the component.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#config\n   */\n  get $config() {\n    return this.__config;\n  }\n\n  __services: ServicesManager;\n\n  /**\n   * Services.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#services\n   */\n  get $services(): ServicesManager {\n    return this.__services;\n  }\n\n  __refs: RefsManager\u003cT['$refs'] \u0026 BaseRefs\u003e;\n\n  /**\n   * Refs.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#refs\n   */\n  get $refs(): T['$refs'] \u0026 BaseRefs {\n    return this.__refs.props;\n  }\n\n  __options: OptionsManager\u003cT['$options'] \u0026 BaseOptions\u003e;\n\n  /**\n   * Options.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#options\n   */\n  get $options(): T['$options'] \u0026 BaseOptions {\n    return this.__options.props;\n  }\n\n  __children: ChildrenManager\u003cT['$children'] \u0026 BaseChildren\u003e;\n\n  /**\n   * Children.\n   * @deprecated Use `$query(name)` instead. Will be removed in v4.\n   * @link https://js-toolkit.studiometa.dev/api/instance-properties.html#children\n   */\n  get $children(): T['$children'] \u0026 BaseChildren {\n    if (isDev) {\n      console.warn(\n        `[${this.$id}] $children is deprecated and will be removed in v4. Use $query(name) instead.`,\n      );\n    }\n\n    return this.__children.props;\n  }\n\n  /**\n   * Get all descendant component instances matching the given query.\n   * Sugar for `queryComponentAll(query, { from: this.$el })`.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#query-query\n   */\n  $query\u003cU extends Base = Base\u003e(query: string): U[] {\n    return queryComponentAll\u003cU\u003e(query, { from: this.$el });\n  }\n\n  /**\n   * Get the closest ancestor component instance matching the given query.\n   * Sugar for `closestComponent(query, { from: this.$el })`.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#closest-query\n   */\n  $closest\u003cU extends Base = Base\u003e(query: string): U | undefined {\n    return closestComponent\u003cU\u003e(query, { from: this.$el });\n  }\n\n  __events: EventsManager;\n\n  /**\n   * Small helper to log stuff.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#log-content\n   */\n  get $log(): (...args: unknown[]) =\u003e void {\n    return this.$options.log ? window.console.log.bind(window, `[${this.$id}]`) : noop;\n  }\n\n  /**\n   * Small helper to make warning easier.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#warn-content\n   */\n  get $warn(): (...args: unknown[]) =\u003e void {\n    return this.$options.log ? window.console.warn.bind(window, `[${this.$id}]`) : noop;\n  }\n\n  /**\n   * Small helper to debug information.\n   * @internal\n   */\n  get __debug(): (...args: unknown[]) =\u003e void {\n    return isDev \u0026\u0026 this.$options.debug\n      ? window.console.log.bind(window, `[debug] [${this.$id}]`)\n      : noop;\n  }\n\n  /**\n   * Get manager constructors.\n   * @internal\n   */\n  get __managers(): Managers {\n    return {\n      ChildrenManager,\n      EventsManager,\n      OptionsManager,\n      RefsManager,\n      ServicesManager,\n    };\n  }\n\n  /**\n   * Call an instance method and emit corresponding events.\n   * @internal\n   */\n  __callMethod(method: string, ...args: unknown[]): unknown {\n    if (isDev) {\n      this.__debug('callMethod', method, ...args);\n    }\n\n    this.$emit(method, ...args);\n\n    // We always emit an event, but we do not call the method if it does not exist\n    if (!isFunction(this[method])) {\n      return null;\n    }\n\n    if (isDev) {\n      this.__debug(method, this, ...args);\n    }\n\n    return this[method].call(this, ...args);\n  }\n\n  /**\n   * Test if the given event has been bound to the instance.\n   *\n   * @param  {string} event The event's name.\n   * @return {boolean}      Wether the given event has been bound or not.\n   * @internal\n   */\n  __hasEvent(event: string): boolean {\n    const eventHandlers = this.__eventHandlers.get(event);\n    return eventHandlers \u0026\u0026 eventHandlers.size \u003e 0;\n  }\n\n  /**\n   * Class constructor where all the magic takes place.\n   *\n   * @param {HTMLElement} element The component's root element dd.\n   * @link https://js-toolkit.studiometa.dev/api/instantiation.html\n   */\n  constructor(element: HTMLElement) {\n    if (!element) {\n      if (isDev) {\n        throw new Error('The root element must be defined.');\n      }\n      return;\n    }\n\n    const { $config } = this;\n\n    if ($config.name === 'Base') {\n      if (isDev) {\n        throw new Error('The `config.name` property is required.');\n      }\n      return;\n    }\n\n    // Add current component to the registry\n    addToRegistry($config.name, this.constructor);\n\n    this.$id = `${$config.name}-${id}`;\n    id += 1;\n\n    this.$el = element;\n    this.$el.__base__ ??= new Map();\n    this.$el.__base__.set($config.name, this);\n\n    for (const service of ['Options', 'Services', 'Events', 'Refs', 'Children']) {\n      this[`__${service.toLowerCase()}`] = new this.__managers[`${service}Manager`](this);\n    }\n\n    this.$on('before-mounted', () =\u003e {\n      addInstance(this);\n    });\n    this.$on('after-destroyed', () =\u003e {\n      deleteInstance(this);\n    });\n\n    if (isDev) {\n      this.__debug('constructor', this);\n    }\n  }\n\n  /**\n   * Trigger the `mounted` callback.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#mount\n   */\n  async $mount(): Promise\u003cthis\u003e {\n    if (this.$isMounted || this.__isMounting) {\n      return this;\n    }\n\n    this.__isMounting = true;\n    this.$emit('before-mounted');\n\n    if (isDev) {\n      this.__debug('$mount');\n    }\n\n    await Promise.all([\n      addToQueue(() =\u003e this.__children.registerAll()),\n      addToQueue(() =\u003e this.__refs.registerAll()),\n      addToQueue(() =\u003e this.__events.bindRootElement()),\n      addToQueue(() =\u003e this.__services.enableAll()),\n      addToQueue(() =\u003e this.__children.mountAll()),\n    ]);\n\n    await addToQueue(() =\u003e {\n      this.$isMounted = true;\n      this.__callMethod('mounted');\n    });\n\n    this.__isMounting = false;\n    this.$emit('after-mounted');\n\n    return this;\n  }\n\n  /**\n   * Update the instance children.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#update\n   */\n  async $update(): Promise\u003cthis\u003e {\n    if (isDev) {\n      this.__debug('$update');\n    }\n\n    await Promise.all([\n      // Undo\n      addToQueue(() =\u003e this.__refs.unregisterAll()),\n      addToQueue(() =\u003e this.__services.disableAll()),\n      // Redo\n      addToQueue(() =\u003e this.__children.registerAll()),\n      addToQueue(() =\u003e this.__refs.registerAll()),\n      addToQueue(() =\u003e this.__services.enableAll()),\n      // Update\n      addToQueue(() =\u003e this.__children.updateAll()),\n    ]);\n\n    await addToQueue(() =\u003e this.__callMethod('updated'));\n\n    return this;\n  }\n\n  /**\n   * Trigger the `destroyed` callback.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#destroy\n   */\n  async $destroy(): Promise\u003cthis\u003e {\n    if (!this.$isMounted) {\n      return this;\n    }\n\n    if (isDev) {\n      this.__debug('$destroy');\n    }\n\n    this.$emit('before-destroyed');\n    this.$isMounted = false;\n\n    await Promise.all([\n      addToQueue(() =\u003e this.__events.unbindRootElement()),\n      addToQueue(() =\u003e this.__refs.unregisterAll()),\n      addToQueue(() =\u003e this.__services.disableAll()),\n      addToQueue(() =\u003e this.__children.destroyAll()),\n    ]);\n\n    await addToQueue(() =\u003e this.__callMethod('destroyed'));\n\n    this.$emit('after-destroyed');\n\n    return this;\n  }\n\n  /**\n   * Terminate a child instance when it is not needed anymore.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#terminate\n   */\n  async $terminate(): Promise\u003cvoid\u003e {\n    if (isDev) {\n      this.__debug('$terminate');\n    }\n\n    await Promise.all([\n      // First, destroy the component.\n      addToQueue(() =\u003e this.$destroy()),\n      // Execute the `terminated` hook if it exists\n      addToQueue(() =\u003e this.__callMethod('terminated')),\n      // Delete instance\n      addToQueue(() =\u003e this.$el.__base__.set(this.$config.name, 'terminated')),\n    ]);\n  }\n\n  /**\n   * Add an emitted event.\n   *\n   * @param  {string} event The event name.\n   * @return {void}\n   * @internal\n   */\n  __addEmits(event: string): void {\n    const ctor = this.constructor;\n    if (isArray(ctor.config.emits)) {\n      ctor.config.emits.push(event);\n    } else {\n      ctor.config.emits = [event];\n    }\n  }\n\n  /**\n   * Remove an emitted event.\n   *\n   * @param  {string} event The event name.\n   * @return {void}\n   * @internal\n   */\n  __removeEmits(event: string): void {\n    const ctor = this.constructor;\n    const index = ctor.config.emits.indexOf(event);\n    ctor.config.emits.splice(index, 1);\n  }\n\n  /**\n   * Bind a listener function to an event.\n   *\n   * @param  {string} event\n   *   Name of the event.\n   * @param  {EventListenerOrEventListenerObject} listener\n   *   Function to be called.\n   * @param {boolean|AddEventListenerOptions} [options]\n   *   Options for the `removeEventListener` method.\n   * @return {() =\u003e void}\n   *   A function to unbind the listener.\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#on-event-callback-options\n   */\n  $on(\n    event: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | AddEventListenerOptions,\n  ): () =\u003e void {\n    if (isDev) {\n      this.__debug('$on', event, listener, options);\n    }\n\n    let set = this.__eventHandlers.get(event);\n\n    if (!set) {\n      set = new Set();\n      this.__eventHandlers.set(event, set);\n    }\n\n    set.add(listener);\n\n    const target = getEventTarget(this, event, this.__config);\n    target?.addEventListener(event, listener, options);\n\n    if (isDev) {\n      if (!target) {\n        console.warn(\n          `[${this.$id}]`,\n          `The \"${event}\" event is missing from the configuration and is not a native`,\n          `event for the root element of type \\`${this.$el.constructor.name}\\`.`,\n        );\n      }\n    }\n\n    return () =\u003e {\n      this.$off(event, listener, options);\n    };\n  }\n\n  /**\n   * Unbind a listener function from an event.\n   *\n   * @param {string} event\n   *   Name of the event.\n   * @param {EventListenerOrEventListenerObject} listener\n   *   Function to be removed.\n   * @param {boolean|EventListenerOptions} [options]\n   *   Options for the `removeEventListener` method.\n   * @return {void}\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#off-event-callback-options\n   */\n  $off(\n    event: string,\n    listener: EventListenerOrEventListenerObject,\n    options?: boolean | EventListenerOptions,\n  ) {\n    if (isDev) {\n      this.__debug('$off', event, listener);\n    }\n\n    this.__eventHandlers.get(event)?.delete(listener);\n\n    const target = getEventTarget(this, event, this.__config);\n    target?.removeEventListener(event, listener, options);\n  }\n\n  /**\n   * Emits an event.\n   *\n   * @param  {string} event Name of the event.\n   * @param  {any[]}  args  The arguments to apply to the functions bound to this event.\n   * @return {void}\n   * @link https://js-toolkit.studiometa.dev/api/instance-methods.html#emit-event-args\n   */\n  $emit(event: string | Event, ...args: unknown[]) {\n    if (isDev) {\n      this.__debug('$emit', event, args);\n    }\n\n    this.$el.dispatchEvent(\n      event instanceof Event ? event : new CustomEvent(event, { detail: args }),\n    );\n  }\n\n  /**\n   * Register and mount all instances of the component.\n   * @link https://js-toolkit.studiometa.dev/api/static-methods.html#register-nameorselector-string\n   */\n  static $register\u003cT extends BaseProps = BaseProps, U extends typeof Base\u003cT\u003e = typeof Base\u003cT\u003e\u003e(\n    this: U,\n    nameOrSelector?: string,\n  ): Promise\u003cInstanceType\u003cU\u003e\u003e[] {\n    addToRegistry(nameOrSelector ?? this.config.name, this);\n\n    return getComponentElements(nameOrSelector ?? this.config.name).map(\n      async (el) =\u003e\n        getInstanceFromElement(el, this) ?? (new this(el).$mount() as Promise\u003cInstanceType\u003cU\u003e\u003e),\n    );\n  }\n}\n"],"version":3}
