{
  "version": 3,
  "sources": ["../src/main.ts", "../src/lib.ts", "../src/bootstrap.ts", "../src/directiveDecorator.ts", "../src/directiveClass.ts", "../src/queryDecorator.ts"],
  "sourcesContent": ["export * from './bootstrap.js';\nexport * from './directiveDecorator.js';\nexport * from './directiveClass.js';\nexport * from './queryDecorator.js';\n", "import {createLogger} from '@alwatr/logger';\n\nimport type {DirectiveConstructor} from './directiveDecorator.js';\nimport type {} from '@alwatr/type-helper';\n\n/**\n * Alwatr Synapse Logger.\n */\nexport const logger = createLogger('alwatr/synapse');\n\n/**\n * The registry for all directives.\n */\nexport const directiveRegistry_: {selector: string; constructor: DirectiveConstructor}[] = [];\n", "import {directiveRegistry_, logger} from './lib.js';\n\nconst initializedAttribute = '_synapseConnected';\n\n/**\n * Initializes all registered directives within a given root element.\n * If no root element is provided, it scans the entire body.\n *\n * This function is idempotent; it will not re-initialize a directive on an element\n * that has already been processed.\n *\n * @param rootElement The element to scan for directives. Defaults to `document.body`.\n *\n * @example\n * ```ts\n * // Initialize directives on the whole page after the DOM is loaded.\n * document.addEventListener('DOMContentLoaded', () => bootstrapDirectives());\n *\n * // Or, initialize directives on a dynamically added part of the page.\n * const newContent = document.createElement('div');\n * newContent.innerHTML = '<div class=\"my-button\">Click Me</div>';\n * document.body.appendChild(newContent);\n *\n * bootstrapDirectives(newContent);\n * ```\n */\nexport function bootstrapDirectives(rootElement: Element | Document = document.body): void {\n  logger.logMethod?.('bootstrapDirectives');\n\n  for (const {selector, constructor} of directiveRegistry_) {\n    try {\n      const uninitializedSelector = `${selector}:not([${initializedAttribute}])`;\n      const elements = rootElement.querySelectorAll<HTMLElement>(uninitializedSelector);\n      if (elements.length === 0) continue;\n\n      logger.logOther?.(`Found ${elements.length} new element(s) for directive \"${selector}\"`);\n      elements.forEach((element) => {\n        // Mark the element as processed before creating an instance\n        element.setAttribute(initializedAttribute, 'true');\n        // Instantiate the directive with the element.\n        new constructor(element, selector);\n      });\n    }\n    catch (err) {\n      logger.error('bootstrapDirectives', 'directive_instantiation_error', err, {selector});\n    }\n  }\n}\n", "import {directiveRegistry_, logger} from './lib.js';\n\nimport type {DirectiveBase} from './directiveClass.js';\n\n/**\n * Type definition for a directive constructor.\n * A directive class must have a constructor that accepts an HTMLElement.\n */\nexport type DirectiveConstructor<T extends DirectiveBase = DirectiveBase> = new (element: HTMLElement, selector: string) => T;\n\n/**\n * A class decorator that registers a class as a directive.\n *\n * @param selector The CSS selector to which this directive will be attached.\n *\n * @example\n * ```ts\n * @directive('.my-button')\n * class MyButtonDirective extends DirectiveBase {\n *   protected update_(): void {\n *     this.element_.addEventListener('click', () => console.log('Button clicked!'));\n *   }\n * }\n * ```\n */\nexport function directive(selector: string) {\n  logger.logMethodArgs?.('@directive', selector);\n\n  /**\n   * The decorator function that receives the class constructor.\n   * @param constructor The class to be registered as a directive.\n   */\n  return function (constructor: DirectiveConstructor): void {\n    directiveRegistry_.push({selector, constructor});\n  };\n}\n", "/**\n * @package @alwatr/synapse\n *\n * This file defines the `DirectiveBase` class, which is the foundation for creating custom directives\n * in the Alwatr Synapse library. Directives are used to attach behavior and logic to DOM elements\n * declaratively.\n */\n\nimport {delay} from '@alwatr/delay';\nimport {createLogger} from '@alwatr/logger';\n\n/**\n * The abstract base class for all directives.\n *\n * Extend this class to create a new directive that can be registered with the `@directive` decorator.\n * It provides the core functionality for linking a TypeScript class to a DOM element and managing its lifecycle.\n *\n * @example\n * ```ts\n * import {DirectiveBase, directive} from '@alwatr/synapse';\n *\n * @directive('[my-directive]')\n * export class MyDirective extends DirectiveBase {\n *   protected override init_(): void {\n *     super.init_(); // فراخوانی متد والد برای حفظ سازگاری با نسخه‌های قبل ضروری است\n *     this.element_.textContent = 'Hello from MyDirective!';\n *     this.element_.addEventListener('click', () => this.log('Element clicked!'));\n *   }\n * }\n * ```\n */\nexport abstract class DirectiveBase {\n  /**\n   * The CSS selector that this directive is associated with.\n   * This is the selector string provided to the `@directive` decorator.\n   */\n  protected readonly selector_;\n\n  /**\n   * A dedicated logger instance for this directive, pre-configured with a context like `directive:[selector]`.\n   * Use this for logging to provide clear, contextual messages.\n   */\n  protected readonly logger_;\n\n  /**\n   * The DOM element to which this directive instance is attached.\n   * All directive logic operates on this element.\n   */\n  protected readonly element_: HTMLElement;\n\n  /**\n   * Initializes the directive. This constructor is called by the Synapse bootstrap process and should not be\n   * overridden in subclasses.\n   *\n   * It sets up the logger, element, and selector, and then schedules the `init_` and `update_` lifecycle methods\n   * to run in the next microtask.\n   *\n   * @param element The DOM element to which this directive is attached.\n   * @param selector The CSS selector that matched this directive.\n   */\n  constructor(element: HTMLElement, selector: string) {\n    this.logger_ = createLogger(`directive:${selector}`);\n    this.logger_.logMethodArgs?.('new', {selector, element});\n\n    this.selector_ = selector;\n    this.element_ = element;\n\n    (async () => {\n      await delay.nextMicrotask();\n      await this.init_();\n    })();\n  }\n\n  /**\n   * Called once automatically after the directive is initialized.\n   *\n   * This method serves as the main entry point for your directive's logic,\n   * such as modifying the element or setting up event listeners.\n   *\n   * **Note:** Do not call this method directly. It is designed to be called only once by the framework.\n   */\n  protected init_(): Awaitable<void> {\n    this.logger_.logMethod?.('init_');\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (this as any).update_?.(); // backward compatibility\n  }\n\n  /**\n   * Dispatches a custom event from the target element.\n   *\n   * This is a convenience method for firing events that can be listened to by other parts of the application.\n   * The event bubbles up through the DOM.\n   *\n   * @param eventName The name of the custom event.\n   * @param detail Optional data to include in the event's `detail` property.\n   *\n   * @example\n   * ```ts\n   * this.dispatch_('user-action', {action: 'save', id: 123});\n   * ```\n   */\n  protected dispatch_(eventName: string, detail?: unknown): void {\n    this.logger_.logMethodArgs?.('dispatch_', {eventName, detail});\n    this.element_.dispatchEvent(new CustomEvent(eventName, {detail, bubbles: true}));\n  }\n\n  /**\n   * Cleans up the directive's resources.\n   *\n   * This method removes the element from the DOM and nullifies the internal reference to it,\n   * helping with garbage collection. It can be extended by subclasses to perform additional cleanup,\n   * such as removing event listeners.\n   */\n  protected destroy_(): Awaitable<void> {\n    this.logger_.logMethod?.('destroy_');\n    this.element_.remove();\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (this as any).element_ = null;\n  }\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {DirectiveBase} from './directiveClass.js';\n\n/**\n * A property decorator that queries the directive's element for a selector.\n * The query is performed once and the result is cached.\n *\n * @param selector The CSS selector to query for.\n * @param cache Whether to cache the result on first access. Defaults is true.\n *\n * @example\n * ```ts\n * @directive('[my-directive]')\n * class MyDirective extends DirectiveBase {\n *   @query('.my-element')\n *   protected myElement: HTMLDivElement | null;\n * }\n * ```\n */\nexport function query(selector: string, cache = true) {\n  return function (target: DirectiveBase, propertyKey: string): void {\n    const privateKey = Symbol(`${String(propertyKey)}__`);\n\n    Object.defineProperty(target, propertyKey, {\n      get(this: DirectiveBase) {\n        if (cache === false || (this as any)[privateKey] === undefined) {\n          (this as any)[privateKey] = this.element_.querySelector(selector);\n        }\n        return (this as any)[privateKey];\n      },\n      configurable: true,\n      enumerable: true,\n    });\n  };\n}\n\n/**\n * A property decorator that queries the directive's element for all selectors.\n * The queries are performed once and the result is cached.\n *\n * @param selector The CSS selector to query for.\n *\n * @example\n * ```ts\n * @directive('[my-directive]')\n * class MyDirective extends DirectiveBase {\n *   @queryAll('.my-elements')\n *   protected myElements: NodeListOf<HTMLDivElement>;\n * }\n * ```\n */\nexport function queryAll(selector: string, cache = true) {\n  return function (target: DirectiveBase, propertyKey: string): void {\n    const privateKey = Symbol(`${String(propertyKey)}__`);\n\n    Object.defineProperty(target, propertyKey, {\n      get(this: DirectiveBase) {\n        if (cache === false || (this as any)[privateKey] === undefined) {\n          (this as any)[privateKey] = this.element_.querySelectorAll(selector);\n        }\n        return (this as any)[privateKey];\n      },\n      configurable: true,\n      enumerable: true,\n    });\n  };\n}\n"],
  "mappings": ";;qqBAAA,iOCAA,kBAA2B,0BAQpB,IAAM,UAAS,4BAAa,gBAAgB,EAK5C,IAAM,mBAA8E,CAAC,ECX5F,IAAM,qBAAuB,oBAwBtB,SAAS,oBAAoB,YAAkC,SAAS,KAAY,CACzF,OAAO,YAAY,qBAAqB,EAExC,SAAW,CAAC,SAAU,WAAW,IAAK,mBAAoB,CACxD,GAAI,CACF,MAAM,sBAAwB,GAAG,QAAQ,SAAS,oBAAoB,KACtE,MAAM,SAAW,YAAY,iBAA8B,qBAAqB,EAChF,GAAI,SAAS,SAAW,EAAG,SAE3B,OAAO,WAAW,SAAS,SAAS,MAAM,kCAAkC,QAAQ,GAAG,EACvF,SAAS,QAAS,SAAY,CAE5B,QAAQ,aAAa,qBAAsB,MAAM,EAEjD,IAAI,YAAY,QAAS,QAAQ,CACnC,CAAC,CACH,OACO,IAAK,CACV,OAAO,MAAM,sBAAuB,gCAAiC,IAAK,CAAC,QAAQ,CAAC,CACtF,CACF,CACF,CCtBO,SAAS,UAAU,SAAkB,CAC1C,OAAO,gBAAgB,aAAc,QAAQ,EAM7C,OAAO,SAAU,YAAyC,CACxD,mBAAmB,KAAK,CAAC,SAAU,WAAW,CAAC,CACjD,CACF,CC3BA,iBAAoB,yBACpB,IAAAA,eAA2B,0BAsBpB,IAAe,cAAf,KAA6B,CA6BlC,YAAY,QAAsB,SAAkB,CAClD,KAAK,WAAU,6BAAa,aAAa,QAAQ,EAAE,EACnD,KAAK,QAAQ,gBAAgB,MAAO,CAAC,SAAU,OAAO,CAAC,EAEvD,KAAK,UAAY,SACjB,KAAK,SAAW,SAEf,SAAY,CACX,MAAM,mBAAM,cAAc,EAC1B,MAAM,KAAK,MAAM,CACnB,GAAG,CACL,CAUU,OAAyB,CACjC,KAAK,QAAQ,YAAY,OAAO,EAG/B,KAAa,UAAU,CAC1B,CAgBU,UAAU,UAAmB,OAAwB,CAC7D,KAAK,QAAQ,gBAAgB,YAAa,CAAC,UAAW,MAAM,CAAC,EAC7D,KAAK,SAAS,cAAc,IAAI,YAAY,UAAW,CAAC,OAAQ,QAAS,IAAI,CAAC,CAAC,CACjF,CASU,UAA4B,CACpC,KAAK,QAAQ,YAAY,UAAU,EACnC,KAAK,SAAS,OAAO,EAEpB,KAAa,SAAW,IAC3B,CACF,ECrGO,SAAS,MAAM,SAAkB,MAAQ,KAAM,CACpD,OAAO,SAAU,OAAuB,YAA2B,CACjE,MAAM,WAAa,OAAO,GAAG,OAAO,WAAW,CAAC,IAAI,EAEpD,OAAO,eAAe,OAAQ,YAAa,CACzC,KAAyB,CACvB,GAAI,QAAU,OAAU,KAAa,UAAU,IAAM,OAAW,CAC7D,KAAa,UAAU,EAAI,KAAK,SAAS,cAAc,QAAQ,CAClE,CACA,OAAQ,KAAa,UAAU,CACjC,EACA,aAAc,KACd,WAAY,IACd,CAAC,CACH,CACF,CAiBO,SAAS,SAAS,SAAkB,MAAQ,KAAM,CACvD,OAAO,SAAU,OAAuB,YAA2B,CACjE,MAAM,WAAa,OAAO,GAAG,OAAO,WAAW,CAAC,IAAI,EAEpD,OAAO,eAAe,OAAQ,YAAa,CACzC,KAAyB,CACvB,GAAI,QAAU,OAAU,KAAa,UAAU,IAAM,OAAW,CAC7D,KAAa,UAAU,EAAI,KAAK,SAAS,iBAAiB,QAAQ,CACrE,CACA,OAAQ,KAAa,UAAU,CACjC,EACA,aAAc,KACd,WAAY,IACd,CAAC,CACH,CACF",
  "names": ["import_logger"]
}
