stimulus-rails 1.2.1 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"stimulus.min.js","sources":["../src/core/event_listener.ts","../src/core/dispatcher.ts","../src/core/action_descriptor.ts","../src/core/string_helpers.ts","../src/core/action.ts","../src/core/binding.ts","../src/mutation-observers/element_observer.ts","../src/mutation-observers/attribute_observer.ts","../src/multimap/set_operations.ts","../src/multimap/multimap.ts","../src/multimap/indexed_multimap.ts","../src/mutation-observers/selector_observer.ts","../src/mutation-observers/string_map_observer.ts","../src/mutation-observers/token_list_observer.ts","../src/mutation-observers/value_list_observer.ts","../src/core/binding_observer.ts","../src/core/value_observer.ts","../src/core/target_observer.ts","../src/core/inheritable_statics.ts","../src/core/outlet_observer.ts","../src/core/context.ts","../src/core/blessing.ts","../src/core/module.ts","../src/core/definition.ts","../src/core/class_map.ts","../src/core/data_map.ts","../src/core/guide.ts","../src/core/selectors.ts","../src/core/target_set.ts","../src/core/outlet_set.ts","../src/core/scope.ts","../src/core/scope_observer.ts","../src/core/router.ts","../src/core/schema.ts","../src/core/application.ts","../src/core/value_properties.ts","../src/core/controller.ts","../src/core/class_properties.ts","../src/core/target_properties.ts","../src/core/outlet_properties.ts"],"sourcesContent":["import { Binding } from \"./binding\"\n\nexport class EventListener implements EventListenerObject {\n readonly eventTarget: EventTarget\n readonly eventName: string\n readonly eventOptions: AddEventListenerOptions\n private unorderedBindings: Set<Binding>\n\n constructor(eventTarget: EventTarget, eventName: string, eventOptions: AddEventListenerOptions) {\n this.eventTarget = eventTarget\n this.eventName = eventName\n this.eventOptions = eventOptions\n this.unorderedBindings = new Set()\n }\n\n connect() {\n this.eventTarget.addEventListener(this.eventName, this, this.eventOptions)\n }\n\n disconnect() {\n this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions)\n }\n\n // Binding observer delegate\n\n bindingConnected(binding: Binding) {\n this.unorderedBindings.add(binding)\n }\n\n bindingDisconnected(binding: Binding) {\n this.unorderedBindings.delete(binding)\n }\n\n handleEvent(event: Event) {\n // FIXME: Determine why TS won't recognize that the extended event has immediatePropagationStopped\n const extendedEvent = extendEvent(event) as any\n for (const binding of this.bindings) {\n if (extendedEvent.immediatePropagationStopped) {\n break\n } else {\n binding.handleEvent(extendedEvent)\n }\n }\n }\n\n hasBindings() {\n return this.unorderedBindings.size > 0\n }\n\n get bindings(): Binding[] {\n return Array.from(this.unorderedBindings).sort((left, right) => {\n const leftIndex = left.index,\n rightIndex = right.index\n return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0\n })\n }\n}\n\nfunction extendEvent(event: Event) {\n if (\"immediatePropagationStopped\" in event) {\n return event\n } else {\n const { stopImmediatePropagation } = event\n return Object.assign(event, {\n immediatePropagationStopped: false,\n stopImmediatePropagation() {\n this.immediatePropagationStopped = true\n stopImmediatePropagation.call(this)\n },\n })\n }\n}\n","import { Application } from \"./application\"\nimport { Binding } from \"./binding\"\nimport { BindingObserverDelegate } from \"./binding_observer\"\nimport { EventListener } from \"./event_listener\"\n\nexport class Dispatcher implements BindingObserverDelegate {\n readonly application: Application\n private eventListenerMaps: Map<EventTarget, Map<string, EventListener>>\n private started: boolean\n\n constructor(application: Application) {\n this.application = application\n this.eventListenerMaps = new Map()\n this.started = false\n }\n\n start() {\n if (!this.started) {\n this.started = true\n this.eventListeners.forEach((eventListener) => eventListener.connect())\n }\n }\n\n stop() {\n if (this.started) {\n this.started = false\n this.eventListeners.forEach((eventListener) => eventListener.disconnect())\n }\n }\n\n get eventListeners(): EventListener[] {\n return Array.from(this.eventListenerMaps.values()).reduce(\n (listeners, map) => listeners.concat(Array.from(map.values())),\n [] as EventListener[]\n )\n }\n\n // Binding observer delegate\n\n bindingConnected(binding: Binding) {\n this.fetchEventListenerForBinding(binding).bindingConnected(binding)\n }\n\n bindingDisconnected(binding: Binding, clearEventListeners = false) {\n this.fetchEventListenerForBinding(binding).bindingDisconnected(binding)\n if (clearEventListeners) this.clearEventListenersForBinding(binding)\n }\n\n // Error handling\n\n handleError(error: Error, message: string, detail: object = {}) {\n this.application.handleError(error, `Error ${message}`, detail)\n }\n\n private clearEventListenersForBinding(binding: Binding) {\n const eventListener = this.fetchEventListenerForBinding(binding)\n if (!eventListener.hasBindings()) {\n eventListener.disconnect()\n this.removeMappedEventListenerFor(binding)\n }\n }\n\n private removeMappedEventListenerFor(binding: Binding) {\n const { eventTarget, eventName, eventOptions } = binding\n const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget)\n const cacheKey = this.cacheKey(eventName, eventOptions)\n\n eventListenerMap.delete(cacheKey)\n if (eventListenerMap.size == 0) this.eventListenerMaps.delete(eventTarget)\n }\n\n private fetchEventListenerForBinding(binding: Binding): EventListener {\n const { eventTarget, eventName, eventOptions } = binding\n return this.fetchEventListener(eventTarget, eventName, eventOptions)\n }\n\n private fetchEventListener(\n eventTarget: EventTarget,\n eventName: string,\n eventOptions: AddEventListenerOptions\n ): EventListener {\n const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget)\n const cacheKey = this.cacheKey(eventName, eventOptions)\n let eventListener = eventListenerMap.get(cacheKey)\n if (!eventListener) {\n eventListener = this.createEventListener(eventTarget, eventName, eventOptions)\n eventListenerMap.set(cacheKey, eventListener)\n }\n return eventListener\n }\n\n private createEventListener(\n eventTarget: EventTarget,\n eventName: string,\n eventOptions: AddEventListenerOptions\n ): EventListener {\n const eventListener = new EventListener(eventTarget, eventName, eventOptions)\n if (this.started) {\n eventListener.connect()\n }\n return eventListener\n }\n\n private fetchEventListenerMapForEventTarget(eventTarget: EventTarget): Map<string, EventListener> {\n let eventListenerMap = this.eventListenerMaps.get(eventTarget)\n if (!eventListenerMap) {\n eventListenerMap = new Map()\n this.eventListenerMaps.set(eventTarget, eventListenerMap)\n }\n return eventListenerMap\n }\n\n private cacheKey(eventName: string, eventOptions: any): string {\n const parts = [eventName]\n Object.keys(eventOptions)\n .sort()\n .forEach((key) => {\n parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`)\n })\n return parts.join(\":\")\n }\n}\n","export type ActionDescriptorFilters = Record<string, ActionDescriptorFilter>\nexport type ActionDescriptorFilter = (options: ActionDescriptorFilterOptions) => boolean\ntype ActionDescriptorFilterOptions = {\n name: string\n value: boolean\n event: Event\n element: Element\n}\n\nexport const defaultActionDescriptorFilters: ActionDescriptorFilters = {\n stop({ event, value }) {\n if (value) event.stopPropagation()\n\n return true\n },\n\n prevent({ event, value }) {\n if (value) event.preventDefault()\n\n return true\n },\n\n self({ event, value, element }) {\n if (value) {\n return element === event.target\n } else {\n return true\n }\n },\n}\n\nexport interface ActionDescriptor {\n eventTarget: EventTarget\n eventOptions: AddEventListenerOptions\n eventName: string\n identifier: string\n methodName: string\n keyFilter: string\n}\n\n// capture nos.: 1 1 2 2 3 3 4 4 5 5 6 6\nconst descriptorPattern = /^(?:(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/\n\nexport function parseActionDescriptorString(descriptorString: string): Partial<ActionDescriptor> {\n const source = descriptorString.trim()\n const matches = source.match(descriptorPattern) || []\n let eventName = matches[1]\n let keyFilter = matches[2]\n\n if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n eventName += `.${keyFilter}`\n keyFilter = \"\"\n }\n\n return {\n eventTarget: parseEventTarget(matches[3]),\n eventName,\n eventOptions: matches[6] ? parseEventOptions(matches[6]) : {},\n identifier: matches[4],\n methodName: matches[5],\n keyFilter,\n }\n}\n\nfunction parseEventTarget(eventTargetName: string): EventTarget | undefined {\n if (eventTargetName == \"window\") {\n return window\n } else if (eventTargetName == \"document\") {\n return document\n }\n}\n\nfunction parseEventOptions(eventOptions: string): AddEventListenerOptions {\n return eventOptions\n .split(\":\")\n .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {})\n}\n\nexport function stringifyEventTarget(eventTarget: EventTarget) {\n if (eventTarget == window) {\n return \"window\"\n } else if (eventTarget == document) {\n return \"document\"\n }\n}\n","export function camelize(value: string) {\n return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase())\n}\n\nexport function namespaceCamelize(value: string) {\n return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"))\n}\n\nexport function capitalize(value: string) {\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nexport function dasherize(value: string) {\n return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`)\n}\n\nexport function tokenize(value: string) {\n return value.match(/[^\\s]+/g) || []\n}\n","import { ActionDescriptor, parseActionDescriptorString, stringifyEventTarget } from \"./action_descriptor\"\nimport { Token } from \"../mutation-observers\"\nimport { Schema } from \"./schema\"\nimport { camelize } from \"./string_helpers\"\nexport class Action {\n readonly element: Element\n readonly index: number\n readonly eventTarget: EventTarget\n readonly eventName: string\n readonly eventOptions: AddEventListenerOptions\n readonly identifier: string\n readonly methodName: string\n readonly keyFilter: string\n readonly schema: Schema\n\n static forToken(token: Token, schema: Schema) {\n return new this(token.element, token.index, parseActionDescriptorString(token.content), schema)\n }\n\n constructor(element: Element, index: number, descriptor: Partial<ActionDescriptor>, schema: Schema) {\n this.element = element\n this.index = index\n this.eventTarget = descriptor.eventTarget || element\n this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\")\n this.eventOptions = descriptor.eventOptions || {}\n this.identifier = descriptor.identifier || error(\"missing identifier\")\n this.methodName = descriptor.methodName || error(\"missing method name\")\n this.keyFilter = descriptor.keyFilter || \"\"\n this.schema = schema\n }\n\n toString() {\n const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\"\n const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\"\n return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`\n }\n\n isFilterTarget(event: KeyboardEvent): boolean {\n if (!this.keyFilter) {\n return false\n }\n\n const filteres = this.keyFilter.split(\"+\")\n const modifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"]\n const [meta, ctrl, alt, shift] = modifiers.map((modifier) => filteres.includes(modifier))\n\n if (event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift) {\n return true\n }\n\n const standardFilter = filteres.filter((key) => !modifiers.includes(key))[0]\n if (!standardFilter) {\n // missing non modifier key\n return false\n }\n\n if (!Object.prototype.hasOwnProperty.call(this.keyMappings, standardFilter)) {\n error(`contains unknown key filter: ${this.keyFilter}`)\n }\n\n return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase()\n }\n\n get params() {\n const params: { [key: string]: any } = {}\n const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\")\n\n for (const { name, value } of Array.from(this.element.attributes)) {\n const match = name.match(pattern)\n const key = match && match[1]\n if (key) {\n params[camelize(key)] = typecast(value)\n }\n }\n return params\n }\n\n private get eventTargetName() {\n return stringifyEventTarget(this.eventTarget)\n }\n\n private get keyMappings() {\n return this.schema.keyMappings\n }\n}\n\nconst defaultEventNames: { [tagName: string]: (element: Element) => string } = {\n a: () => \"click\",\n button: () => \"click\",\n form: () => \"submit\",\n details: () => \"toggle\",\n input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n select: () => \"change\",\n textarea: () => \"input\",\n}\n\nexport function getDefaultEventNameForElement(element: Element): string | undefined {\n const tagName = element.tagName.toLowerCase()\n if (tagName in defaultEventNames) {\n return defaultEventNames[tagName](element)\n }\n}\n\nfunction error(message: string): never {\n throw new Error(message)\n}\n\nfunction typecast(value: any): any {\n try {\n return JSON.parse(value)\n } catch (o_O) {\n return value\n }\n}\n","import { Action } from \"./action\"\nimport { ActionEvent } from \"./action_event\"\nimport { Context } from \"./context\"\nimport { Controller } from \"./controller\"\nimport { Scope } from \"./scope\"\nexport class Binding {\n readonly context: Context\n readonly action: Action\n\n constructor(context: Context, action: Action) {\n this.context = context\n this.action = action\n }\n\n get index(): number {\n return this.action.index\n }\n\n get eventTarget(): EventTarget {\n return this.action.eventTarget\n }\n\n get eventOptions(): AddEventListenerOptions {\n return this.action.eventOptions\n }\n\n get identifier(): string {\n return this.context.identifier\n }\n\n handleEvent(event: Event) {\n if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(event)) {\n this.invokeWithEvent(event)\n }\n }\n\n get eventName(): string {\n return this.action.eventName\n }\n\n get method(): Function {\n const method = (this.controller as any)[this.methodName]\n if (typeof method == \"function\") {\n return method\n }\n throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`)\n }\n\n private applyEventModifiers(event: Event): boolean {\n const { element } = this.action\n const { actionDescriptorFilters } = this.context.application\n\n let passes = true\n\n for (const [name, value] of Object.entries(this.eventOptions)) {\n if (name in actionDescriptorFilters) {\n const filter = actionDescriptorFilters[name]\n\n passes = passes && filter({ name, value, event, element })\n } else {\n continue\n }\n }\n\n return passes\n }\n\n private invokeWithEvent(event: Event) {\n const { target, currentTarget } = event\n try {\n const { params } = this.action\n const actionEvent: ActionEvent = Object.assign(event, { params })\n this.method.call(this.controller, actionEvent)\n this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName })\n } catch (error: any) {\n const { identifier, controller, element, index } = this\n const detail = { identifier, controller, element, index, event }\n this.context.handleError(error, `invoking action \"${this.action}\"`, detail)\n }\n }\n\n private willBeInvokedByEvent(event: Event): boolean {\n const eventTarget = event.target\n\n if (event instanceof KeyboardEvent && this.action.isFilterTarget(event)) {\n return false\n }\n\n if (this.element === eventTarget) {\n return true\n } else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n return this.scope.containsElement(eventTarget)\n } else {\n return this.scope.containsElement(this.action.element)\n }\n }\n\n private get controller(): Controller {\n return this.context.controller\n }\n\n private get methodName(): string {\n return this.action.methodName\n }\n\n private get element(): Element {\n return this.scope.element\n }\n\n private get scope(): Scope {\n return this.context.scope\n }\n}\n","export interface ElementObserverDelegate {\n matchElement(element: Element): boolean\n matchElementsInTree(tree: Element): Element[]\n\n elementMatched?(element: Element): void\n elementUnmatched?(element: Element): void\n elementAttributeChanged?(element: Element, attributeName: string): void\n}\n\nexport class ElementObserver {\n element: Element\n started: boolean\n private delegate: ElementObserverDelegate\n\n private elements: Set<Element>\n private mutationObserver: MutationObserver\n private mutationObserverInit = { attributes: true, childList: true, subtree: true }\n\n constructor(element: Element, delegate: ElementObserverDelegate) {\n this.element = element\n this.started = false\n this.delegate = delegate\n\n this.elements = new Set()\n this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations))\n }\n\n start() {\n if (!this.started) {\n this.started = true\n this.mutationObserver.observe(this.element, this.mutationObserverInit)\n this.refresh()\n }\n }\n\n pause(callback: () => void) {\n if (this.started) {\n this.mutationObserver.disconnect()\n this.started = false\n }\n\n callback()\n\n if (!this.started) {\n this.mutationObserver.observe(this.element, this.mutationObserverInit)\n this.started = true\n }\n }\n\n stop() {\n if (this.started) {\n this.mutationObserver.takeRecords()\n this.mutationObserver.disconnect()\n this.started = false\n }\n }\n\n refresh() {\n if (this.started) {\n const matches = new Set(this.matchElementsInTree())\n\n for (const element of Array.from(this.elements)) {\n if (!matches.has(element)) {\n this.removeElement(element)\n }\n }\n\n for (const element of Array.from(matches)) {\n this.addElement(element)\n }\n }\n }\n\n // Mutation record processing\n\n private processMutations(mutations: MutationRecord[]) {\n if (this.started) {\n for (const mutation of mutations) {\n this.processMutation(mutation)\n }\n }\n }\n\n private processMutation(mutation: MutationRecord) {\n if (mutation.type == \"attributes\") {\n this.processAttributeChange(mutation.target, mutation.attributeName!)\n } else if (mutation.type == \"childList\") {\n this.processRemovedNodes(mutation.removedNodes)\n this.processAddedNodes(mutation.addedNodes)\n }\n }\n\n private processAttributeChange(node: Node, attributeName: string) {\n const element = node as Element\n if (this.elements.has(element)) {\n if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n this.delegate.elementAttributeChanged(element, attributeName)\n } else {\n this.removeElement(element)\n }\n } else if (this.matchElement(element)) {\n this.addElement(element)\n }\n }\n\n private processRemovedNodes(nodes: NodeList) {\n for (const node of Array.from(nodes)) {\n const element = this.elementFromNode(node)\n if (element) {\n this.processTree(element, this.removeElement)\n }\n }\n }\n\n private processAddedNodes(nodes: NodeList) {\n for (const node of Array.from(nodes)) {\n const element = this.elementFromNode(node)\n if (element && this.elementIsActive(element)) {\n this.processTree(element, this.addElement)\n }\n }\n }\n\n // Element matching\n\n private matchElement(element: Element): boolean {\n return this.delegate.matchElement(element)\n }\n\n private matchElementsInTree(tree: Element = this.element): Element[] {\n return this.delegate.matchElementsInTree(tree)\n }\n\n private processTree(tree: Element, processor: (element: Element) => void) {\n for (const element of this.matchElementsInTree(tree)) {\n processor.call(this, element)\n }\n }\n\n private elementFromNode(node: Node): Element | undefined {\n if (node.nodeType == Node.ELEMENT_NODE) {\n return node as Element\n }\n }\n\n private elementIsActive(element: Element): boolean {\n if (element.isConnected != this.element.isConnected) {\n return false\n } else {\n return this.element.contains(element)\n }\n }\n\n // Element tracking\n\n private addElement(element: Element) {\n if (!this.elements.has(element)) {\n if (this.elementIsActive(element)) {\n this.elements.add(element)\n if (this.delegate.elementMatched) {\n this.delegate.elementMatched(element)\n }\n }\n }\n }\n\n private removeElement(element: Element) {\n if (this.elements.has(element)) {\n this.elements.delete(element)\n if (this.delegate.elementUnmatched) {\n this.delegate.elementUnmatched(element)\n }\n }\n }\n}\n","import { ElementObserver, ElementObserverDelegate } from \"./element_observer\"\n\nexport interface AttributeObserverDelegate {\n elementMatchedAttribute?(element: Element, attributeName: string): void\n elementAttributeValueChanged?(element: Element, attributeName: string): void\n elementUnmatchedAttribute?(element: Element, attributeName: string): void\n}\n\nexport class AttributeObserver implements ElementObserverDelegate {\n attributeName: string\n private delegate: AttributeObserverDelegate\n\n private elementObserver: ElementObserver\n\n constructor(element: Element, attributeName: string, delegate: AttributeObserverDelegate) {\n this.attributeName = attributeName\n this.delegate = delegate\n\n this.elementObserver = new ElementObserver(element, this)\n }\n\n get element(): Element {\n return this.elementObserver.element\n }\n\n get selector(): string {\n return `[${this.attributeName}]`\n }\n\n start() {\n this.elementObserver.start()\n }\n\n pause(callback: () => void) {\n this.elementObserver.pause(callback)\n }\n\n stop() {\n this.elementObserver.stop()\n }\n\n refresh() {\n this.elementObserver.refresh()\n }\n\n get started(): boolean {\n return this.elementObserver.started\n }\n\n // Element observer delegate\n\n matchElement(element: Element): boolean {\n return element.hasAttribute(this.attributeName)\n }\n\n matchElementsInTree(tree: Element): Element[] {\n const match = this.matchElement(tree) ? [tree] : []\n const matches = Array.from(tree.querySelectorAll(this.selector))\n return match.concat(matches)\n }\n\n elementMatched(element: Element) {\n if (this.delegate.elementMatchedAttribute) {\n this.delegate.elementMatchedAttribute(element, this.attributeName)\n }\n }\n\n elementUnmatched(element: Element) {\n if (this.delegate.elementUnmatchedAttribute) {\n this.delegate.elementUnmatchedAttribute(element, this.attributeName)\n }\n }\n\n elementAttributeChanged(element: Element, attributeName: string) {\n if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n this.delegate.elementAttributeValueChanged(element, attributeName)\n }\n }\n}\n","export function add<K, V>(map: Map<K, Set<V>>, key: K, value: V) {\n fetch(map, key).add(value)\n}\n\nexport function del<K, V>(map: Map<K, Set<V>>, key: K, value: V) {\n fetch(map, key).delete(value)\n prune(map, key)\n}\n\nexport function fetch<K, V>(map: Map<K, Set<V>>, key: K): Set<V> {\n let values = map.get(key)\n if (!values) {\n values = new Set()\n map.set(key, values)\n }\n return values\n}\n\nexport function prune<K, V>(map: Map<K, Set<V>>, key: K) {\n const values = map.get(key)\n if (values != null && values.size == 0) {\n map.delete(key)\n }\n}\n","import { add, del } from \"./set_operations\"\n\nexport class Multimap<K, V> {\n private valuesByKey: Map<K, Set<V>>\n\n constructor() {\n this.valuesByKey = new Map<K, Set<V>>()\n }\n\n get keys() {\n return Array.from(this.valuesByKey.keys())\n }\n\n get values(): V[] {\n const sets = Array.from(this.valuesByKey.values())\n return sets.reduce((values, set) => values.concat(Array.from(set)), <V[]>[])\n }\n\n get size(): number {\n const sets = Array.from(this.valuesByKey.values())\n return sets.reduce((size, set) => size + set.size, 0)\n }\n\n add(key: K, value: V) {\n add(this.valuesByKey, key, value)\n }\n\n delete(key: K, value: V) {\n del(this.valuesByKey, key, value)\n }\n\n has(key: K, value: V): boolean {\n const values = this.valuesByKey.get(key)\n return values != null && values.has(value)\n }\n\n hasKey(key: K): boolean {\n return this.valuesByKey.has(key)\n }\n\n hasValue(value: V): boolean {\n const sets = Array.from(this.valuesByKey.values())\n return sets.some((set) => set.has(value))\n }\n\n getValuesForKey(key: K): V[] {\n const values = this.valuesByKey.get(key)\n return values ? Array.from(values) : []\n }\n\n getKeysForValue(value: V): K[] {\n return Array.from(this.valuesByKey)\n .filter(([_key, values]) => values.has(value))\n .map(([key, _values]) => key)\n }\n}\n","import { Multimap } from \"./multimap\"\nimport { add, del } from \"./set_operations\"\n\nexport class IndexedMultimap<K, V> extends Multimap<K, V> {\n private keysByValue: Map<V, Set<K>>\n\n constructor() {\n super()\n this.keysByValue = new Map()\n }\n\n get values(): V[] {\n return Array.from(this.keysByValue.keys())\n }\n\n add(key: K, value: V) {\n super.add(key, value)\n add(this.keysByValue, value, key)\n }\n\n delete(key: K, value: V) {\n super.delete(key, value)\n del(this.keysByValue, value, key)\n }\n\n hasValue(value: V): boolean {\n return this.keysByValue.has(value)\n }\n\n getKeysForValue(value: V): K[] {\n const set = this.keysByValue.get(value)\n return set ? Array.from(set) : []\n }\n}\n","import { ElementObserver, ElementObserverDelegate } from \"./element_observer\"\nimport { Multimap } from \"../multimap\"\n\nexport interface SelectorObserverDelegate {\n selectorMatched(element: Element, selector: string, details: object): void\n selectorUnmatched(element: Element, selector: string, details: object): void\n selectorMatchElement?(element: Element, details: object): boolean\n}\n\nexport class SelectorObserver implements ElementObserverDelegate {\n private selector: string\n private elementObserver: ElementObserver\n private delegate: SelectorObserverDelegate\n private matchesByElement: Multimap<string, Element>\n private details: object\n\n constructor(element: Element, selector: string, delegate: SelectorObserverDelegate, details: object = {}) {\n this.selector = selector\n this.details = details\n this.elementObserver = new ElementObserver(element, this)\n this.delegate = delegate\n this.matchesByElement = new Multimap()\n }\n\n get started(): boolean {\n return this.elementObserver.started\n }\n\n start() {\n this.elementObserver.start()\n }\n\n pause(callback: () => void) {\n this.elementObserver.pause(callback)\n }\n\n stop() {\n this.elementObserver.stop()\n }\n\n refresh() {\n this.elementObserver.refresh()\n }\n\n get element(): Element {\n return this.elementObserver.element\n }\n\n // Element observer delegate\n\n matchElement(element: Element): boolean {\n const matches = element.matches(this.selector)\n\n if (this.delegate.selectorMatchElement) {\n return matches && this.delegate.selectorMatchElement(element, this.details)\n }\n\n return matches\n }\n\n matchElementsInTree(tree: Element): Element[] {\n const match = this.matchElement(tree) ? [tree] : []\n const matches = Array.from(tree.querySelectorAll(this.selector)).filter((match) => this.matchElement(match))\n return match.concat(matches)\n }\n\n elementMatched(element: Element) {\n this.selectorMatched(element)\n }\n\n elementUnmatched(element: Element) {\n this.selectorUnmatched(element)\n }\n\n elementAttributeChanged(element: Element, _attributeName: string) {\n const matches = this.matchElement(element)\n const matchedBefore = this.matchesByElement.has(this.selector, element)\n\n if (!matches && matchedBefore) {\n this.selectorUnmatched(element)\n }\n }\n\n private selectorMatched(element: Element) {\n if (this.delegate.selectorMatched) {\n this.delegate.selectorMatched(element, this.selector, this.details)\n this.matchesByElement.add(this.selector, element)\n }\n }\n\n private selectorUnmatched(element: Element) {\n this.delegate.selectorUnmatched(element, this.selector, this.details)\n this.matchesByElement.delete(this.selector, element)\n }\n}\n","export interface StringMapObserverDelegate {\n getStringMapKeyForAttribute(attributeName: string): string | undefined\n stringMapKeyAdded?(key: string, attributeName: string): void\n stringMapValueChanged?(value: string | null, key: string, oldValue: string | null): void\n stringMapKeyRemoved?(key: string, attributeName: string, oldValue: string | null): void\n}\n\nexport class StringMapObserver {\n readonly element: Element\n readonly delegate: StringMapObserverDelegate\n private started: boolean\n private stringMap: Map<string, string>\n private mutationObserver: MutationObserver\n\n constructor(element: Element, delegate: StringMapObserverDelegate) {\n this.element = element\n this.delegate = delegate\n this.started = false\n this.stringMap = new Map()\n this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations))\n }\n\n start() {\n if (!this.started) {\n this.started = true\n this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true })\n this.refresh()\n }\n }\n\n stop() {\n if (this.started) {\n this.mutationObserver.takeRecords()\n this.mutationObserver.disconnect()\n this.started = false\n }\n }\n\n refresh() {\n if (this.started) {\n for (const attributeName of this.knownAttributeNames) {\n this.refreshAttribute(attributeName, null)\n }\n }\n }\n\n // Mutation record processing\n\n private processMutations(mutations: MutationRecord[]) {\n if (this.started) {\n for (const mutation of mutations) {\n this.processMutation(mutation)\n }\n }\n }\n\n private processMutation(mutation: MutationRecord) {\n const attributeName = mutation.attributeName\n if (attributeName) {\n this.refreshAttribute(attributeName, mutation.oldValue)\n }\n }\n\n // State tracking\n\n private refreshAttribute(attributeName: string, oldValue: string | null) {\n const key = this.delegate.getStringMapKeyForAttribute(attributeName)\n if (key != null) {\n if (!this.stringMap.has(attributeName)) {\n this.stringMapKeyAdded(key, attributeName)\n }\n\n const value = this.element.getAttribute(attributeName)\n if (this.stringMap.get(attributeName) != value) {\n this.stringMapValueChanged(value, key, oldValue)\n }\n\n if (value == null) {\n const oldValue = this.stringMap.get(attributeName)\n this.stringMap.delete(attributeName)\n if (oldValue) this.stringMapKeyRemoved(key, attributeName, oldValue)\n } else {\n this.stringMap.set(attributeName, value)\n }\n }\n }\n\n private stringMapKeyAdded(key: string, attributeName: string) {\n if (this.delegate.stringMapKeyAdded) {\n this.delegate.stringMapKeyAdded(key, attributeName)\n }\n }\n\n private stringMapValueChanged(value: string | null, key: string, oldValue: string | null) {\n if (this.delegate.stringMapValueChanged) {\n this.delegate.stringMapValueChanged(value, key, oldValue)\n }\n }\n\n private stringMapKeyRemoved(key: string, attributeName: string, oldValue: string | null) {\n if (this.delegate.stringMapKeyRemoved) {\n this.delegate.stringMapKeyRemoved(key, attributeName, oldValue)\n }\n }\n\n private get knownAttributeNames() {\n return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))\n }\n\n private get currentAttributeNames() {\n return Array.from(this.element.attributes).map((attribute) => attribute.name)\n }\n\n private get recordedAttributeNames() {\n return Array.from(this.stringMap.keys())\n }\n}\n","import { AttributeObserver, AttributeObserverDelegate } from \"./attribute_observer\"\nimport { Multimap } from \"../multimap\"\n\nexport interface Token {\n element: Element\n attributeName: string\n index: number\n content: string\n}\n\nexport interface TokenListObserverDelegate {\n tokenMatched(token: Token): void\n tokenUnmatched(token: Token): void\n}\n\nexport class TokenListObserver implements AttributeObserverDelegate {\n private attributeObserver: AttributeObserver\n private delegate: TokenListObserverDelegate\n private tokensByElement: Multimap<Element, Token>\n\n constructor(element: Element, attributeName: string, delegate: TokenListObserverDelegate) {\n this.attributeObserver = new AttributeObserver(element, attributeName, this)\n this.delegate = delegate\n this.tokensByElement = new Multimap()\n }\n\n get started(): boolean {\n return this.attributeObserver.started\n }\n\n start() {\n this.attributeObserver.start()\n }\n\n pause(callback: () => void) {\n this.attributeObserver.pause(callback)\n }\n\n stop() {\n this.attributeObserver.stop()\n }\n\n refresh() {\n this.attributeObserver.refresh()\n }\n\n get element(): Element {\n return this.attributeObserver.element\n }\n\n get attributeName(): string {\n return this.attributeObserver.attributeName\n }\n\n // Attribute observer delegate\n\n elementMatchedAttribute(element: Element) {\n this.tokensMatched(this.readTokensForElement(element))\n }\n\n elementAttributeValueChanged(element: Element) {\n const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element)\n this.tokensUnmatched(unmatchedTokens)\n this.tokensMatched(matchedTokens)\n }\n\n elementUnmatchedAttribute(element: Element) {\n this.tokensUnmatched(this.tokensByElement.getValuesForKey(element))\n }\n\n private tokensMatched(tokens: Token[]) {\n tokens.forEach((token) => this.tokenMatched(token))\n }\n\n private tokensUnmatched(tokens: Token[]) {\n tokens.forEach((token) => this.tokenUnmatched(token))\n }\n\n private tokenMatched(token: Token) {\n this.delegate.tokenMatched(token)\n this.tokensByElement.add(token.element, token)\n }\n\n private tokenUnmatched(token: Token) {\n this.delegate.tokenUnmatched(token)\n this.tokensByElement.delete(token.element, token)\n }\n\n private refreshTokensForElement(element: Element): [Token[], Token[]] {\n const previousTokens = this.tokensByElement.getValuesForKey(element)\n const currentTokens = this.readTokensForElement(element)\n const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(\n ([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken)\n )\n\n if (firstDifferingIndex == -1) {\n return [[], []]\n } else {\n return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)]\n }\n }\n\n private readTokensForElement(element: Element): Token[] {\n const attributeName = this.attributeName\n const tokenString = element.getAttribute(attributeName) || \"\"\n return parseTokenString(tokenString, element, attributeName)\n }\n}\n\nfunction parseTokenString(tokenString: string, element: Element, attributeName: string): Token[] {\n return tokenString\n .trim()\n .split(/\\s+/)\n .filter((content) => content.length)\n .map((content, index) => ({ element, attributeName, content, index }))\n}\n\nfunction zip<L, R>(left: L[], right: R[]): [L | undefined, R | undefined][] {\n const length = Math.max(left.length, right.length)\n return Array.from({ length }, (_, index) => [left[index], right[index]] as [L, R])\n}\n\nfunction tokensAreEqual(left?: Token, right?: Token) {\n return left && right && left.index == right.index && left.content == right.content\n}\n","import { Token, TokenListObserver, TokenListObserverDelegate } from \"./token_list_observer\"\n\nexport interface ValueListObserverDelegate<T> {\n parseValueForToken(token: Token): T | undefined\n elementMatchedValue(element: Element, value: T): void\n elementUnmatchedValue(element: Element, value: T): void\n}\n\ninterface ParseResult<T> {\n value?: T\n error?: Error\n}\n\nexport class ValueListObserver<T> implements TokenListObserverDelegate {\n private tokenListObserver: TokenListObserver\n private delegate: ValueListObserverDelegate<T>\n private parseResultsByToken: WeakMap<Token, ParseResult<T>>\n private valuesByTokenByElement: WeakMap<Element, Map<Token, T>>\n\n constructor(element: Element, attributeName: string, delegate: ValueListObserverDelegate<T>) {\n this.tokenListObserver = new TokenListObserver(element, attributeName, this)\n this.delegate = delegate\n this.parseResultsByToken = new WeakMap()\n this.valuesByTokenByElement = new WeakMap()\n }\n\n get started(): boolean {\n return this.tokenListObserver.started\n }\n\n start() {\n this.tokenListObserver.start()\n }\n\n stop() {\n this.tokenListObserver.stop()\n }\n\n refresh() {\n this.tokenListObserver.refresh()\n }\n\n get element(): Element {\n return this.tokenListObserver.element\n }\n\n get attributeName(): string {\n return this.tokenListObserver.attributeName\n }\n\n tokenMatched(token: Token) {\n const { element } = token\n const { value } = this.fetchParseResultForToken(token)\n if (value) {\n this.fetchValuesByTokenForElement(element).set(token, value)\n this.delegate.elementMatchedValue(element, value)\n }\n }\n\n tokenUnmatched(token: Token) {\n const { element } = token\n const { value } = this.fetchParseResultForToken(token)\n if (value) {\n this.fetchValuesByTokenForElement(element).delete(token)\n this.delegate.elementUnmatchedValue(element, value)\n }\n }\n\n private fetchParseResultForToken(token: Token) {\n let parseResult = this.parseResultsByToken.get(token)\n if (!parseResult) {\n parseResult = this.parseToken(token)\n this.parseResultsByToken.set(token, parseResult)\n }\n return parseResult\n }\n\n private fetchValuesByTokenForElement(element: Element) {\n let valuesByToken = this.valuesByTokenByElement.get(element)\n if (!valuesByToken) {\n valuesByToken = new Map()\n this.valuesByTokenByElement.set(element, valuesByToken)\n }\n return valuesByToken\n }\n\n private parseToken(token: Token): ParseResult<T> {\n try {\n const value = this.delegate.parseValueForToken(token)\n return { value }\n } catch (error: any) {\n return { error }\n }\n }\n}\n","import { Action } from \"./action\"\nimport { Binding } from \"./binding\"\nimport { Context } from \"./context\"\nimport { ErrorHandler } from \"./error_handler\"\nimport { Schema } from \"./schema\"\nimport { Token, ValueListObserver, ValueListObserverDelegate } from \"../mutation-observers\"\n\nexport interface BindingObserverDelegate extends ErrorHandler {\n bindingConnected(binding: Binding): void\n bindingDisconnected(binding: Binding, clearEventListeners?: boolean): void\n}\n\nexport class BindingObserver implements ValueListObserverDelegate<Action> {\n readonly context: Context\n private delegate: BindingObserverDelegate\n private valueListObserver?: ValueListObserver<Action>\n private bindingsByAction: Map<Action, Binding>\n\n constructor(context: Context, delegate: BindingObserverDelegate) {\n this.context = context\n this.delegate = delegate\n this.bindingsByAction = new Map()\n }\n\n start() {\n if (!this.valueListObserver) {\n this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this)\n this.valueListObserver.start()\n }\n }\n\n stop() {\n if (this.valueListObserver) {\n this.valueListObserver.stop()\n delete this.valueListObserver\n this.disconnectAllActions()\n }\n }\n\n get element() {\n return this.context.element\n }\n\n get identifier() {\n return this.context.identifier\n }\n\n get actionAttribute() {\n return this.schema.actionAttribute\n }\n\n get schema(): Schema {\n return this.context.schema\n }\n\n get bindings(): Binding[] {\n return Array.from(this.bindingsByAction.values())\n }\n\n private connectAction(action: Action) {\n const binding = new Binding(this.context, action)\n this.bindingsByAction.set(action, binding)\n this.delegate.bindingConnected(binding)\n }\n\n private disconnectAction(action: Action) {\n const binding = this.bindingsByAction.get(action)\n if (binding) {\n this.bindingsByAction.delete(action)\n this.delegate.bindingDisconnected(binding)\n }\n }\n\n private disconnectAllActions() {\n this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true))\n this.bindingsByAction.clear()\n }\n\n // Value observer delegate\n\n parseValueForToken(token: Token): Action | undefined {\n const action = Action.forToken(token, this.schema)\n if (action.identifier == this.identifier) {\n return action\n }\n }\n\n elementMatchedValue(element: Element, action: Action) {\n this.connectAction(action)\n }\n\n elementUnmatchedValue(element: Element, action: Action) {\n this.disconnectAction(action)\n }\n}\n","import { Context } from \"./context\"\nimport { StringMapObserver, StringMapObserverDelegate } from \"../mutation-observers\"\nimport { ValueDescriptor } from \"./value_properties\"\nimport { capitalize } from \"./string_helpers\"\n\nexport class ValueObserver implements StringMapObserverDelegate {\n readonly context: Context\n readonly receiver: any\n private stringMapObserver: StringMapObserver\n private valueDescriptorMap: { [attributeName: string]: ValueDescriptor }\n\n constructor(context: Context, receiver: any) {\n this.context = context\n this.receiver = receiver\n this.stringMapObserver = new StringMapObserver(this.element, this)\n this.valueDescriptorMap = (this.controller as any).valueDescriptorMap\n }\n\n start() {\n this.stringMapObserver.start()\n this.invokeChangedCallbacksForDefaultValues()\n }\n\n stop() {\n this.stringMapObserver.stop()\n }\n\n get element() {\n return this.context.element\n }\n\n get controller() {\n return this.context.controller\n }\n\n // String map observer delegate\n\n getStringMapKeyForAttribute(attributeName: string) {\n if (attributeName in this.valueDescriptorMap) {\n return this.valueDescriptorMap[attributeName].name\n }\n }\n\n stringMapKeyAdded(key: string, attributeName: string) {\n const descriptor = this.valueDescriptorMap[attributeName]\n\n if (!this.hasValue(key)) {\n this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue))\n }\n }\n\n stringMapValueChanged(value: string, name: string, oldValue: string) {\n const descriptor = this.valueDescriptorNameMap[name]\n\n if (value === null) return\n\n if (oldValue === null) {\n oldValue = descriptor.writer(descriptor.defaultValue)\n }\n\n this.invokeChangedCallback(name, value, oldValue)\n }\n\n stringMapKeyRemoved(key: string, attributeName: string, oldValue: string) {\n const descriptor = this.valueDescriptorNameMap[key]\n\n if (this.hasValue(key)) {\n this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue)\n } else {\n this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue)\n }\n }\n\n private invokeChangedCallbacksForDefaultValues() {\n for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n if (defaultValue != undefined && !this.controller.data.has(key)) {\n this.invokeChangedCallback(name, writer(defaultValue), undefined)\n }\n }\n }\n\n private invokeChangedCallback(name: string, rawValue: string, rawOldValue: string | undefined) {\n const changedMethodName = `${name}Changed`\n const changedMethod = this.receiver[changedMethodName]\n\n if (typeof changedMethod == \"function\") {\n const descriptor = this.valueDescriptorNameMap[name]\n\n try {\n const value = descriptor.reader(rawValue)\n let oldValue = rawOldValue\n\n if (rawOldValue) {\n oldValue = descriptor.reader(rawOldValue)\n }\n\n changedMethod.call(this.receiver, value, oldValue)\n } catch (error) {\n if (error instanceof TypeError) {\n error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`\n }\n\n throw error\n }\n }\n }\n\n private get valueDescriptors() {\n const { valueDescriptorMap } = this\n return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key])\n }\n\n private get valueDescriptorNameMap() {\n const descriptors: { [type: string]: ValueDescriptor } = {}\n\n Object.keys(this.valueDescriptorMap).forEach((key) => {\n const descriptor = this.valueDescriptorMap[key]\n descriptors[descriptor.name] = descriptor\n })\n\n return descriptors\n }\n\n private hasValue(attributeName: string) {\n const descriptor = this.valueDescriptorNameMap[attributeName]\n const hasMethodName = `has${capitalize(descriptor.name)}`\n\n return this.receiver[hasMethodName]\n }\n}\n","import { Multimap } from \"../multimap\"\nimport { Token, TokenListObserver, TokenListObserverDelegate } from \"../mutation-observers\"\nimport { Context } from \"./context\"\n\nexport interface TargetObserverDelegate {\n targetConnected(element: Element, name: string): void\n targetDisconnected(element: Element, name: string): void\n}\n\nexport class TargetObserver implements TokenListObserverDelegate {\n readonly context: Context\n readonly delegate: TargetObserverDelegate\n readonly targetsByName: Multimap<string, Element>\n private tokenListObserver?: TokenListObserver\n\n constructor(context: Context, delegate: TargetObserverDelegate) {\n this.context = context\n this.delegate = delegate\n this.targetsByName = new Multimap()\n }\n\n start() {\n if (!this.tokenListObserver) {\n this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this)\n this.tokenListObserver.start()\n }\n }\n\n stop() {\n if (this.tokenListObserver) {\n this.disconnectAllTargets()\n this.tokenListObserver.stop()\n delete this.tokenListObserver\n }\n }\n\n // Token list observer delegate\n\n tokenMatched({ element, content: name }: Token) {\n if (this.scope.containsElement(element)) {\n this.connectTarget(element, name)\n }\n }\n\n tokenUnmatched({ element, content: name }: Token) {\n this.disconnectTarget(element, name)\n }\n\n // Target management\n\n connectTarget(element: Element, name: string) {\n if (!this.targetsByName.has(name, element)) {\n this.targetsByName.add(name, element)\n this.tokenListObserver?.pause(() => this.delegate.targetConnected(element, name))\n }\n }\n\n disconnectTarget(element: Element, name: string) {\n if (this.targetsByName.has(name, element)) {\n this.targetsByName.delete(name, element)\n this.tokenListObserver?.pause(() => this.delegate.targetDisconnected(element, name))\n }\n }\n\n disconnectAllTargets() {\n for (const name of this.targetsByName.keys) {\n for (const element of this.targetsByName.getValuesForKey(name)) {\n this.disconnectTarget(element, name)\n }\n }\n }\n\n // Private\n\n private get attributeName() {\n return `data-${this.context.identifier}-target`\n }\n\n private get element() {\n return this.context.element\n }\n\n private get scope() {\n return this.context.scope\n }\n}\n","import { Constructor } from \"./constructor\"\n\nexport function readInheritableStaticArrayValues<T, U = string>(constructor: Constructor<T>, propertyName: string) {\n const ancestors = getAncestorsForConstructor(constructor)\n return Array.from(\n ancestors.reduce((values, constructor) => {\n getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name))\n return values\n }, new Set() as Set<U>)\n )\n}\n\nexport function readInheritableStaticObjectPairs<T, U>(constructor: Constructor<T>, propertyName: string) {\n const ancestors = getAncestorsForConstructor(constructor)\n return ancestors.reduce((pairs, constructor) => {\n pairs.push(...(getOwnStaticObjectPairs(constructor, propertyName) as any))\n return pairs\n }, [] as [string, U][])\n}\n\nfunction getAncestorsForConstructor<T>(constructor: Constructor<T>) {\n const ancestors: Constructor<any>[] = []\n while (constructor) {\n ancestors.push(constructor)\n constructor = Object.getPrototypeOf(constructor)\n }\n return ancestors.reverse()\n}\n\nfunction getOwnStaticArrayValues<T>(constructor: Constructor<T>, propertyName: string) {\n const definition = (constructor as any)[propertyName]\n return Array.isArray(definition) ? definition : []\n}\n\nfunction getOwnStaticObjectPairs<T, U>(constructor: Constructor<T>, propertyName: string) {\n const definition = (constructor as any)[propertyName]\n return definition ? Object.keys(definition).map((key) => [key, definition[key]] as [string, U]) : []\n}\n","import { Multimap } from \"../multimap\"\nimport { SelectorObserver, SelectorObserverDelegate } from \"../mutation-observers\"\nimport { Context } from \"./context\"\nimport { Controller } from \"./controller\"\n\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\n\ntype SelectorObserverDetails = { outletName: string }\n\nexport interface OutletObserverDelegate {\n outletConnected(outlet: Controller, element: Element, outletName: string): void\n outletDisconnected(outlet: Controller, element: Element, outletName: string): void\n}\n\nexport class OutletObserver implements SelectorObserverDelegate {\n readonly context: Context\n readonly delegate: OutletObserverDelegate\n readonly outletsByName: Multimap<string, Controller>\n readonly outletElementsByName: Multimap<string, Element>\n private selectorObserverMap: Map<string, SelectorObserver>\n\n constructor(context: Context, delegate: OutletObserverDelegate) {\n this.context = context\n this.delegate = delegate\n this.outletsByName = new Multimap()\n this.outletElementsByName = new Multimap()\n this.selectorObserverMap = new Map()\n }\n\n start() {\n if (this.selectorObserverMap.size === 0) {\n this.outletDefinitions.forEach((outletName) => {\n const selector = this.selector(outletName)\n const details: SelectorObserverDetails = { outletName }\n\n if (selector) {\n this.selectorObserverMap.set(outletName, new SelectorObserver(document.body, selector, this, details))\n }\n })\n\n this.selectorObserverMap.forEach((observer) => observer.start())\n }\n\n this.dependentContexts.forEach((context) => context.refresh())\n }\n\n stop() {\n if (this.selectorObserverMap.size > 0) {\n this.disconnectAllOutlets()\n this.selectorObserverMap.forEach((observer) => observer.stop())\n this.selectorObserverMap.clear()\n }\n }\n\n refresh() {\n this.selectorObserverMap.forEach((observer) => observer.refresh())\n }\n\n // Selector observer delegate\n\n selectorMatched(element: Element, _selector: string, { outletName }: SelectorObserverDetails) {\n const outlet = this.getOutlet(element, outletName)\n\n if (outlet) {\n this.connectOutlet(outlet, element, outletName)\n }\n }\n\n selectorUnmatched(element: Element, _selector: string, { outletName }: SelectorObserverDetails) {\n const outlet = this.getOutletFromMap(element, outletName)\n\n if (outlet) {\n this.disconnectOutlet(outlet, element, outletName)\n }\n }\n\n selectorMatchElement(element: Element, { outletName }: SelectorObserverDetails) {\n return (\n this.hasOutlet(element, outletName) &&\n element.matches(`[${this.context.application.schema.controllerAttribute}~=${outletName}]`)\n )\n }\n\n // Outlet management\n\n connectOutlet(outlet: Controller, element: Element, outletName: string) {\n if (!this.outletElementsByName.has(outletName, element)) {\n this.outletsByName.add(outletName, outlet)\n this.outletElementsByName.add(outletName, element)\n this.selectorObserverMap.get(outletName)?.pause(() => this.delegate.outletConnected(outlet, element, outletName))\n }\n }\n\n disconnectOutlet(outlet: Controller, element: Element, outletName: string) {\n if (this.outletElementsByName.has(outletName, element)) {\n this.outletsByName.delete(outletName, outlet)\n this.outletElementsByName.delete(outletName, element)\n this.selectorObserverMap\n .get(outletName)\n ?.pause(() => this.delegate.outletDisconnected(outlet, element, outletName))\n }\n }\n\n disconnectAllOutlets() {\n for (const outletName of this.outletElementsByName.keys) {\n for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n this.disconnectOutlet(outlet, element, outletName)\n }\n }\n }\n }\n\n // Private\n\n private selector(outletName: string) {\n return this.scope.outlets.getSelectorForOutletName(outletName)\n }\n\n private get outletDependencies() {\n const dependencies = new Multimap<string, string>()\n\n this.router.modules.forEach((module) => {\n const constructor = module.definition.controllerConstructor\n const outlets = readInheritableStaticArrayValues(constructor, \"outlets\")\n\n outlets.forEach((outlet) => dependencies.add(outlet, module.identifier))\n })\n\n return dependencies\n }\n\n private get outletDefinitions() {\n return this.outletDependencies.getKeysForValue(this.identifier)\n }\n\n private get dependentControllerIdentifiers() {\n return this.outletDependencies.getValuesForKey(this.identifier)\n }\n\n private get dependentContexts() {\n const identifiers = this.dependentControllerIdentifiers\n return this.router.contexts.filter((context) => identifiers.includes(context.identifier))\n }\n\n private hasOutlet(element: Element, outletName: string) {\n return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName)\n }\n\n private getOutlet(element: Element, outletName: string) {\n return this.application.getControllerForElementAndIdentifier(element, outletName)\n }\n\n private getOutletFromMap(element: Element, outletName: string) {\n return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element)\n }\n\n private get scope() {\n return this.context.scope\n }\n\n private get identifier() {\n return this.context.identifier\n }\n\n private get application() {\n return this.context.application\n }\n\n private get router() {\n return this.application.router\n }\n}\n","import { Application } from \"./application\"\nimport { BindingObserver } from \"./binding_observer\"\nimport { Controller } from \"./controller\"\nimport { Dispatcher } from \"./dispatcher\"\nimport { ErrorHandler } from \"./error_handler\"\nimport { Module } from \"./module\"\nimport { Schema } from \"./schema\"\nimport { Scope } from \"./scope\"\nimport { ValueObserver } from \"./value_observer\"\nimport { TargetObserver, TargetObserverDelegate } from \"./target_observer\"\nimport { OutletObserver, OutletObserverDelegate } from \"./outlet_observer\"\nimport { namespaceCamelize } from \"./string_helpers\"\n\nexport class Context implements ErrorHandler, TargetObserverDelegate, OutletObserverDelegate {\n readonly module: Module\n readonly scope: Scope\n readonly controller: Controller\n private bindingObserver: BindingObserver\n private valueObserver: ValueObserver\n private targetObserver: TargetObserver\n private outletObserver: OutletObserver\n\n constructor(module: Module, scope: Scope) {\n this.module = module\n this.scope = scope\n this.controller = new module.controllerConstructor(this)\n this.bindingObserver = new BindingObserver(this, this.dispatcher)\n this.valueObserver = new ValueObserver(this, this.controller)\n this.targetObserver = new TargetObserver(this, this)\n this.outletObserver = new OutletObserver(this, this)\n\n try {\n this.controller.initialize()\n this.logDebugActivity(\"initialize\")\n } catch (error: any) {\n this.handleError(error, \"initializing controller\")\n }\n }\n\n connect() {\n this.bindingObserver.start()\n this.valueObserver.start()\n this.targetObserver.start()\n this.outletObserver.start()\n\n try {\n this.controller.connect()\n this.logDebugActivity(\"connect\")\n } catch (error: any) {\n this.handleError(error, \"connecting controller\")\n }\n }\n\n refresh() {\n this.outletObserver.refresh()\n }\n\n disconnect() {\n try {\n this.controller.disconnect()\n this.logDebugActivity(\"disconnect\")\n } catch (error: any) {\n this.handleError(error, \"disconnecting controller\")\n }\n\n this.outletObserver.stop()\n this.targetObserver.stop()\n this.valueObserver.stop()\n this.bindingObserver.stop()\n }\n\n get application(): Application {\n return this.module.application\n }\n\n get identifier(): string {\n return this.module.identifier\n }\n\n get schema(): Schema {\n return this.application.schema\n }\n\n get dispatcher(): Dispatcher {\n return this.application.dispatcher\n }\n\n get element(): Element {\n return this.scope.element\n }\n\n get parentElement(): Element | null {\n return this.element.parentElement\n }\n\n // Error handling\n\n handleError(error: Error, message: string, detail: object = {}) {\n const { identifier, controller, element } = this\n detail = Object.assign({ identifier, controller, element }, detail)\n this.application.handleError(error, `Error ${message}`, detail)\n }\n\n // Debug logging\n\n logDebugActivity = (functionName: string, detail: object = {}): void => {\n const { identifier, controller, element } = this\n detail = Object.assign({ identifier, controller, element }, detail)\n this.application.logDebugActivity(this.identifier, functionName, detail)\n }\n\n // Target observer delegate\n\n targetConnected(element: Element, name: string) {\n this.invokeControllerMethod(`${name}TargetConnected`, element)\n }\n\n targetDisconnected(element: Element, name: string) {\n this.invokeControllerMethod(`${name}TargetDisconnected`, element)\n }\n\n // Outlet observer delegate\n\n outletConnected(outlet: Controller, element: Element, name: string) {\n this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element)\n }\n\n outletDisconnected(outlet: Controller, element: Element, name: string) {\n this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element)\n }\n\n // Private\n\n invokeControllerMethod(methodName: string, ...args: any[]) {\n const controller: any = this.controller\n if (typeof controller[methodName] == \"function\") {\n controller[methodName](...args)\n }\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\n\nexport type Blessing<T> = (constructor: Constructor<T>) => PropertyDescriptorMap\n\nexport interface Blessable<T> extends Constructor<T> {\n readonly blessings?: Blessing<T>[]\n}\n\nexport function bless<T>(constructor: Blessable<T>): Constructor<T> {\n return shadow(constructor, getBlessedProperties(constructor))\n}\n\nfunction shadow<T>(constructor: Constructor<T>, properties: PropertyDescriptorMap) {\n const shadowConstructor = extend(constructor)\n const shadowProperties = getShadowProperties(constructor.prototype, properties)\n Object.defineProperties(shadowConstructor.prototype, shadowProperties)\n return shadowConstructor\n}\n\nfunction getBlessedProperties<T>(constructor: Constructor<T>) {\n const blessings = readInheritableStaticArrayValues(constructor, \"blessings\") as Blessing<T>[]\n return blessings.reduce((blessedProperties, blessing) => {\n const properties = blessing(constructor)\n for (const key in properties) {\n const descriptor = blessedProperties[key] || ({} as PropertyDescriptor)\n blessedProperties[key] = Object.assign(descriptor, properties[key])\n }\n return blessedProperties\n }, {} as PropertyDescriptorMap)\n}\n\nfunction getShadowProperties(prototype: any, properties: PropertyDescriptorMap) {\n return getOwnKeys(properties).reduce((shadowProperties, key) => {\n const descriptor = getShadowedDescriptor(prototype, properties, key)\n if (descriptor) {\n Object.assign(shadowProperties, { [key]: descriptor })\n }\n return shadowProperties\n }, {} as PropertyDescriptorMap)\n}\n\nfunction getShadowedDescriptor(prototype: any, properties: PropertyDescriptorMap, key: string | symbol) {\n const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key)\n const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor\n if (!shadowedByValue) {\n const descriptor = Object.getOwnPropertyDescriptor(properties, key)!.value\n if (shadowingDescriptor) {\n descriptor.get = shadowingDescriptor.get || descriptor.get\n descriptor.set = shadowingDescriptor.set || descriptor.set\n }\n return descriptor\n }\n}\n\nconst getOwnKeys = (() => {\n if (typeof Object.getOwnPropertySymbols == \"function\") {\n return (object: any) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)]\n } else {\n return Object.getOwnPropertyNames\n }\n})()\n\nconst extend = (() => {\n function extendWithReflect<T extends Constructor<any>>(constructor: T): T {\n function extended() {\n return Reflect.construct(constructor, arguments, new.target)\n }\n\n extended.prototype = Object.create(constructor.prototype, {\n constructor: { value: extended },\n })\n\n Reflect.setPrototypeOf(extended, constructor)\n return extended as any\n }\n\n function testReflectExtension() {\n const a = function (this: any) {\n this.a.call(this)\n } as any\n const b = extendWithReflect(a)\n b.prototype.a = function () {}\n return new b()\n }\n\n try {\n testReflectExtension()\n return extendWithReflect\n } catch (error: any) {\n return <T extends Constructor<any>>(constructor: T) => class extended extends constructor {}\n }\n})()\n","import { Application } from \"./application\"\nimport { Context } from \"./context\"\nimport { ControllerConstructor } from \"./controller\"\nimport { Definition, blessDefinition } from \"./definition\"\nimport { Scope } from \"./scope\"\n\nexport class Module {\n readonly application: Application\n readonly definition: Definition\n private contextsByScope: WeakMap<Scope, Context>\n private connectedContexts: Set<Context>\n\n constructor(application: Application, definition: Definition) {\n this.application = application\n this.definition = blessDefinition(definition)\n this.contextsByScope = new WeakMap()\n this.connectedContexts = new Set()\n }\n\n get identifier(): string {\n return this.definition.identifier\n }\n\n get controllerConstructor(): ControllerConstructor {\n return this.definition.controllerConstructor\n }\n\n get contexts(): Context[] {\n return Array.from(this.connectedContexts)\n }\n\n connectContextForScope(scope: Scope) {\n const context = this.fetchContextForScope(scope)\n this.connectedContexts.add(context)\n context.connect()\n }\n\n disconnectContextForScope(scope: Scope) {\n const context = this.contextsByScope.get(scope)\n if (context) {\n this.connectedContexts.delete(context)\n context.disconnect()\n }\n }\n\n private fetchContextForScope(scope: Scope): Context {\n let context = this.contextsByScope.get(scope)\n if (!context) {\n context = new Context(this, scope)\n this.contextsByScope.set(scope, context)\n }\n return context\n }\n}\n","import { bless } from \"./blessing\"\nimport { ControllerConstructor } from \"./controller\"\n\nexport interface Definition {\n identifier: string\n controllerConstructor: ControllerConstructor\n}\n\nexport function blessDefinition(definition: Definition): Definition {\n return {\n identifier: definition.identifier,\n controllerConstructor: bless(definition.controllerConstructor),\n }\n}\n","import { Scope } from \"./scope\"\nimport { tokenize } from \"./string_helpers\"\n\nexport class ClassMap {\n readonly scope: Scope\n\n constructor(scope: Scope) {\n this.scope = scope\n }\n\n has(name: string) {\n return this.data.has(this.getDataKey(name))\n }\n\n get(name: string): string | undefined {\n return this.getAll(name)[0]\n }\n\n getAll(name: string) {\n const tokenString = this.data.get(this.getDataKey(name)) || \"\"\n return tokenize(tokenString)\n }\n\n getAttributeName(name: string) {\n return this.data.getAttributeNameForKey(this.getDataKey(name))\n }\n\n getDataKey(name: string) {\n return `${name}-class`\n }\n\n get data() {\n return this.scope.data\n }\n}\n","import { Scope } from \"./scope\"\nimport { dasherize } from \"./string_helpers\"\n\nexport class DataMap {\n readonly scope: Scope\n\n constructor(scope: Scope) {\n this.scope = scope\n }\n\n get element(): Element {\n return this.scope.element\n }\n\n get identifier(): string {\n return this.scope.identifier\n }\n\n get(key: string): string | null {\n const name = this.getAttributeNameForKey(key)\n return this.element.getAttribute(name)\n }\n\n set(key: string, value: string): string | null {\n const name = this.getAttributeNameForKey(key)\n this.element.setAttribute(name, value)\n return this.get(key)\n }\n\n has(key: string): boolean {\n const name = this.getAttributeNameForKey(key)\n return this.element.hasAttribute(name)\n }\n\n delete(key: string): boolean {\n if (this.has(key)) {\n const name = this.getAttributeNameForKey(key)\n this.element.removeAttribute(name)\n return true\n } else {\n return false\n }\n }\n\n getAttributeNameForKey(key: string): string {\n return `data-${this.identifier}-${dasherize(key)}`\n }\n}\n","import { Logger } from \"./logger\"\n\nexport class Guide {\n readonly logger: Logger\n readonly warnedKeysByObject: WeakMap<any, Set<string>> = new WeakMap()\n\n constructor(logger: Logger) {\n this.logger = logger\n }\n\n warn(object: any, key: string, message: string) {\n let warnedKeys: Set<string> | undefined = this.warnedKeysByObject.get(object)\n\n if (!warnedKeys) {\n warnedKeys = new Set()\n this.warnedKeysByObject.set(object, warnedKeys)\n }\n\n if (!warnedKeys.has(key)) {\n warnedKeys.add(key)\n this.logger.warn(message, object)\n }\n }\n}\n","export function attributeValueContainsToken(attributeName: string, token: string) {\n return `[${attributeName}~=\"${token}\"]`\n}\n","import { Scope } from \"./scope\"\nimport { attributeValueContainsToken } from \"./selectors\"\n\nexport class TargetSet {\n readonly scope: Scope\n\n constructor(scope: Scope) {\n this.scope = scope\n }\n\n get element() {\n return this.scope.element\n }\n\n get identifier() {\n return this.scope.identifier\n }\n\n get schema() {\n return this.scope.schema\n }\n\n has(targetName: string) {\n return this.find(targetName) != null\n }\n\n find(...targetNames: string[]) {\n return targetNames.reduce(\n (target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName),\n undefined as Element | undefined\n )\n }\n\n findAll(...targetNames: string[]) {\n return targetNames.reduce(\n (targets, targetName) => [\n ...targets,\n ...this.findAllTargets(targetName),\n ...this.findAllLegacyTargets(targetName),\n ],\n [] as Element[]\n )\n }\n\n private findTarget(targetName: string) {\n const selector = this.getSelectorForTargetName(targetName)\n return this.scope.findElement(selector)\n }\n\n private findAllTargets(targetName: string) {\n const selector = this.getSelectorForTargetName(targetName)\n return this.scope.findAllElements(selector)\n }\n\n private getSelectorForTargetName(targetName: string) {\n const attributeName = this.schema.targetAttributeForScope(this.identifier)\n return attributeValueContainsToken(attributeName, targetName)\n }\n\n private findLegacyTarget(targetName: string) {\n const selector = this.getLegacySelectorForTargetName(targetName)\n return this.deprecate(this.scope.findElement(selector), targetName)\n }\n\n private findAllLegacyTargets(targetName: string) {\n const selector = this.getLegacySelectorForTargetName(targetName)\n return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName))\n }\n\n private getLegacySelectorForTargetName(targetName: string) {\n const targetDescriptor = `${this.identifier}.${targetName}`\n return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor)\n }\n\n private deprecate<T>(element: T, targetName: string) {\n if (element) {\n const { identifier } = this\n const attributeName = this.schema.targetAttribute\n const revisedAttributeName = this.schema.targetAttributeForScope(identifier)\n this.guide.warn(\n element,\n `target:${targetName}`,\n `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`\n )\n }\n return element\n }\n\n private get guide() {\n return this.scope.guide\n }\n}\n","import { Scope } from \"./scope\"\n\nexport class OutletSet {\n readonly scope: Scope\n readonly controllerElement: Element\n\n constructor(scope: Scope, controllerElement: Element) {\n this.scope = scope\n this.controllerElement = controllerElement\n }\n\n get element() {\n return this.scope.element\n }\n\n get identifier() {\n return this.scope.identifier\n }\n\n get schema() {\n return this.scope.schema\n }\n\n has(outletName: string) {\n return this.find(outletName) != null\n }\n\n find(...outletNames: string[]) {\n return outletNames.reduce(\n (outlet, outletName) => outlet || this.findOutlet(outletName),\n undefined as Element | undefined\n )\n }\n\n findAll(...outletNames: string[]) {\n return outletNames.reduce(\n (outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)],\n [] as Element[]\n )\n }\n\n getSelectorForOutletName(outletName: string) {\n const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName)\n return this.controllerElement.getAttribute(attributeName)\n }\n\n private findOutlet(outletName: string) {\n const selector = this.getSelectorForOutletName(outletName)\n if (selector) return this.findElement(selector, outletName)\n }\n\n private findAllOutlets(outletName: string) {\n const selector = this.getSelectorForOutletName(outletName)\n return selector ? this.findAllElements(selector, outletName) : []\n }\n\n private findElement(selector: string, outletName: string): Element | undefined {\n const elements = this.scope.queryElements(selector)\n return elements.filter((element) => this.matchesElement(element, selector, outletName))[0]\n }\n\n private findAllElements(selector: string, outletName: string): Element[] {\n const elements = this.scope.queryElements(selector)\n return elements.filter((element) => this.matchesElement(element, selector, outletName))\n }\n\n private matchesElement(element: Element, selector: string, outletName: string): boolean {\n const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\"\n return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName)\n }\n}\n","import { ClassMap } from \"./class_map\"\nimport { DataMap } from \"./data_map\"\nimport { Guide } from \"./guide\"\nimport { Logger } from \"./logger\"\nimport { Schema } from \"./schema\"\nimport { attributeValueContainsToken } from \"./selectors\"\nimport { TargetSet } from \"./target_set\"\nimport { OutletSet } from \"./outlet_set\"\n\nexport class Scope {\n readonly schema: Schema\n readonly element: Element\n readonly identifier: string\n readonly guide: Guide\n readonly outlets: OutletSet\n readonly targets = new TargetSet(this)\n readonly classes = new ClassMap(this)\n readonly data = new DataMap(this)\n\n constructor(schema: Schema, element: Element, identifier: string, logger: Logger) {\n this.schema = schema\n this.element = element\n this.identifier = identifier\n this.guide = new Guide(logger)\n this.outlets = new OutletSet(this.documentScope, element)\n }\n\n findElement(selector: string): Element | undefined {\n return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement)\n }\n\n findAllElements(selector: string): Element[] {\n return [\n ...(this.element.matches(selector) ? [this.element] : []),\n ...this.queryElements(selector).filter(this.containsElement),\n ]\n }\n\n containsElement = (element: Element): boolean => {\n return element.closest(this.controllerSelector) === this.element\n }\n\n queryElements(selector: string): Element[] {\n return Array.from(this.element.querySelectorAll(selector))\n }\n\n private get controllerSelector(): string {\n return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier)\n }\n\n private get isDocumentScope() {\n return this.element === document.documentElement\n }\n\n private get documentScope(): Scope {\n return this.isDocumentScope\n ? this\n : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger)\n }\n}\n","import { ErrorHandler } from \"./error_handler\"\nimport { Schema } from \"./schema\"\nimport { Scope } from \"./scope\"\nimport { Token, ValueListObserver, ValueListObserverDelegate } from \"../mutation-observers\"\n\nexport interface ScopeObserverDelegate extends ErrorHandler {\n createScopeForElementAndIdentifier(element: Element, identifier: string): Scope\n scopeConnected(scope: Scope): void\n scopeDisconnected(scope: Scope): void\n}\n\nexport class ScopeObserver implements ValueListObserverDelegate<Scope> {\n readonly element: Element\n readonly schema: Schema\n private delegate: ScopeObserverDelegate\n private valueListObserver: ValueListObserver<Scope>\n private scopesByIdentifierByElement: WeakMap<Element, Map<string, Scope>>\n private scopeReferenceCounts: WeakMap<Scope, number>\n\n constructor(element: Element, schema: Schema, delegate: ScopeObserverDelegate) {\n this.element = element\n this.schema = schema\n this.delegate = delegate\n this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this)\n this.scopesByIdentifierByElement = new WeakMap()\n this.scopeReferenceCounts = new WeakMap()\n }\n\n start() {\n this.valueListObserver.start()\n }\n\n stop() {\n this.valueListObserver.stop()\n }\n\n get controllerAttribute() {\n return this.schema.controllerAttribute\n }\n\n // Value observer delegate\n\n parseValueForToken(token: Token): Scope | undefined {\n const { element, content: identifier } = token\n const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element)\n\n let scope = scopesByIdentifier.get(identifier)\n if (!scope) {\n scope = this.delegate.createScopeForElementAndIdentifier(element, identifier)\n scopesByIdentifier.set(identifier, scope)\n }\n\n return scope\n }\n\n elementMatchedValue(element: Element, value: Scope) {\n const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1\n this.scopeReferenceCounts.set(value, referenceCount)\n if (referenceCount == 1) {\n this.delegate.scopeConnected(value)\n }\n }\n\n elementUnmatchedValue(element: Element, value: Scope) {\n const referenceCount = this.scopeReferenceCounts.get(value)\n if (referenceCount) {\n this.scopeReferenceCounts.set(value, referenceCount - 1)\n if (referenceCount == 1) {\n this.delegate.scopeDisconnected(value)\n }\n }\n }\n\n private fetchScopesByIdentifierForElement(element: Element) {\n let scopesByIdentifier = this.scopesByIdentifierByElement.get(element)\n if (!scopesByIdentifier) {\n scopesByIdentifier = new Map()\n this.scopesByIdentifierByElement.set(element, scopesByIdentifier)\n }\n return scopesByIdentifier\n }\n}\n","import { Application } from \"./application\"\nimport { Context } from \"./context\"\nimport { Definition } from \"./definition\"\nimport { Module } from \"./module\"\nimport { Multimap } from \"../multimap\"\nimport { Scope } from \"./scope\"\nimport { ScopeObserver, ScopeObserverDelegate } from \"./scope_observer\"\n\nexport class Router implements ScopeObserverDelegate {\n readonly application: Application\n private scopeObserver: ScopeObserver\n private scopesByIdentifier: Multimap<string, Scope>\n private modulesByIdentifier: Map<string, Module>\n\n constructor(application: Application) {\n this.application = application\n this.scopeObserver = new ScopeObserver(this.element, this.schema, this)\n this.scopesByIdentifier = new Multimap()\n this.modulesByIdentifier = new Map()\n }\n\n get element() {\n return this.application.element\n }\n\n get schema() {\n return this.application.schema\n }\n\n get logger() {\n return this.application.logger\n }\n\n get controllerAttribute(): string {\n return this.schema.controllerAttribute\n }\n\n get modules() {\n return Array.from(this.modulesByIdentifier.values())\n }\n\n get contexts() {\n return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), [] as Context[])\n }\n\n start() {\n this.scopeObserver.start()\n }\n\n stop() {\n this.scopeObserver.stop()\n }\n\n loadDefinition(definition: Definition) {\n this.unloadIdentifier(definition.identifier)\n const module = new Module(this.application, definition)\n this.connectModule(module)\n const afterLoad = (definition.controllerConstructor as any).afterLoad\n if (afterLoad) {\n afterLoad(definition.identifier, this.application)\n }\n }\n\n unloadIdentifier(identifier: string) {\n const module = this.modulesByIdentifier.get(identifier)\n if (module) {\n this.disconnectModule(module)\n }\n }\n\n getContextForElementAndIdentifier(element: Element, identifier: string) {\n const module = this.modulesByIdentifier.get(identifier)\n if (module) {\n return module.contexts.find((context) => context.element == element)\n }\n }\n\n // Error handler delegate\n\n handleError(error: Error, message: string, detail: any) {\n this.application.handleError(error, message, detail)\n }\n\n // Scope observer delegate\n\n createScopeForElementAndIdentifier(element: Element, identifier: string) {\n return new Scope(this.schema, element, identifier, this.logger)\n }\n\n scopeConnected(scope: Scope) {\n this.scopesByIdentifier.add(scope.identifier, scope)\n const module = this.modulesByIdentifier.get(scope.identifier)\n if (module) {\n module.connectContextForScope(scope)\n }\n }\n\n scopeDisconnected(scope: Scope) {\n this.scopesByIdentifier.delete(scope.identifier, scope)\n const module = this.modulesByIdentifier.get(scope.identifier)\n if (module) {\n module.disconnectContextForScope(scope)\n }\n }\n\n // Modules\n\n private connectModule(module: Module) {\n this.modulesByIdentifier.set(module.identifier, module)\n const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier)\n scopes.forEach((scope) => module.connectContextForScope(scope))\n }\n\n private disconnectModule(module: Module) {\n this.modulesByIdentifier.delete(module.identifier)\n const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier)\n scopes.forEach((scope) => module.disconnectContextForScope(scope))\n }\n}\n","export interface Schema {\n controllerAttribute: string\n actionAttribute: string\n targetAttribute: string\n targetAttributeForScope(identifier: string): string\n outletAttributeForScope(identifier: string, outlet: string): string\n keyMappings: { [key: string]: string }\n}\n\nexport const defaultSchema: Schema = {\n controllerAttribute: \"data-controller\",\n actionAttribute: \"data-action\",\n targetAttribute: \"data-target\",\n targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n keyMappings: {\n enter: \"Enter\",\n tab: \"Tab\",\n esc: \"Escape\",\n space: \" \",\n up: \"ArrowUp\",\n down: \"ArrowDown\",\n left: \"ArrowLeft\",\n right: \"ArrowRight\",\n home: \"Home\",\n end: \"End\",\n // [a-z]\n ...objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c])),\n // [0-9]\n ...objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n])),\n },\n}\n\nfunction objectFromEntries(array: [string, any][]): object {\n // polyfill\n return array.reduce((memo, [k, v]) => ({ ...memo, [k]: v }), {})\n}\n","import { Controller, ControllerConstructor } from \"./controller\"\nimport { Definition } from \"./definition\"\nimport { Dispatcher } from \"./dispatcher\"\nimport { ErrorHandler } from \"./error_handler\"\nimport { Logger } from \"./logger\"\nimport { Router } from \"./router\"\nimport { Schema, defaultSchema } from \"./schema\"\nimport { ActionDescriptorFilter, ActionDescriptorFilters, defaultActionDescriptorFilters } from \"./action_descriptor\"\n\nexport class Application implements ErrorHandler {\n readonly element: Element\n readonly schema: Schema\n readonly dispatcher: Dispatcher\n readonly router: Router\n readonly actionDescriptorFilters: ActionDescriptorFilters\n logger: Logger = console\n debug = false\n\n static start(element?: Element, schema?: Schema): Application {\n const application = new this(element, schema)\n application.start()\n return application\n }\n\n constructor(element: Element = document.documentElement, schema: Schema = defaultSchema) {\n this.element = element\n this.schema = schema\n this.dispatcher = new Dispatcher(this)\n this.router = new Router(this)\n this.actionDescriptorFilters = { ...defaultActionDescriptorFilters }\n }\n\n async start() {\n await domReady()\n this.logDebugActivity(\"application\", \"starting\")\n this.dispatcher.start()\n this.router.start()\n this.logDebugActivity(\"application\", \"start\")\n }\n\n stop() {\n this.logDebugActivity(\"application\", \"stopping\")\n this.dispatcher.stop()\n this.router.stop()\n this.logDebugActivity(\"application\", \"stop\")\n }\n\n register(identifier: string, controllerConstructor: ControllerConstructor) {\n this.load({ identifier, controllerConstructor })\n }\n\n registerActionOption(name: string, filter: ActionDescriptorFilter) {\n this.actionDescriptorFilters[name] = filter\n }\n\n load(...definitions: Definition[]): void\n load(definitions: Definition[]): void\n load(head: Definition | Definition[], ...rest: Definition[]) {\n const definitions = Array.isArray(head) ? head : [head, ...rest]\n definitions.forEach((definition) => {\n if ((definition.controllerConstructor as any).shouldLoad) {\n this.router.loadDefinition(definition)\n }\n })\n }\n\n unload(...identifiers: string[]): void\n unload(identifiers: string[]): void\n unload(head: string | string[], ...rest: string[]) {\n const identifiers = Array.isArray(head) ? head : [head, ...rest]\n identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier))\n }\n\n // Controllers\n\n get controllers(): Controller[] {\n return this.router.contexts.map((context) => context.controller)\n }\n\n getControllerForElementAndIdentifier(element: Element, identifier: string): Controller | null {\n const context = this.router.getContextForElementAndIdentifier(element, identifier)\n return context ? context.controller : null\n }\n\n // Error handling\n\n handleError(error: Error, message: string, detail: object) {\n this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail)\n\n window.onerror?.(message, \"\", 0, 0, error)\n }\n\n // Debug logging\n\n logDebugActivity = (identifier: string, functionName: string, detail: object = {}): void => {\n if (this.debug) {\n this.logFormattedMessage(identifier, functionName, detail)\n }\n }\n\n private logFormattedMessage(identifier: string, functionName: string, detail: object = {}) {\n detail = Object.assign({ application: this }, detail)\n\n this.logger.groupCollapsed(`${identifier} #${functionName}`)\n this.logger.log(\"details:\", { ...detail })\n this.logger.groupEnd()\n }\n}\n\nfunction domReady() {\n return new Promise<void>((resolve) => {\n if (document.readyState == \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => resolve())\n } else {\n resolve()\n }\n })\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticObjectPairs } from \"./inheritable_statics\"\nimport { camelize, capitalize, dasherize } from \"./string_helpers\"\n\nexport function ValuePropertiesBlessing<T>(constructor: Constructor<T>) {\n const valueDefinitionPairs = readInheritableStaticObjectPairs<T, ValueTypeDefinition>(constructor, \"values\")\n const propertyDescriptorMap: PropertyDescriptorMap = {\n valueDescriptorMap: {\n get(this: Controller) {\n return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier)\n const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key)\n return Object.assign(result, { [attributeName]: valueDescriptor })\n }, {} as ValueDescriptorMap)\n },\n },\n }\n\n return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair))\n }, propertyDescriptorMap)\n}\n\nexport function propertiesForValueDefinitionPair<T>(\n valueDefinitionPair: ValueDefinitionPair,\n controller?: string\n): PropertyDescriptorMap {\n const definition = parseValueDefinitionPair(valueDefinitionPair, controller)\n const { key, name, reader: read, writer: write } = definition\n\n return {\n [name]: {\n get(this: Controller) {\n const value = this.data.get(key)\n if (value !== null) {\n return read(value)\n } else {\n return definition.defaultValue\n }\n },\n\n set(this: Controller, value: T | undefined) {\n if (value === undefined) {\n this.data.delete(key)\n } else {\n this.data.set(key, write(value))\n }\n },\n },\n\n [`has${capitalize(name)}`]: {\n get(this: Controller): boolean {\n return this.data.has(key) || definition.hasCustomDefaultValue\n },\n },\n }\n}\n\nexport type ValueDescriptor = {\n type: ValueType\n key: string\n name: string\n defaultValue: ValueTypeDefault\n hasCustomDefaultValue: boolean\n reader: Reader\n writer: Writer\n}\n\nexport type ValueDescriptorMap = { [attributeName: string]: ValueDescriptor }\n\nexport type ValueDefinitionMap = { [token: string]: ValueTypeDefinition }\n\nexport type ValueDefinitionPair = [string, ValueTypeDefinition]\n\nexport type ValueTypeConstant = typeof Array | typeof Boolean | typeof Number | typeof Object | typeof String\n\nexport type ValueTypeDefault = Array<any> | boolean | number | Object | string\n\nexport type ValueTypeObject = { type: ValueTypeConstant; default: ValueTypeDefault }\n\nexport type ValueTypeDefinition = ValueTypeConstant | ValueTypeDefault | ValueTypeObject\n\nexport type ValueType = \"array\" | \"boolean\" | \"number\" | \"object\" | \"string\"\n\nfunction parseValueDefinitionPair([token, typeDefinition]: ValueDefinitionPair, controller?: string): ValueDescriptor {\n return valueDescriptorForTokenAndTypeDefinition({\n controller,\n token,\n typeDefinition,\n })\n}\n\nfunction parseValueTypeConstant(constant: ValueTypeConstant) {\n switch (constant) {\n case Array:\n return \"array\"\n case Boolean:\n return \"boolean\"\n case Number:\n return \"number\"\n case Object:\n return \"object\"\n case String:\n return \"string\"\n }\n}\n\nfunction parseValueTypeDefault(defaultValue: ValueTypeDefault) {\n switch (typeof defaultValue) {\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return \"number\"\n case \"string\":\n return \"string\"\n }\n\n if (Array.isArray(defaultValue)) return \"array\"\n if (Object.prototype.toString.call(defaultValue) === \"[object Object]\") return \"object\"\n}\n\nfunction parseValueTypeObject(payload: { controller?: string; token: string; typeObject: ValueTypeObject }) {\n const typeFromObject = parseValueTypeConstant(payload.typeObject.type)\n\n if (!typeFromObject) return\n\n const defaultValueType = parseValueTypeDefault(payload.typeObject.default)\n\n if (typeFromObject !== defaultValueType) {\n const propertyPath = payload.controller ? `${payload.controller}.${payload.token}` : payload.token\n\n throw new Error(\n `The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${payload.typeObject.default}\" is of type \"${defaultValueType}\".`\n )\n }\n\n return typeFromObject\n}\n\nfunction parseValueTypeDefinition(payload: {\n controller?: string\n token: string\n typeDefinition: ValueTypeDefinition\n}): ValueType {\n const typeFromObject = parseValueTypeObject({\n controller: payload.controller,\n token: payload.token,\n typeObject: payload.typeDefinition as ValueTypeObject,\n })\n const typeFromDefaultValue = parseValueTypeDefault(payload.typeDefinition as ValueTypeDefault)\n const typeFromConstant = parseValueTypeConstant(payload.typeDefinition as ValueTypeConstant)\n\n const type = typeFromObject || typeFromDefaultValue || typeFromConstant\n\n if (type) return type\n\n const propertyPath = payload.controller ? `${payload.controller}.${payload.typeDefinition}` : payload.token\n\n throw new Error(`Unknown value type \"${propertyPath}\" for \"${payload.token}\" value`)\n}\n\nfunction defaultValueForDefinition(typeDefinition: ValueTypeDefinition): ValueTypeDefault {\n const constant = parseValueTypeConstant(typeDefinition as ValueTypeConstant)\n\n if (constant) return defaultValuesByType[constant]\n\n const defaultValue = (typeDefinition as ValueTypeObject).default\n if (defaultValue !== undefined) return defaultValue\n\n return typeDefinition\n}\n\nfunction valueDescriptorForTokenAndTypeDefinition(payload: {\n token: string\n typeDefinition: ValueTypeDefinition\n controller?: string\n}) {\n const key = `${dasherize(payload.token)}-value`\n const type = parseValueTypeDefinition(payload)\n return {\n type,\n key,\n name: camelize(key),\n get defaultValue() {\n return defaultValueForDefinition(payload.typeDefinition)\n },\n get hasCustomDefaultValue() {\n return parseValueTypeDefault(payload.typeDefinition) !== undefined\n },\n reader: readers[type],\n writer: writers[type] || writers.default,\n }\n}\n\nconst defaultValuesByType = {\n get array() {\n return []\n },\n boolean: false,\n number: 0,\n get object() {\n return {}\n },\n string: \"\",\n}\n\ntype Reader = (value: string) => any\n\nconst readers: { [type: string]: Reader } = {\n array(value: string): any[] {\n const array = JSON.parse(value)\n if (!Array.isArray(array)) {\n throw new TypeError(\n `expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`\n )\n }\n return array\n },\n\n boolean(value: string): boolean {\n return !(value == \"0\" || String(value).toLowerCase() == \"false\")\n },\n\n number(value: string): number {\n return Number(value)\n },\n\n object(value: string): object {\n const object = JSON.parse(value)\n if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n throw new TypeError(\n `expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`\n )\n }\n return object\n },\n\n string(value: string): string {\n return value\n },\n}\n\ntype Writer = (value: any) => string\n\nconst writers: { [type: string]: Writer } = {\n default: writeString,\n array: writeJSON,\n object: writeJSON,\n}\n\nfunction writeJSON(value: any) {\n return JSON.stringify(value)\n}\n\nfunction writeString(value: any) {\n return `${value}`\n}\n","import { Application } from \"./application\"\nimport { ClassPropertiesBlessing } from \"./class_properties\"\nimport { Constructor } from \"./constructor\"\nimport { Context } from \"./context\"\nimport { OutletPropertiesBlessing } from \"./outlet_properties\"\nimport { TargetPropertiesBlessing } from \"./target_properties\"\nimport { ValuePropertiesBlessing, ValueDefinitionMap } from \"./value_properties\"\n\nexport type ControllerConstructor = Constructor<Controller>\n\nexport class Controller<ElementType extends Element = Element> {\n static blessings = [\n ClassPropertiesBlessing,\n TargetPropertiesBlessing,\n ValuePropertiesBlessing,\n OutletPropertiesBlessing,\n ]\n static targets: string[] = []\n static outlets: string[] = []\n static values: ValueDefinitionMap = {}\n\n static get shouldLoad() {\n return true\n }\n\n static afterLoad(_identifier: string, _application: Application) {\n return\n }\n\n readonly context: Context\n\n constructor(context: Context) {\n this.context = context\n }\n\n get application() {\n return this.context.application\n }\n\n get scope() {\n return this.context.scope\n }\n\n get element() {\n return this.scope.element as ElementType\n }\n\n get identifier() {\n return this.scope.identifier\n }\n\n get targets() {\n return this.scope.targets\n }\n\n get outlets() {\n return this.scope.outlets\n }\n\n get classes() {\n return this.scope.classes\n }\n\n get data() {\n return this.scope.data\n }\n\n initialize() {\n // Override in your subclass to set up initial controller state\n }\n\n connect() {\n // Override in your subclass to respond when the controller is connected to the DOM\n }\n\n disconnect() {\n // Override in your subclass to respond when the controller is disconnected from the DOM\n }\n\n dispatch(\n eventName: string,\n { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true } = {}\n ) {\n const type = prefix ? `${prefix}:${eventName}` : eventName\n const event = new CustomEvent(type, { detail, bubbles, cancelable })\n target.dispatchEvent(event)\n return event\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\nimport { capitalize } from \"./string_helpers\"\n\nexport function ClassPropertiesBlessing<T>(constructor: Constructor<T>) {\n const classes = readInheritableStaticArrayValues(constructor, \"classes\")\n return classes.reduce((properties, classDefinition) => {\n return Object.assign(properties, propertiesForClassDefinition(classDefinition))\n }, {} as PropertyDescriptorMap)\n}\n\nfunction propertiesForClassDefinition(key: string) {\n return {\n [`${key}Class`]: {\n get(this: Controller) {\n const { classes } = this\n if (classes.has(key)) {\n return classes.get(key)\n } else {\n const attribute = classes.getAttributeName(key)\n throw new Error(`Missing attribute \"${attribute}\"`)\n }\n },\n },\n\n [`${key}Classes`]: {\n get(this: Controller) {\n return this.classes.getAll(key)\n },\n },\n\n [`has${capitalize(key)}Class`]: {\n get(this: Controller) {\n return this.classes.has(key)\n },\n },\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\nimport { capitalize } from \"./string_helpers\"\n\nexport function TargetPropertiesBlessing<T>(constructor: Constructor<T>) {\n const targets = readInheritableStaticArrayValues(constructor, \"targets\")\n return targets.reduce((properties, targetDefinition) => {\n return Object.assign(properties, propertiesForTargetDefinition(targetDefinition))\n }, {} as PropertyDescriptorMap)\n}\n\nfunction propertiesForTargetDefinition(name: string) {\n return {\n [`${name}Target`]: {\n get(this: Controller) {\n const target = this.targets.find(name)\n if (target) {\n return target\n } else {\n throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`)\n }\n },\n },\n\n [`${name}Targets`]: {\n get(this: Controller) {\n return this.targets.findAll(name)\n },\n },\n\n [`has${capitalize(name)}Target`]: {\n get(this: Controller) {\n return this.targets.has(name)\n },\n },\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\nimport { capitalize, namespaceCamelize } from \"./string_helpers\"\n\nexport function OutletPropertiesBlessing<T>(constructor: Constructor<T>) {\n const outlets = readInheritableStaticArrayValues(constructor, \"outlets\")\n return outlets.reduce((properties: any, outletDefinition: any) => {\n return Object.assign(properties, propertiesForOutletDefinition(outletDefinition))\n }, {} as PropertyDescriptorMap)\n}\n\nfunction propertiesForOutletDefinition(name: string) {\n const camelizedName = namespaceCamelize(name)\n\n return {\n [`${camelizedName}Outlet`]: {\n get(this: Controller) {\n const outlet = this.outlets.find(name)\n\n if (outlet) {\n const outletController = this.application.getControllerForElementAndIdentifier(outlet, name)\n if (outletController) {\n return outletController\n } else {\n throw new Error(\n `Missing \"data-controller=${name}\" attribute on outlet element for \"${this.identifier}\" controller`\n )\n }\n }\n\n throw new Error(`Missing outlet element \"${name}\" for \"${this.identifier}\" controller`)\n },\n },\n\n [`${camelizedName}Outlets`]: {\n get(this: Controller) {\n const outlets = this.outlets.findAll(name)\n\n if (outlets.length > 0) {\n return outlets\n .map((outlet: Element) => {\n const controller = this.application.getControllerForElementAndIdentifier(outlet, name)\n if (controller) {\n return controller\n } else {\n console.warn(\n `The provided outlet element is missing the outlet controller \"${name}\" for \"${this.identifier}\"`,\n outlet\n )\n }\n })\n .filter((controller) => controller) as Controller[]\n }\n\n return []\n },\n },\n\n [`${camelizedName}OutletElement`]: {\n get(this: Controller) {\n const outlet = this.outlets.find(name)\n if (outlet) {\n return outlet\n } else {\n throw new Error(`Missing outlet element \"${name}\" for \"${this.identifier}\" controller`)\n }\n },\n },\n\n [`${camelizedName}OutletElements`]: {\n get(this: Controller) {\n return this.outlets.findAll(name)\n },\n },\n\n [`has${capitalize(camelizedName)}Outlet`]: {\n get(this: Controller) {\n return this.outlets.has(name)\n },\n },\n }\n}\n"],"names":["EventListener","constructor","eventTarget","eventName","eventOptions","this","unorderedBindings","Set","connect","addEventListener","disconnect","removeEventListener","bindingConnected","binding","add","bindingDisconnected","delete","handleEvent","event","extendedEvent","stopImmediatePropagation","Object","assign","immediatePropagationStopped","call","extendEvent","bindings","hasBindings","size","Array","from","sort","left","right","leftIndex","index","rightIndex","Dispatcher","application","eventListenerMaps","Map","started","start","eventListeners","forEach","eventListener","stop","values","reduce","listeners","map","concat","fetchEventListenerForBinding","clearEventListeners","clearEventListenersForBinding","handleError","error","message","detail","removeMappedEventListenerFor","eventListenerMap","fetchEventListenerMapForEventTarget","cacheKey","fetchEventListener","get","createEventListener","set","parts","keys","key","push","join","defaultActionDescriptorFilters","value","stopPropagation","prevent","preventDefault","self","element","target","descriptorPattern","parseEventTarget","eventTargetName","window","document","camelize","replace","_","char","toUpperCase","namespaceCamelize","capitalize","charAt","slice","dasherize","toLowerCase","defaultEventNames","a","button","form","details","input","e","getAttribute","select","textarea","Error","typecast","JSON","parse","o_O","Binding","context","action","identifier","willBeInvokedByEvent","applyEventModifiers","invokeWithEvent","method","controller","methodName","actionDescriptorFilters","passes","name","entries","filter","currentTarget","params","actionEvent","logDebugActivity","KeyboardEvent","isFilterTarget","Element","contains","scope","containsElement","ElementObserver","delegate","attributes","childList","subtree","elements","mutationObserver","MutationObserver","mutations","processMutations","observe","mutationObserverInit","refresh","pause","callback","takeRecords","matches","matchElementsInTree","has","removeElement","addElement","mutation","processMutation","type","processAttributeChange","attributeName","processRemovedNodes","removedNodes","processAddedNodes","addedNodes","node","elementAttributeChanged","matchElement","nodes","elementFromNode","processTree","elementIsActive","tree","processor","nodeType","Node","ELEMENT_NODE","isConnected","elementMatched","elementUnmatched","AttributeObserver","elementObserver","selector","hasAttribute","match","querySelectorAll","elementMatchedAttribute","elementUnmatchedAttribute","elementAttributeValueChanged","fetch","del","prune","Multimap","valuesByKey","hasKey","hasValue","some","getValuesForKey","getKeysForValue","_key","_values","IndexedMultimap","super","keysByValue","SelectorObserver","matchesByElement","selectorMatchElement","selectorMatched","selectorUnmatched","_attributeName","matchedBefore","StringMapObserver","stringMap","attributeOldValue","knownAttributeNames","refreshAttribute","oldValue","getStringMapKeyForAttribute","stringMapKeyAdded","stringMapValueChanged","stringMapKeyRemoved","currentAttributeNames","recordedAttributeNames","attribute","TokenListObserver","attributeObserver","tokensByElement","tokensMatched","readTokensForElement","unmatchedTokens","matchedTokens","refreshTokensForElement","tokensUnmatched","tokens","token","tokenMatched","tokenUnmatched","previousTokens","currentTokens","firstDifferingIndex","length","Math","max","zip","findIndex","previousToken","currentToken","content","tokenString","trim","split","parseTokenString","ValueListObserver","tokenListObserver","parseResultsByToken","WeakMap","valuesByTokenByElement","fetchParseResultForToken","fetchValuesByTokenForElement","elementMatchedValue","elementUnmatchedValue","parseResult","parseToken","valuesByToken","parseValueForToken","BindingObserver","bindingsByAction","valueListObserver","actionAttribute","disconnectAllActions","schema","connectAction","disconnectAction","clear","descriptor","tagName","getDefaultEventNameForElement","keyFilter","forToken","descriptorString","includes","options","test","parseActionDescriptorString","toString","eventFilter","filteres","modifiers","meta","ctrl","alt","shift","modifier","metaKey","ctrlKey","altKey","shiftKey","standardFilter","prototype","hasOwnProperty","keyMappings","pattern","RegExp","ValueObserver","receiver","stringMapObserver","valueDescriptorMap","invokeChangedCallbacksForDefaultValues","invokeChangedCallback","writer","defaultValue","valueDescriptorNameMap","valueDescriptors","undefined","data","rawValue","rawOldValue","changedMethodName","changedMethod","reader","TypeError","descriptors","hasMethodName","TargetObserver","targetsByName","disconnectAllTargets","connectTarget","disconnectTarget","targetConnected","targetDisconnected","readInheritableStaticArrayValues","propertyName","ancestors","getAncestorsForConstructor","definition","isArray","getOwnStaticArrayValues","readInheritableStaticObjectPairs","pairs","getOwnStaticObjectPairs","getPrototypeOf","reverse","OutletObserver","outletsByName","outletElementsByName","selectorObserverMap","outletDefinitions","outletName","body","observer","dependentContexts","disconnectAllOutlets","_selector","outlet","getOutlet","connectOutlet","getOutletFromMap","disconnectOutlet","hasOutlet","controllerAttribute","outletConnected","outletDisconnected","outlets","getSelectorForOutletName","outletDependencies","dependencies","router","modules","module","controllerConstructor","dependentControllerIdentifiers","identifiers","contexts","getControllerForElementAndIdentifier","find","Context","functionName","bindingObserver","dispatcher","valueObserver","targetObserver","outletObserver","initialize","parentElement","invokeControllerMethod","args","bless","properties","shadowConstructor","extend","shadowProperties","getOwnKeys","shadowingDescriptor","getOwnPropertyDescriptor","getShadowedDescriptor","getShadowProperties","defineProperties","shadow","blessedProperties","blessing","getBlessedProperties","getOwnPropertySymbols","object","getOwnPropertyNames","extendWithReflect","extended","Reflect","construct","arguments","create","setPrototypeOf","b","testReflectExtension","Module","blessDefinition","contextsByScope","connectedContexts","connectContextForScope","fetchContextForScope","disconnectContextForScope","ClassMap","getDataKey","getAll","getAttributeName","getAttributeNameForKey","DataMap","setAttribute","removeAttribute","Guide","logger","warn","warnedKeys","warnedKeysByObject","attributeValueContainsToken","TargetSet","targetName","targetNames","findTarget","findLegacyTarget","findAll","targets","findAllTargets","findAllLegacyTargets","getSelectorForTargetName","findElement","findAllElements","targetAttributeForScope","getLegacySelectorForTargetName","deprecate","targetDescriptor","targetAttribute","revisedAttributeName","guide","OutletSet","controllerElement","outletNames","findOutlet","findAllOutlets","outletAttributeForScope","queryElements","matchesElement","Scope","closest","controllerSelector","documentScope","isDocumentScope","documentElement","ScopeObserver","scopesByIdentifierByElement","scopeReferenceCounts","scopesByIdentifier","fetchScopesByIdentifierForElement","createScopeForElementAndIdentifier","referenceCount","scopeConnected","scopeDisconnected","Router","scopeObserver","modulesByIdentifier","loadDefinition","unloadIdentifier","connectModule","afterLoad","disconnectModule","getContextForElementAndIdentifier","defaultSchema","enter","tab","esc","space","up","down","home","end","objectFromEntries","c","n","array","memo","k","v","Application","console","debug","logFormattedMessage","Promise","resolve","readyState","register","load","registerActionOption","head","rest","shouldLoad","unload","controllers","onerror","groupCollapsed","log","groupEnd","parseValueDefinitionPair","typeDefinition","payload","typeFromObject","parseValueTypeConstant","typeObject","defaultValueType","parseValueTypeDefault","default","propertyPath","parseValueTypeObject","typeFromDefaultValue","typeFromConstant","parseValueTypeDefinition","constant","defaultValuesByType","defaultValueForDefinition","hasCustomDefaultValue","readers","writers","valueDescriptorForTokenAndTypeDefinition","Boolean","Number","String","boolean","number","string","writeJSON","stringify","Controller","_identifier","_application","classes","dispatch","prefix","bubbles","cancelable","CustomEvent","dispatchEvent","classDefinition","targetDefinition","valueDefinitionPairs","propertyDescriptorMap","result","valueDefinitionPair","valueDescriptor","read","write","propertiesForValueDefinitionPair","outletDefinition","camelizedName","outletController","propertiesForOutletDefinition"],"mappings":"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"}
1
+ {"version":3,"file":"stimulus.min.js","sources":["../src/core/event_listener.ts","../src/core/dispatcher.ts","../src/core/action_descriptor.ts","../src/core/string_helpers.ts","../src/core/utils.ts","../src/core/action.ts","../src/core/binding.ts","../src/mutation-observers/element_observer.ts","../src/mutation-observers/attribute_observer.ts","../src/multimap/set_operations.ts","../src/multimap/multimap.ts","../src/multimap/indexed_multimap.ts","../src/mutation-observers/selector_observer.ts","../src/mutation-observers/string_map_observer.ts","../src/mutation-observers/token_list_observer.ts","../src/mutation-observers/value_list_observer.ts","../src/core/binding_observer.ts","../src/core/value_observer.ts","../src/core/target_observer.ts","../src/core/inheritable_statics.ts","../src/core/outlet_observer.ts","../src/core/context.ts","../src/core/blessing.ts","../src/core/module.ts","../src/core/definition.ts","../src/core/class_map.ts","../src/core/data_map.ts","../src/core/guide.ts","../src/core/selectors.ts","../src/core/target_set.ts","../src/core/outlet_set.ts","../src/core/scope.ts","../src/core/scope_observer.ts","../src/core/router.ts","../src/core/schema.ts","../src/core/application.ts","../src/core/outlet_properties.ts","../src/core/value_properties.ts","../src/core/controller.ts","../src/core/class_properties.ts","../src/core/target_properties.ts"],"sourcesContent":["import { Binding } from \"./binding\"\n\nexport class EventListener implements EventListenerObject {\n readonly eventTarget: EventTarget\n readonly eventName: string\n readonly eventOptions: AddEventListenerOptions\n private unorderedBindings: Set<Binding>\n\n constructor(eventTarget: EventTarget, eventName: string, eventOptions: AddEventListenerOptions) {\n this.eventTarget = eventTarget\n this.eventName = eventName\n this.eventOptions = eventOptions\n this.unorderedBindings = new Set()\n }\n\n connect() {\n this.eventTarget.addEventListener(this.eventName, this, this.eventOptions)\n }\n\n disconnect() {\n this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions)\n }\n\n // Binding observer delegate\n\n bindingConnected(binding: Binding) {\n this.unorderedBindings.add(binding)\n }\n\n bindingDisconnected(binding: Binding) {\n this.unorderedBindings.delete(binding)\n }\n\n handleEvent(event: Event) {\n // FIXME: Determine why TS won't recognize that the extended event has immediatePropagationStopped\n const extendedEvent = extendEvent(event) as any\n for (const binding of this.bindings) {\n if (extendedEvent.immediatePropagationStopped) {\n break\n } else {\n binding.handleEvent(extendedEvent)\n }\n }\n }\n\n hasBindings() {\n return this.unorderedBindings.size > 0\n }\n\n get bindings(): Binding[] {\n return Array.from(this.unorderedBindings).sort((left, right) => {\n const leftIndex = left.index,\n rightIndex = right.index\n return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0\n })\n }\n}\n\nfunction extendEvent(event: Event) {\n if (\"immediatePropagationStopped\" in event) {\n return event\n } else {\n const { stopImmediatePropagation } = event\n return Object.assign(event, {\n immediatePropagationStopped: false,\n stopImmediatePropagation() {\n this.immediatePropagationStopped = true\n stopImmediatePropagation.call(this)\n },\n })\n }\n}\n","import { Application } from \"./application\"\nimport { Binding } from \"./binding\"\nimport { BindingObserverDelegate } from \"./binding_observer\"\nimport { EventListener } from \"./event_listener\"\n\nexport class Dispatcher implements BindingObserverDelegate {\n readonly application: Application\n private eventListenerMaps: Map<EventTarget, Map<string, EventListener>>\n private started: boolean\n\n constructor(application: Application) {\n this.application = application\n this.eventListenerMaps = new Map()\n this.started = false\n }\n\n start() {\n if (!this.started) {\n this.started = true\n this.eventListeners.forEach((eventListener) => eventListener.connect())\n }\n }\n\n stop() {\n if (this.started) {\n this.started = false\n this.eventListeners.forEach((eventListener) => eventListener.disconnect())\n }\n }\n\n get eventListeners(): EventListener[] {\n return Array.from(this.eventListenerMaps.values()).reduce(\n (listeners, map) => listeners.concat(Array.from(map.values())),\n [] as EventListener[]\n )\n }\n\n // Binding observer delegate\n\n bindingConnected(binding: Binding) {\n this.fetchEventListenerForBinding(binding).bindingConnected(binding)\n }\n\n bindingDisconnected(binding: Binding, clearEventListeners = false) {\n this.fetchEventListenerForBinding(binding).bindingDisconnected(binding)\n if (clearEventListeners) this.clearEventListenersForBinding(binding)\n }\n\n // Error handling\n\n handleError(error: Error, message: string, detail: object = {}) {\n this.application.handleError(error, `Error ${message}`, detail)\n }\n\n private clearEventListenersForBinding(binding: Binding) {\n const eventListener = this.fetchEventListenerForBinding(binding)\n if (!eventListener.hasBindings()) {\n eventListener.disconnect()\n this.removeMappedEventListenerFor(binding)\n }\n }\n\n private removeMappedEventListenerFor(binding: Binding) {\n const { eventTarget, eventName, eventOptions } = binding\n const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget)\n const cacheKey = this.cacheKey(eventName, eventOptions)\n\n eventListenerMap.delete(cacheKey)\n if (eventListenerMap.size == 0) this.eventListenerMaps.delete(eventTarget)\n }\n\n private fetchEventListenerForBinding(binding: Binding): EventListener {\n const { eventTarget, eventName, eventOptions } = binding\n return this.fetchEventListener(eventTarget, eventName, eventOptions)\n }\n\n private fetchEventListener(\n eventTarget: EventTarget,\n eventName: string,\n eventOptions: AddEventListenerOptions\n ): EventListener {\n const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget)\n const cacheKey = this.cacheKey(eventName, eventOptions)\n let eventListener = eventListenerMap.get(cacheKey)\n if (!eventListener) {\n eventListener = this.createEventListener(eventTarget, eventName, eventOptions)\n eventListenerMap.set(cacheKey, eventListener)\n }\n return eventListener\n }\n\n private createEventListener(\n eventTarget: EventTarget,\n eventName: string,\n eventOptions: AddEventListenerOptions\n ): EventListener {\n const eventListener = new EventListener(eventTarget, eventName, eventOptions)\n if (this.started) {\n eventListener.connect()\n }\n return eventListener\n }\n\n private fetchEventListenerMapForEventTarget(eventTarget: EventTarget): Map<string, EventListener> {\n let eventListenerMap = this.eventListenerMaps.get(eventTarget)\n if (!eventListenerMap) {\n eventListenerMap = new Map()\n this.eventListenerMaps.set(eventTarget, eventListenerMap)\n }\n return eventListenerMap\n }\n\n private cacheKey(eventName: string, eventOptions: any): string {\n const parts = [eventName]\n Object.keys(eventOptions)\n .sort()\n .forEach((key) => {\n parts.push(`${eventOptions[key] ? \"\" : \"!\"}${key}`)\n })\n return parts.join(\":\")\n }\n}\n","import type { Controller } from \"./controller\"\n\nexport type ActionDescriptorFilters = Record<string, ActionDescriptorFilter>\nexport type ActionDescriptorFilter = (options: ActionDescriptorFilterOptions) => boolean\ntype ActionDescriptorFilterOptions = {\n name: string\n value: boolean\n event: Event\n element: Element\n controller: Controller<Element>\n}\n\nexport const defaultActionDescriptorFilters: ActionDescriptorFilters = {\n stop({ event, value }) {\n if (value) event.stopPropagation()\n\n return true\n },\n\n prevent({ event, value }) {\n if (value) event.preventDefault()\n\n return true\n },\n\n self({ event, value, element }) {\n if (value) {\n return element === event.target\n } else {\n return true\n }\n },\n}\n\nexport interface ActionDescriptor {\n eventTarget: EventTarget\n eventOptions: AddEventListenerOptions\n eventName: string\n identifier: string\n methodName: string\n keyFilter: string\n}\n\n// capture nos.: 1 1 2 2 3 3 4 4 5 5 6 6 7 7\nconst descriptorPattern = /^(?:(?:([^.]+?)\\+)?(.+?)(?:\\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/\n\nexport function parseActionDescriptorString(descriptorString: string): Partial<ActionDescriptor> {\n const source = descriptorString.trim()\n const matches = source.match(descriptorPattern) || []\n let eventName = matches[2]\n let keyFilter = matches[3]\n\n if (keyFilter && ![\"keydown\", \"keyup\", \"keypress\"].includes(eventName)) {\n eventName += `.${keyFilter}`\n keyFilter = \"\"\n }\n\n return {\n eventTarget: parseEventTarget(matches[4]),\n eventName,\n eventOptions: matches[7] ? parseEventOptions(matches[7]) : {},\n identifier: matches[5],\n methodName: matches[6],\n keyFilter: matches[1] || keyFilter,\n }\n}\n\nfunction parseEventTarget(eventTargetName: string): EventTarget | undefined {\n if (eventTargetName == \"window\") {\n return window\n } else if (eventTargetName == \"document\") {\n return document\n }\n}\n\nfunction parseEventOptions(eventOptions: string): AddEventListenerOptions {\n return eventOptions\n .split(\":\")\n .reduce((options, token) => Object.assign(options, { [token.replace(/^!/, \"\")]: !/^!/.test(token) }), {})\n}\n\nexport function stringifyEventTarget(eventTarget: EventTarget) {\n if (eventTarget == window) {\n return \"window\"\n } else if (eventTarget == document) {\n return \"document\"\n }\n}\n","export function camelize(value: string) {\n return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase())\n}\n\nexport function namespaceCamelize(value: string) {\n return camelize(value.replace(/--/g, \"-\").replace(/__/g, \"_\"))\n}\n\nexport function capitalize(value: string) {\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nexport function dasherize(value: string) {\n return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`)\n}\n\nexport function tokenize(value: string) {\n return value.match(/[^\\s]+/g) || []\n}\n","export function isSomething(object: any): boolean {\n return object !== null && object !== undefined\n}\n\nexport function hasProperty(object: any, property: string): boolean {\n return Object.prototype.hasOwnProperty.call(object, property)\n}\n","import { ActionDescriptor, parseActionDescriptorString, stringifyEventTarget } from \"./action_descriptor\"\nimport { Token } from \"../mutation-observers\"\nimport { Schema } from \"./schema\"\nimport { camelize } from \"./string_helpers\"\nimport { hasProperty } from \"./utils\"\n\nconst allModifiers = [\"meta\", \"ctrl\", \"alt\", \"shift\"]\n\nexport class Action {\n readonly element: Element\n readonly index: number\n readonly eventTarget: EventTarget\n readonly eventName: string\n readonly eventOptions: AddEventListenerOptions\n readonly identifier: string\n readonly methodName: string\n readonly keyFilter: string\n readonly schema: Schema\n\n static forToken(token: Token, schema: Schema) {\n return new this(token.element, token.index, parseActionDescriptorString(token.content), schema)\n }\n\n constructor(element: Element, index: number, descriptor: Partial<ActionDescriptor>, schema: Schema) {\n this.element = element\n this.index = index\n this.eventTarget = descriptor.eventTarget || element\n this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\")\n this.eventOptions = descriptor.eventOptions || {}\n this.identifier = descriptor.identifier || error(\"missing identifier\")\n this.methodName = descriptor.methodName || error(\"missing method name\")\n this.keyFilter = descriptor.keyFilter || \"\"\n this.schema = schema\n }\n\n toString() {\n const eventFilter = this.keyFilter ? `.${this.keyFilter}` : \"\"\n const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : \"\"\n return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`\n }\n\n shouldIgnoreKeyboardEvent(event: KeyboardEvent): boolean {\n if (!this.keyFilter) {\n return false\n }\n\n const filters = this.keyFilter.split(\"+\")\n if (this.keyFilterDissatisfied(event, filters)) {\n return true\n }\n\n const standardFilter = filters.filter((key) => !allModifiers.includes(key))[0]\n if (!standardFilter) {\n // missing non modifier key\n return false\n }\n\n if (!hasProperty(this.keyMappings, standardFilter)) {\n error(`contains unknown key filter: ${this.keyFilter}`)\n }\n\n return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase()\n }\n\n shouldIgnoreMouseEvent(event: MouseEvent): boolean {\n if (!this.keyFilter) {\n return false\n }\n\n const filters = [this.keyFilter]\n if (this.keyFilterDissatisfied(event, filters)) {\n return true\n }\n\n return false\n }\n\n get params() {\n const params: { [key: string]: any } = {}\n const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, \"i\")\n\n for (const { name, value } of Array.from(this.element.attributes)) {\n const match = name.match(pattern)\n const key = match && match[1]\n if (key) {\n params[camelize(key)] = typecast(value)\n }\n }\n return params\n }\n\n private get eventTargetName() {\n return stringifyEventTarget(this.eventTarget)\n }\n\n private get keyMappings() {\n return this.schema.keyMappings\n }\n\n private keyFilterDissatisfied(event: KeyboardEvent | MouseEvent, filters: Array<string>): boolean {\n const [meta, ctrl, alt, shift] = allModifiers.map((modifier) => filters.includes(modifier))\n\n return event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift\n }\n}\n\nconst defaultEventNames: { [tagName: string]: (element: Element) => string } = {\n a: () => \"click\",\n button: () => \"click\",\n form: () => \"submit\",\n details: () => \"toggle\",\n input: (e) => (e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"),\n select: () => \"change\",\n textarea: () => \"input\",\n}\n\nexport function getDefaultEventNameForElement(element: Element): string | undefined {\n const tagName = element.tagName.toLowerCase()\n if (tagName in defaultEventNames) {\n return defaultEventNames[tagName](element)\n }\n}\n\nfunction error(message: string): never {\n throw new Error(message)\n}\n\nfunction typecast(value: any): any {\n try {\n return JSON.parse(value)\n } catch (o_O) {\n return value\n }\n}\n","import { Action } from \"./action\"\nimport { ActionEvent } from \"./action_event\"\nimport { Context } from \"./context\"\nimport { Controller } from \"./controller\"\nimport { Scope } from \"./scope\"\nexport class Binding {\n readonly context: Context\n readonly action: Action\n\n constructor(context: Context, action: Action) {\n this.context = context\n this.action = action\n }\n\n get index(): number {\n return this.action.index\n }\n\n get eventTarget(): EventTarget {\n return this.action.eventTarget\n }\n\n get eventOptions(): AddEventListenerOptions {\n return this.action.eventOptions\n }\n\n get identifier(): string {\n return this.context.identifier\n }\n\n handleEvent(event: Event) {\n const actionEvent = this.prepareActionEvent(event)\n if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(actionEvent)) {\n this.invokeWithEvent(actionEvent)\n }\n }\n\n get eventName(): string {\n return this.action.eventName\n }\n\n get method(): Function {\n const method = (this.controller as any)[this.methodName]\n if (typeof method == \"function\") {\n return method\n }\n throw new Error(`Action \"${this.action}\" references undefined method \"${this.methodName}\"`)\n }\n\n private applyEventModifiers(event: Event): boolean {\n const { element } = this.action\n const { actionDescriptorFilters } = this.context.application\n const { controller } = this.context\n\n let passes = true\n\n for (const [name, value] of Object.entries(this.eventOptions)) {\n if (name in actionDescriptorFilters) {\n const filter = actionDescriptorFilters[name]\n\n passes = passes && filter({ name, value, event, element, controller })\n } else {\n continue\n }\n }\n\n return passes\n }\n\n private prepareActionEvent(event: Event): ActionEvent {\n return Object.assign(event, { params: this.action.params })\n }\n\n private invokeWithEvent(event: ActionEvent) {\n const { target, currentTarget } = event\n try {\n this.method.call(this.controller, event)\n this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName })\n } catch (error: any) {\n const { identifier, controller, element, index } = this\n const detail = { identifier, controller, element, index, event }\n this.context.handleError(error, `invoking action \"${this.action}\"`, detail)\n }\n }\n\n private willBeInvokedByEvent(event: Event): boolean {\n const eventTarget = event.target\n\n if (event instanceof KeyboardEvent && this.action.shouldIgnoreKeyboardEvent(event)) {\n return false\n }\n\n if (event instanceof MouseEvent && this.action.shouldIgnoreMouseEvent(event)) {\n return false\n }\n\n if (this.element === eventTarget) {\n return true\n } else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n return this.scope.containsElement(eventTarget)\n } else {\n return this.scope.containsElement(this.action.element)\n }\n }\n\n private get controller(): Controller {\n return this.context.controller\n }\n\n private get methodName(): string {\n return this.action.methodName\n }\n\n private get element(): Element {\n return this.scope.element\n }\n\n private get scope(): Scope {\n return this.context.scope\n }\n}\n","export interface ElementObserverDelegate {\n matchElement(element: Element): boolean\n matchElementsInTree(tree: Element): Element[]\n\n elementMatched?(element: Element): void\n elementUnmatched?(element: Element): void\n elementAttributeChanged?(element: Element, attributeName: string): void\n}\n\nexport class ElementObserver {\n element: Element\n started: boolean\n private delegate: ElementObserverDelegate\n\n private elements: Set<Element>\n private mutationObserver: MutationObserver\n private mutationObserverInit: MutationObserverInit = { attributes: true, childList: true, subtree: true }\n\n constructor(element: Element, delegate: ElementObserverDelegate) {\n this.element = element\n this.started = false\n this.delegate = delegate\n\n this.elements = new Set()\n this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations))\n }\n\n start() {\n if (!this.started) {\n this.started = true\n this.mutationObserver.observe(this.element, this.mutationObserverInit)\n this.refresh()\n }\n }\n\n pause(callback: () => void) {\n if (this.started) {\n this.mutationObserver.disconnect()\n this.started = false\n }\n\n callback()\n\n if (!this.started) {\n this.mutationObserver.observe(this.element, this.mutationObserverInit)\n this.started = true\n }\n }\n\n stop() {\n if (this.started) {\n this.mutationObserver.takeRecords()\n this.mutationObserver.disconnect()\n this.started = false\n }\n }\n\n refresh() {\n if (this.started) {\n const matches = new Set(this.matchElementsInTree())\n\n for (const element of Array.from(this.elements)) {\n if (!matches.has(element)) {\n this.removeElement(element)\n }\n }\n\n for (const element of Array.from(matches)) {\n this.addElement(element)\n }\n }\n }\n\n // Mutation record processing\n\n private processMutations(mutations: MutationRecord[]) {\n if (this.started) {\n for (const mutation of mutations) {\n this.processMutation(mutation)\n }\n }\n }\n\n private processMutation(mutation: MutationRecord) {\n if (mutation.type == \"attributes\") {\n this.processAttributeChange(mutation.target as Element, mutation.attributeName!)\n } else if (mutation.type == \"childList\") {\n this.processRemovedNodes(mutation.removedNodes)\n this.processAddedNodes(mutation.addedNodes)\n }\n }\n\n private processAttributeChange(element: Element, attributeName: string) {\n if (this.elements.has(element)) {\n if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n this.delegate.elementAttributeChanged(element, attributeName)\n } else {\n this.removeElement(element)\n }\n } else if (this.matchElement(element)) {\n this.addElement(element)\n }\n }\n\n private processRemovedNodes(nodes: NodeList) {\n for (const node of Array.from(nodes)) {\n const element = this.elementFromNode(node)\n if (element) {\n this.processTree(element, this.removeElement)\n }\n }\n }\n\n private processAddedNodes(nodes: NodeList) {\n for (const node of Array.from(nodes)) {\n const element = this.elementFromNode(node)\n if (element && this.elementIsActive(element)) {\n this.processTree(element, this.addElement)\n }\n }\n }\n\n // Element matching\n\n private matchElement(element: Element): boolean {\n return this.delegate.matchElement(element)\n }\n\n private matchElementsInTree(tree: Element = this.element): Element[] {\n return this.delegate.matchElementsInTree(tree)\n }\n\n private processTree(tree: Element, processor: (element: Element) => void) {\n for (const element of this.matchElementsInTree(tree)) {\n processor.call(this, element)\n }\n }\n\n private elementFromNode(node: Node): Element | undefined {\n if (node.nodeType == Node.ELEMENT_NODE) {\n return node as Element\n }\n }\n\n private elementIsActive(element: Element): boolean {\n if (element.isConnected != this.element.isConnected) {\n return false\n } else {\n return this.element.contains(element)\n }\n }\n\n // Element tracking\n\n private addElement(element: Element) {\n if (!this.elements.has(element)) {\n if (this.elementIsActive(element)) {\n this.elements.add(element)\n if (this.delegate.elementMatched) {\n this.delegate.elementMatched(element)\n }\n }\n }\n }\n\n private removeElement(element: Element) {\n if (this.elements.has(element)) {\n this.elements.delete(element)\n if (this.delegate.elementUnmatched) {\n this.delegate.elementUnmatched(element)\n }\n }\n }\n}\n","import { ElementObserver, ElementObserverDelegate } from \"./element_observer\"\n\nexport interface AttributeObserverDelegate {\n elementMatchedAttribute?(element: Element, attributeName: string): void\n elementAttributeValueChanged?(element: Element, attributeName: string): void\n elementUnmatchedAttribute?(element: Element, attributeName: string): void\n}\n\nexport class AttributeObserver implements ElementObserverDelegate {\n attributeName: string\n private delegate: AttributeObserverDelegate\n\n private elementObserver: ElementObserver\n\n constructor(element: Element, attributeName: string, delegate: AttributeObserverDelegate) {\n this.attributeName = attributeName\n this.delegate = delegate\n\n this.elementObserver = new ElementObserver(element, this)\n }\n\n get element(): Element {\n return this.elementObserver.element\n }\n\n get selector(): string {\n return `[${this.attributeName}]`\n }\n\n start() {\n this.elementObserver.start()\n }\n\n pause(callback: () => void) {\n this.elementObserver.pause(callback)\n }\n\n stop() {\n this.elementObserver.stop()\n }\n\n refresh() {\n this.elementObserver.refresh()\n }\n\n get started(): boolean {\n return this.elementObserver.started\n }\n\n // Element observer delegate\n\n matchElement(element: Element): boolean {\n return element.hasAttribute(this.attributeName)\n }\n\n matchElementsInTree(tree: Element): Element[] {\n const match = this.matchElement(tree) ? [tree] : []\n const matches = Array.from(tree.querySelectorAll(this.selector))\n return match.concat(matches)\n }\n\n elementMatched(element: Element) {\n if (this.delegate.elementMatchedAttribute) {\n this.delegate.elementMatchedAttribute(element, this.attributeName)\n }\n }\n\n elementUnmatched(element: Element) {\n if (this.delegate.elementUnmatchedAttribute) {\n this.delegate.elementUnmatchedAttribute(element, this.attributeName)\n }\n }\n\n elementAttributeChanged(element: Element, attributeName: string) {\n if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n this.delegate.elementAttributeValueChanged(element, attributeName)\n }\n }\n}\n","export function add<K, V>(map: Map<K, Set<V>>, key: K, value: V) {\n fetch(map, key).add(value)\n}\n\nexport function del<K, V>(map: Map<K, Set<V>>, key: K, value: V) {\n fetch(map, key).delete(value)\n prune(map, key)\n}\n\nexport function fetch<K, V>(map: Map<K, Set<V>>, key: K): Set<V> {\n let values = map.get(key)\n if (!values) {\n values = new Set()\n map.set(key, values)\n }\n return values\n}\n\nexport function prune<K, V>(map: Map<K, Set<V>>, key: K) {\n const values = map.get(key)\n if (values != null && values.size == 0) {\n map.delete(key)\n }\n}\n","import { add, del } from \"./set_operations\"\n\nexport class Multimap<K, V> {\n private valuesByKey: Map<K, Set<V>>\n\n constructor() {\n this.valuesByKey = new Map<K, Set<V>>()\n }\n\n get keys() {\n return Array.from(this.valuesByKey.keys())\n }\n\n get values(): V[] {\n const sets = Array.from(this.valuesByKey.values())\n return sets.reduce((values, set) => values.concat(Array.from(set)), <V[]>[])\n }\n\n get size(): number {\n const sets = Array.from(this.valuesByKey.values())\n return sets.reduce((size, set) => size + set.size, 0)\n }\n\n add(key: K, value: V) {\n add(this.valuesByKey, key, value)\n }\n\n delete(key: K, value: V) {\n del(this.valuesByKey, key, value)\n }\n\n has(key: K, value: V): boolean {\n const values = this.valuesByKey.get(key)\n return values != null && values.has(value)\n }\n\n hasKey(key: K): boolean {\n return this.valuesByKey.has(key)\n }\n\n hasValue(value: V): boolean {\n const sets = Array.from(this.valuesByKey.values())\n return sets.some((set) => set.has(value))\n }\n\n getValuesForKey(key: K): V[] {\n const values = this.valuesByKey.get(key)\n return values ? Array.from(values) : []\n }\n\n getKeysForValue(value: V): K[] {\n return Array.from(this.valuesByKey)\n .filter(([_key, values]) => values.has(value))\n .map(([key, _values]) => key)\n }\n}\n","import { Multimap } from \"./multimap\"\nimport { add, del } from \"./set_operations\"\n\nexport class IndexedMultimap<K, V> extends Multimap<K, V> {\n private keysByValue: Map<V, Set<K>>\n\n constructor() {\n super()\n this.keysByValue = new Map()\n }\n\n get values(): V[] {\n return Array.from(this.keysByValue.keys())\n }\n\n add(key: K, value: V) {\n super.add(key, value)\n add(this.keysByValue, value, key)\n }\n\n delete(key: K, value: V) {\n super.delete(key, value)\n del(this.keysByValue, value, key)\n }\n\n hasValue(value: V): boolean {\n return this.keysByValue.has(value)\n }\n\n getKeysForValue(value: V): K[] {\n const set = this.keysByValue.get(value)\n return set ? Array.from(set) : []\n }\n}\n","import { ElementObserver, ElementObserverDelegate } from \"./element_observer\"\nimport { Multimap } from \"../multimap\"\n\nexport interface SelectorObserverDelegate {\n selectorMatched(element: Element, selector: string, details: object): void\n selectorUnmatched(element: Element, selector: string, details: object): void\n selectorMatchElement?(element: Element, details: object): boolean\n}\n\nexport class SelectorObserver implements ElementObserverDelegate {\n private readonly elementObserver: ElementObserver\n private readonly delegate: SelectorObserverDelegate\n private readonly matchesByElement: Multimap<string, Element>\n private readonly details: object\n _selector: string | null\n\n constructor(element: Element, selector: string, delegate: SelectorObserverDelegate, details: object) {\n this._selector = selector\n this.details = details\n this.elementObserver = new ElementObserver(element, this)\n this.delegate = delegate\n this.matchesByElement = new Multimap()\n }\n\n get started(): boolean {\n return this.elementObserver.started\n }\n\n get selector() {\n return this._selector\n }\n\n set selector(selector: string | null) {\n this._selector = selector\n this.refresh()\n }\n\n start() {\n this.elementObserver.start()\n }\n\n pause(callback: () => void) {\n this.elementObserver.pause(callback)\n }\n\n stop() {\n this.elementObserver.stop()\n }\n\n refresh() {\n this.elementObserver.refresh()\n }\n\n get element(): Element {\n return this.elementObserver.element\n }\n\n // Element observer delegate\n\n matchElement(element: Element): boolean {\n const { selector } = this\n\n if (selector) {\n const matches = element.matches(selector)\n\n if (this.delegate.selectorMatchElement) {\n return matches && this.delegate.selectorMatchElement(element, this.details)\n }\n\n return matches\n } else {\n return false\n }\n }\n\n matchElementsInTree(tree: Element): Element[] {\n const { selector } = this\n\n if (selector) {\n const match = this.matchElement(tree) ? [tree] : []\n const matches = Array.from(tree.querySelectorAll(selector)).filter((match) => this.matchElement(match))\n return match.concat(matches)\n } else {\n return []\n }\n }\n\n elementMatched(element: Element) {\n const { selector } = this\n\n if (selector) {\n this.selectorMatched(element, selector)\n }\n }\n\n elementUnmatched(element: Element) {\n const selectors = this.matchesByElement.getKeysForValue(element)\n\n for (const selector of selectors) {\n this.selectorUnmatched(element, selector)\n }\n }\n\n elementAttributeChanged(element: Element, _attributeName: string) {\n const { selector } = this\n\n if (selector) {\n const matches = this.matchElement(element)\n const matchedBefore = this.matchesByElement.has(selector, element)\n\n if (matches && !matchedBefore) {\n this.selectorMatched(element, selector)\n } else if (!matches && matchedBefore) {\n this.selectorUnmatched(element, selector)\n }\n }\n }\n\n // Selector management\n\n private selectorMatched(element: Element, selector: string) {\n this.delegate.selectorMatched(element, selector, this.details)\n this.matchesByElement.add(selector, element)\n }\n\n private selectorUnmatched(element: Element, selector: string) {\n this.delegate.selectorUnmatched(element, selector, this.details)\n this.matchesByElement.delete(selector, element)\n }\n}\n","export interface StringMapObserverDelegate {\n getStringMapKeyForAttribute(attributeName: string): string | undefined\n stringMapKeyAdded?(key: string, attributeName: string): void\n stringMapValueChanged?(value: string | null, key: string, oldValue: string | null): void\n stringMapKeyRemoved?(key: string, attributeName: string, oldValue: string | null): void\n}\n\nexport class StringMapObserver {\n readonly element: Element\n readonly delegate: StringMapObserverDelegate\n private started: boolean\n private stringMap: Map<string, string>\n private mutationObserver: MutationObserver\n\n constructor(element: Element, delegate: StringMapObserverDelegate) {\n this.element = element\n this.delegate = delegate\n this.started = false\n this.stringMap = new Map()\n this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations))\n }\n\n start() {\n if (!this.started) {\n this.started = true\n this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true })\n this.refresh()\n }\n }\n\n stop() {\n if (this.started) {\n this.mutationObserver.takeRecords()\n this.mutationObserver.disconnect()\n this.started = false\n }\n }\n\n refresh() {\n if (this.started) {\n for (const attributeName of this.knownAttributeNames) {\n this.refreshAttribute(attributeName, null)\n }\n }\n }\n\n // Mutation record processing\n\n private processMutations(mutations: MutationRecord[]) {\n if (this.started) {\n for (const mutation of mutations) {\n this.processMutation(mutation)\n }\n }\n }\n\n private processMutation(mutation: MutationRecord) {\n const attributeName = mutation.attributeName\n if (attributeName) {\n this.refreshAttribute(attributeName, mutation.oldValue)\n }\n }\n\n // State tracking\n\n private refreshAttribute(attributeName: string, oldValue: string | null) {\n const key = this.delegate.getStringMapKeyForAttribute(attributeName)\n if (key != null) {\n if (!this.stringMap.has(attributeName)) {\n this.stringMapKeyAdded(key, attributeName)\n }\n\n const value = this.element.getAttribute(attributeName)\n if (this.stringMap.get(attributeName) != value) {\n this.stringMapValueChanged(value, key, oldValue)\n }\n\n if (value == null) {\n const oldValue = this.stringMap.get(attributeName)\n this.stringMap.delete(attributeName)\n if (oldValue) this.stringMapKeyRemoved(key, attributeName, oldValue)\n } else {\n this.stringMap.set(attributeName, value)\n }\n }\n }\n\n private stringMapKeyAdded(key: string, attributeName: string) {\n if (this.delegate.stringMapKeyAdded) {\n this.delegate.stringMapKeyAdded(key, attributeName)\n }\n }\n\n private stringMapValueChanged(value: string | null, key: string, oldValue: string | null) {\n if (this.delegate.stringMapValueChanged) {\n this.delegate.stringMapValueChanged(value, key, oldValue)\n }\n }\n\n private stringMapKeyRemoved(key: string, attributeName: string, oldValue: string | null) {\n if (this.delegate.stringMapKeyRemoved) {\n this.delegate.stringMapKeyRemoved(key, attributeName, oldValue)\n }\n }\n\n private get knownAttributeNames() {\n return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))\n }\n\n private get currentAttributeNames() {\n return Array.from(this.element.attributes).map((attribute) => attribute.name)\n }\n\n private get recordedAttributeNames() {\n return Array.from(this.stringMap.keys())\n }\n}\n","import { AttributeObserver, AttributeObserverDelegate } from \"./attribute_observer\"\nimport { Multimap } from \"../multimap\"\n\nexport interface Token {\n element: Element\n attributeName: string\n index: number\n content: string\n}\n\nexport interface TokenListObserverDelegate {\n tokenMatched(token: Token): void\n tokenUnmatched(token: Token): void\n}\n\nexport class TokenListObserver implements AttributeObserverDelegate {\n private attributeObserver: AttributeObserver\n private delegate: TokenListObserverDelegate\n private tokensByElement: Multimap<Element, Token>\n\n constructor(element: Element, attributeName: string, delegate: TokenListObserverDelegate) {\n this.attributeObserver = new AttributeObserver(element, attributeName, this)\n this.delegate = delegate\n this.tokensByElement = new Multimap()\n }\n\n get started(): boolean {\n return this.attributeObserver.started\n }\n\n start() {\n this.attributeObserver.start()\n }\n\n pause(callback: () => void) {\n this.attributeObserver.pause(callback)\n }\n\n stop() {\n this.attributeObserver.stop()\n }\n\n refresh() {\n this.attributeObserver.refresh()\n }\n\n get element(): Element {\n return this.attributeObserver.element\n }\n\n get attributeName(): string {\n return this.attributeObserver.attributeName\n }\n\n // Attribute observer delegate\n\n elementMatchedAttribute(element: Element) {\n this.tokensMatched(this.readTokensForElement(element))\n }\n\n elementAttributeValueChanged(element: Element) {\n const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element)\n this.tokensUnmatched(unmatchedTokens)\n this.tokensMatched(matchedTokens)\n }\n\n elementUnmatchedAttribute(element: Element) {\n this.tokensUnmatched(this.tokensByElement.getValuesForKey(element))\n }\n\n private tokensMatched(tokens: Token[]) {\n tokens.forEach((token) => this.tokenMatched(token))\n }\n\n private tokensUnmatched(tokens: Token[]) {\n tokens.forEach((token) => this.tokenUnmatched(token))\n }\n\n private tokenMatched(token: Token) {\n this.delegate.tokenMatched(token)\n this.tokensByElement.add(token.element, token)\n }\n\n private tokenUnmatched(token: Token) {\n this.delegate.tokenUnmatched(token)\n this.tokensByElement.delete(token.element, token)\n }\n\n private refreshTokensForElement(element: Element): [Token[], Token[]] {\n const previousTokens = this.tokensByElement.getValuesForKey(element)\n const currentTokens = this.readTokensForElement(element)\n const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(\n ([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken)\n )\n\n if (firstDifferingIndex == -1) {\n return [[], []]\n } else {\n return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)]\n }\n }\n\n private readTokensForElement(element: Element): Token[] {\n const attributeName = this.attributeName\n const tokenString = element.getAttribute(attributeName) || \"\"\n return parseTokenString(tokenString, element, attributeName)\n }\n}\n\nfunction parseTokenString(tokenString: string, element: Element, attributeName: string): Token[] {\n return tokenString\n .trim()\n .split(/\\s+/)\n .filter((content) => content.length)\n .map((content, index) => ({ element, attributeName, content, index }))\n}\n\nfunction zip<L, R>(left: L[], right: R[]): [L | undefined, R | undefined][] {\n const length = Math.max(left.length, right.length)\n return Array.from({ length }, (_, index) => [left[index], right[index]] as [L, R])\n}\n\nfunction tokensAreEqual(left?: Token, right?: Token) {\n return left && right && left.index == right.index && left.content == right.content\n}\n","import { Token, TokenListObserver, TokenListObserverDelegate } from \"./token_list_observer\"\n\nexport interface ValueListObserverDelegate<T> {\n parseValueForToken(token: Token): T | undefined\n elementMatchedValue(element: Element, value: T): void\n elementUnmatchedValue(element: Element, value: T): void\n}\n\ninterface ParseResult<T> {\n value?: T\n error?: Error\n}\n\nexport class ValueListObserver<T> implements TokenListObserverDelegate {\n private tokenListObserver: TokenListObserver\n private delegate: ValueListObserverDelegate<T>\n private parseResultsByToken: WeakMap<Token, ParseResult<T>>\n private valuesByTokenByElement: WeakMap<Element, Map<Token, T>>\n\n constructor(element: Element, attributeName: string, delegate: ValueListObserverDelegate<T>) {\n this.tokenListObserver = new TokenListObserver(element, attributeName, this)\n this.delegate = delegate\n this.parseResultsByToken = new WeakMap()\n this.valuesByTokenByElement = new WeakMap()\n }\n\n get started(): boolean {\n return this.tokenListObserver.started\n }\n\n start() {\n this.tokenListObserver.start()\n }\n\n stop() {\n this.tokenListObserver.stop()\n }\n\n refresh() {\n this.tokenListObserver.refresh()\n }\n\n get element(): Element {\n return this.tokenListObserver.element\n }\n\n get attributeName(): string {\n return this.tokenListObserver.attributeName\n }\n\n tokenMatched(token: Token) {\n const { element } = token\n const { value } = this.fetchParseResultForToken(token)\n if (value) {\n this.fetchValuesByTokenForElement(element).set(token, value)\n this.delegate.elementMatchedValue(element, value)\n }\n }\n\n tokenUnmatched(token: Token) {\n const { element } = token\n const { value } = this.fetchParseResultForToken(token)\n if (value) {\n this.fetchValuesByTokenForElement(element).delete(token)\n this.delegate.elementUnmatchedValue(element, value)\n }\n }\n\n private fetchParseResultForToken(token: Token) {\n let parseResult = this.parseResultsByToken.get(token)\n if (!parseResult) {\n parseResult = this.parseToken(token)\n this.parseResultsByToken.set(token, parseResult)\n }\n return parseResult\n }\n\n private fetchValuesByTokenForElement(element: Element) {\n let valuesByToken = this.valuesByTokenByElement.get(element)\n if (!valuesByToken) {\n valuesByToken = new Map()\n this.valuesByTokenByElement.set(element, valuesByToken)\n }\n return valuesByToken\n }\n\n private parseToken(token: Token): ParseResult<T> {\n try {\n const value = this.delegate.parseValueForToken(token)\n return { value }\n } catch (error: any) {\n return { error }\n }\n }\n}\n","import { Action } from \"./action\"\nimport { Binding } from \"./binding\"\nimport { Context } from \"./context\"\nimport { ErrorHandler } from \"./error_handler\"\nimport { Schema } from \"./schema\"\nimport { Token, ValueListObserver, ValueListObserverDelegate } from \"../mutation-observers\"\n\nexport interface BindingObserverDelegate extends ErrorHandler {\n bindingConnected(binding: Binding): void\n bindingDisconnected(binding: Binding, clearEventListeners?: boolean): void\n}\n\nexport class BindingObserver implements ValueListObserverDelegate<Action> {\n readonly context: Context\n private delegate: BindingObserverDelegate\n private valueListObserver?: ValueListObserver<Action>\n private bindingsByAction: Map<Action, Binding>\n\n constructor(context: Context, delegate: BindingObserverDelegate) {\n this.context = context\n this.delegate = delegate\n this.bindingsByAction = new Map()\n }\n\n start() {\n if (!this.valueListObserver) {\n this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this)\n this.valueListObserver.start()\n }\n }\n\n stop() {\n if (this.valueListObserver) {\n this.valueListObserver.stop()\n delete this.valueListObserver\n this.disconnectAllActions()\n }\n }\n\n get element() {\n return this.context.element\n }\n\n get identifier() {\n return this.context.identifier\n }\n\n get actionAttribute() {\n return this.schema.actionAttribute\n }\n\n get schema(): Schema {\n return this.context.schema\n }\n\n get bindings(): Binding[] {\n return Array.from(this.bindingsByAction.values())\n }\n\n private connectAction(action: Action) {\n const binding = new Binding(this.context, action)\n this.bindingsByAction.set(action, binding)\n this.delegate.bindingConnected(binding)\n }\n\n private disconnectAction(action: Action) {\n const binding = this.bindingsByAction.get(action)\n if (binding) {\n this.bindingsByAction.delete(action)\n this.delegate.bindingDisconnected(binding)\n }\n }\n\n private disconnectAllActions() {\n this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true))\n this.bindingsByAction.clear()\n }\n\n // Value observer delegate\n\n parseValueForToken(token: Token): Action | undefined {\n const action = Action.forToken(token, this.schema)\n if (action.identifier == this.identifier) {\n return action\n }\n }\n\n elementMatchedValue(element: Element, action: Action) {\n this.connectAction(action)\n }\n\n elementUnmatchedValue(element: Element, action: Action) {\n this.disconnectAction(action)\n }\n}\n","import { Context } from \"./context\"\nimport { StringMapObserver, StringMapObserverDelegate } from \"../mutation-observers\"\nimport { ValueDescriptor } from \"./value_properties\"\nimport { capitalize } from \"./string_helpers\"\n\nexport class ValueObserver implements StringMapObserverDelegate {\n readonly context: Context\n readonly receiver: any\n private stringMapObserver: StringMapObserver\n private valueDescriptorMap: { [attributeName: string]: ValueDescriptor }\n\n constructor(context: Context, receiver: any) {\n this.context = context\n this.receiver = receiver\n this.stringMapObserver = new StringMapObserver(this.element, this)\n this.valueDescriptorMap = (this.controller as any).valueDescriptorMap\n }\n\n start() {\n this.stringMapObserver.start()\n this.invokeChangedCallbacksForDefaultValues()\n }\n\n stop() {\n this.stringMapObserver.stop()\n }\n\n get element() {\n return this.context.element\n }\n\n get controller() {\n return this.context.controller\n }\n\n // String map observer delegate\n\n getStringMapKeyForAttribute(attributeName: string) {\n if (attributeName in this.valueDescriptorMap) {\n return this.valueDescriptorMap[attributeName].name\n }\n }\n\n stringMapKeyAdded(key: string, attributeName: string) {\n const descriptor = this.valueDescriptorMap[attributeName]\n\n if (!this.hasValue(key)) {\n this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue))\n }\n }\n\n stringMapValueChanged(value: string, name: string, oldValue: string) {\n const descriptor = this.valueDescriptorNameMap[name]\n\n if (value === null) return\n\n if (oldValue === null) {\n oldValue = descriptor.writer(descriptor.defaultValue)\n }\n\n this.invokeChangedCallback(name, value, oldValue)\n }\n\n stringMapKeyRemoved(key: string, attributeName: string, oldValue: string) {\n const descriptor = this.valueDescriptorNameMap[key]\n\n if (this.hasValue(key)) {\n this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue)\n } else {\n this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue)\n }\n }\n\n private invokeChangedCallbacksForDefaultValues() {\n for (const { key, name, defaultValue, writer } of this.valueDescriptors) {\n if (defaultValue != undefined && !this.controller.data.has(key)) {\n this.invokeChangedCallback(name, writer(defaultValue), undefined)\n }\n }\n }\n\n private invokeChangedCallback(name: string, rawValue: string, rawOldValue: string | undefined) {\n const changedMethodName = `${name}Changed`\n const changedMethod = this.receiver[changedMethodName]\n\n if (typeof changedMethod == \"function\") {\n const descriptor = this.valueDescriptorNameMap[name]\n\n try {\n const value = descriptor.reader(rawValue)\n let oldValue = rawOldValue\n\n if (rawOldValue) {\n oldValue = descriptor.reader(rawOldValue)\n }\n\n changedMethod.call(this.receiver, value, oldValue)\n } catch (error) {\n if (error instanceof TypeError) {\n error.message = `Stimulus Value \"${this.context.identifier}.${descriptor.name}\" - ${error.message}`\n }\n\n throw error\n }\n }\n }\n\n private get valueDescriptors() {\n const { valueDescriptorMap } = this\n return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key])\n }\n\n private get valueDescriptorNameMap() {\n const descriptors: { [type: string]: ValueDescriptor } = {}\n\n Object.keys(this.valueDescriptorMap).forEach((key) => {\n const descriptor = this.valueDescriptorMap[key]\n descriptors[descriptor.name] = descriptor\n })\n\n return descriptors\n }\n\n private hasValue(attributeName: string) {\n const descriptor = this.valueDescriptorNameMap[attributeName]\n const hasMethodName = `has${capitalize(descriptor.name)}`\n\n return this.receiver[hasMethodName]\n }\n}\n","import { Multimap } from \"../multimap\"\nimport { Token, TokenListObserver, TokenListObserverDelegate } from \"../mutation-observers\"\nimport { Context } from \"./context\"\n\nexport interface TargetObserverDelegate {\n targetConnected(element: Element, name: string): void\n targetDisconnected(element: Element, name: string): void\n}\n\nexport class TargetObserver implements TokenListObserverDelegate {\n readonly context: Context\n readonly delegate: TargetObserverDelegate\n readonly targetsByName: Multimap<string, Element>\n private tokenListObserver?: TokenListObserver\n\n constructor(context: Context, delegate: TargetObserverDelegate) {\n this.context = context\n this.delegate = delegate\n this.targetsByName = new Multimap()\n }\n\n start() {\n if (!this.tokenListObserver) {\n this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this)\n this.tokenListObserver.start()\n }\n }\n\n stop() {\n if (this.tokenListObserver) {\n this.disconnectAllTargets()\n this.tokenListObserver.stop()\n delete this.tokenListObserver\n }\n }\n\n // Token list observer delegate\n\n tokenMatched({ element, content: name }: Token) {\n if (this.scope.containsElement(element)) {\n this.connectTarget(element, name)\n }\n }\n\n tokenUnmatched({ element, content: name }: Token) {\n this.disconnectTarget(element, name)\n }\n\n // Target management\n\n connectTarget(element: Element, name: string) {\n if (!this.targetsByName.has(name, element)) {\n this.targetsByName.add(name, element)\n this.tokenListObserver?.pause(() => this.delegate.targetConnected(element, name))\n }\n }\n\n disconnectTarget(element: Element, name: string) {\n if (this.targetsByName.has(name, element)) {\n this.targetsByName.delete(name, element)\n this.tokenListObserver?.pause(() => this.delegate.targetDisconnected(element, name))\n }\n }\n\n disconnectAllTargets() {\n for (const name of this.targetsByName.keys) {\n for (const element of this.targetsByName.getValuesForKey(name)) {\n this.disconnectTarget(element, name)\n }\n }\n }\n\n // Private\n\n private get attributeName() {\n return `data-${this.context.identifier}-target`\n }\n\n private get element() {\n return this.context.element\n }\n\n private get scope() {\n return this.context.scope\n }\n}\n","import { Constructor } from \"./constructor\"\n\nexport function readInheritableStaticArrayValues<T, U = string>(constructor: Constructor<T>, propertyName: string) {\n const ancestors = getAncestorsForConstructor(constructor)\n return Array.from(\n ancestors.reduce((values, constructor) => {\n getOwnStaticArrayValues(constructor, propertyName).forEach((name) => values.add(name))\n return values\n }, new Set() as Set<U>)\n )\n}\n\nexport function readInheritableStaticObjectPairs<T, U>(constructor: Constructor<T>, propertyName: string) {\n const ancestors = getAncestorsForConstructor(constructor)\n return ancestors.reduce((pairs, constructor) => {\n pairs.push(...(getOwnStaticObjectPairs(constructor, propertyName) as any))\n return pairs\n }, [] as [string, U][])\n}\n\nfunction getAncestorsForConstructor<T>(constructor: Constructor<T>) {\n const ancestors: Constructor<any>[] = []\n while (constructor) {\n ancestors.push(constructor)\n constructor = Object.getPrototypeOf(constructor)\n }\n return ancestors.reverse()\n}\n\nfunction getOwnStaticArrayValues<T>(constructor: Constructor<T>, propertyName: string) {\n const definition = (constructor as any)[propertyName]\n return Array.isArray(definition) ? definition : []\n}\n\nfunction getOwnStaticObjectPairs<T, U>(constructor: Constructor<T>, propertyName: string) {\n const definition = (constructor as any)[propertyName]\n return definition ? Object.keys(definition).map((key) => [key, definition[key]] as [string, U]) : []\n}\n","import { Multimap } from \"../multimap\"\nimport { AttributeObserver, AttributeObserverDelegate } from \"../mutation-observers\"\nimport { SelectorObserver, SelectorObserverDelegate } from \"../mutation-observers\"\nimport { Context } from \"./context\"\nimport { Controller } from \"./controller\"\n\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\n\ntype OutletObserverDetails = { outletName: string }\n\nexport interface OutletObserverDelegate {\n outletConnected(outlet: Controller, element: Element, outletName: string): void\n outletDisconnected(outlet: Controller, element: Element, outletName: string): void\n}\n\nexport class OutletObserver implements AttributeObserverDelegate, SelectorObserverDelegate {\n started: boolean\n readonly context: Context\n readonly delegate: OutletObserverDelegate\n readonly outletsByName: Multimap<string, Controller>\n readonly outletElementsByName: Multimap<string, Element>\n private selectorObserverMap: Map<string, SelectorObserver>\n private attributeObserverMap: Map<string, AttributeObserver>\n\n constructor(context: Context, delegate: OutletObserverDelegate) {\n this.started = false\n this.context = context\n this.delegate = delegate\n this.outletsByName = new Multimap()\n this.outletElementsByName = new Multimap()\n this.selectorObserverMap = new Map()\n this.attributeObserverMap = new Map()\n }\n\n start() {\n if (!this.started) {\n this.outletDefinitions.forEach((outletName) => {\n this.setupSelectorObserverForOutlet(outletName)\n this.setupAttributeObserverForOutlet(outletName)\n })\n this.started = true\n this.dependentContexts.forEach((context) => context.refresh())\n }\n }\n\n refresh() {\n this.selectorObserverMap.forEach((observer) => observer.refresh())\n this.attributeObserverMap.forEach((observer) => observer.refresh())\n }\n\n stop() {\n if (this.started) {\n this.started = false\n this.disconnectAllOutlets()\n this.stopSelectorObservers()\n this.stopAttributeObservers()\n }\n }\n\n stopSelectorObservers() {\n if (this.selectorObserverMap.size > 0) {\n this.selectorObserverMap.forEach((observer) => observer.stop())\n this.selectorObserverMap.clear()\n }\n }\n\n stopAttributeObservers() {\n if (this.attributeObserverMap.size > 0) {\n this.attributeObserverMap.forEach((observer) => observer.stop())\n this.attributeObserverMap.clear()\n }\n }\n\n // Selector observer delegate\n\n selectorMatched(element: Element, _selector: string, { outletName }: OutletObserverDetails) {\n const outlet = this.getOutlet(element, outletName)\n\n if (outlet) {\n this.connectOutlet(outlet, element, outletName)\n }\n }\n\n selectorUnmatched(element: Element, _selector: string, { outletName }: OutletObserverDetails) {\n const outlet = this.getOutletFromMap(element, outletName)\n\n if (outlet) {\n this.disconnectOutlet(outlet, element, outletName)\n }\n }\n\n selectorMatchElement(element: Element, { outletName }: OutletObserverDetails) {\n const selector = this.selector(outletName)\n const hasOutlet = this.hasOutlet(element, outletName)\n const hasOutletController = element.matches(`[${this.schema.controllerAttribute}~=${outletName}]`)\n\n if (selector) {\n return hasOutlet && hasOutletController && element.matches(selector)\n } else {\n return false\n }\n }\n\n // Attribute observer delegate\n\n elementMatchedAttribute(_element: Element, attributeName: string) {\n const outletName = this.getOutletNameFromOutletAttributeName(attributeName)\n\n if (outletName) {\n this.updateSelectorObserverForOutlet(outletName)\n }\n }\n\n elementAttributeValueChanged(_element: Element, attributeName: string) {\n const outletName = this.getOutletNameFromOutletAttributeName(attributeName)\n\n if (outletName) {\n this.updateSelectorObserverForOutlet(outletName)\n }\n }\n\n elementUnmatchedAttribute(_element: Element, attributeName: string) {\n const outletName = this.getOutletNameFromOutletAttributeName(attributeName)\n\n if (outletName) {\n this.updateSelectorObserverForOutlet(outletName)\n }\n }\n\n // Outlet management\n\n connectOutlet(outlet: Controller, element: Element, outletName: string) {\n if (!this.outletElementsByName.has(outletName, element)) {\n this.outletsByName.add(outletName, outlet)\n this.outletElementsByName.add(outletName, element)\n this.selectorObserverMap.get(outletName)?.pause(() => this.delegate.outletConnected(outlet, element, outletName))\n }\n }\n\n disconnectOutlet(outlet: Controller, element: Element, outletName: string) {\n if (this.outletElementsByName.has(outletName, element)) {\n this.outletsByName.delete(outletName, outlet)\n this.outletElementsByName.delete(outletName, element)\n this.selectorObserverMap\n .get(outletName)\n ?.pause(() => this.delegate.outletDisconnected(outlet, element, outletName))\n }\n }\n\n disconnectAllOutlets() {\n for (const outletName of this.outletElementsByName.keys) {\n for (const element of this.outletElementsByName.getValuesForKey(outletName)) {\n for (const outlet of this.outletsByName.getValuesForKey(outletName)) {\n this.disconnectOutlet(outlet, element, outletName)\n }\n }\n }\n }\n\n // Observer management\n\n private updateSelectorObserverForOutlet(outletName: string) {\n const observer = this.selectorObserverMap.get(outletName)\n\n if (observer) {\n observer.selector = this.selector(outletName)\n }\n }\n\n private setupSelectorObserverForOutlet(outletName: string) {\n const selector = this.selector(outletName)\n const selectorObserver = new SelectorObserver(document.body, selector!, this, { outletName })\n\n this.selectorObserverMap.set(outletName, selectorObserver)\n\n selectorObserver.start()\n }\n\n private setupAttributeObserverForOutlet(outletName: string) {\n const attributeName = this.attributeNameForOutletName(outletName)\n const attributeObserver = new AttributeObserver(this.scope.element, attributeName, this)\n\n this.attributeObserverMap.set(outletName, attributeObserver)\n\n attributeObserver.start()\n }\n\n // Private\n\n private selector(outletName: string) {\n return this.scope.outlets.getSelectorForOutletName(outletName)\n }\n\n private attributeNameForOutletName(outletName: string) {\n return this.scope.schema.outletAttributeForScope(this.identifier, outletName)\n }\n\n private getOutletNameFromOutletAttributeName(attributeName: string) {\n return this.outletDefinitions.find((outletName) => this.attributeNameForOutletName(outletName) === attributeName)\n }\n\n private get outletDependencies() {\n const dependencies = new Multimap<string, string>()\n\n this.router.modules.forEach((module) => {\n const constructor = module.definition.controllerConstructor\n const outlets = readInheritableStaticArrayValues(constructor, \"outlets\")\n\n outlets.forEach((outlet) => dependencies.add(outlet, module.identifier))\n })\n\n return dependencies\n }\n\n private get outletDefinitions() {\n return this.outletDependencies.getKeysForValue(this.identifier)\n }\n\n private get dependentControllerIdentifiers() {\n return this.outletDependencies.getValuesForKey(this.identifier)\n }\n\n private get dependentContexts() {\n const identifiers = this.dependentControllerIdentifiers\n return this.router.contexts.filter((context) => identifiers.includes(context.identifier))\n }\n\n private hasOutlet(element: Element, outletName: string) {\n return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName)\n }\n\n private getOutlet(element: Element, outletName: string) {\n return this.application.getControllerForElementAndIdentifier(element, outletName)\n }\n\n private getOutletFromMap(element: Element, outletName: string) {\n return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element)\n }\n\n private get scope() {\n return this.context.scope\n }\n\n private get schema() {\n return this.context.schema\n }\n\n private get identifier() {\n return this.context.identifier\n }\n\n private get application() {\n return this.context.application\n }\n\n private get router() {\n return this.application.router\n }\n}\n","import { Application } from \"./application\"\nimport { BindingObserver } from \"./binding_observer\"\nimport { Controller } from \"./controller\"\nimport { Dispatcher } from \"./dispatcher\"\nimport { ErrorHandler } from \"./error_handler\"\nimport { Module } from \"./module\"\nimport { Schema } from \"./schema\"\nimport { Scope } from \"./scope\"\nimport { ValueObserver } from \"./value_observer\"\nimport { TargetObserver, TargetObserverDelegate } from \"./target_observer\"\nimport { OutletObserver, OutletObserverDelegate } from \"./outlet_observer\"\nimport { namespaceCamelize } from \"./string_helpers\"\n\nexport class Context implements ErrorHandler, TargetObserverDelegate, OutletObserverDelegate {\n readonly module: Module\n readonly scope: Scope\n readonly controller: Controller\n private bindingObserver: BindingObserver\n private valueObserver: ValueObserver\n private targetObserver: TargetObserver\n private outletObserver: OutletObserver\n\n constructor(module: Module, scope: Scope) {\n this.module = module\n this.scope = scope\n this.controller = new module.controllerConstructor(this)\n this.bindingObserver = new BindingObserver(this, this.dispatcher)\n this.valueObserver = new ValueObserver(this, this.controller)\n this.targetObserver = new TargetObserver(this, this)\n this.outletObserver = new OutletObserver(this, this)\n\n try {\n this.controller.initialize()\n this.logDebugActivity(\"initialize\")\n } catch (error: any) {\n this.handleError(error, \"initializing controller\")\n }\n }\n\n connect() {\n this.bindingObserver.start()\n this.valueObserver.start()\n this.targetObserver.start()\n this.outletObserver.start()\n\n try {\n this.controller.connect()\n this.logDebugActivity(\"connect\")\n } catch (error: any) {\n this.handleError(error, \"connecting controller\")\n }\n }\n\n refresh() {\n this.outletObserver.refresh()\n }\n\n disconnect() {\n try {\n this.controller.disconnect()\n this.logDebugActivity(\"disconnect\")\n } catch (error: any) {\n this.handleError(error, \"disconnecting controller\")\n }\n\n this.outletObserver.stop()\n this.targetObserver.stop()\n this.valueObserver.stop()\n this.bindingObserver.stop()\n }\n\n get application(): Application {\n return this.module.application\n }\n\n get identifier(): string {\n return this.module.identifier\n }\n\n get schema(): Schema {\n return this.application.schema\n }\n\n get dispatcher(): Dispatcher {\n return this.application.dispatcher\n }\n\n get element(): Element {\n return this.scope.element\n }\n\n get parentElement(): Element | null {\n return this.element.parentElement\n }\n\n // Error handling\n\n handleError(error: Error, message: string, detail: object = {}) {\n const { identifier, controller, element } = this\n detail = Object.assign({ identifier, controller, element }, detail)\n this.application.handleError(error, `Error ${message}`, detail)\n }\n\n // Debug logging\n\n logDebugActivity = (functionName: string, detail: object = {}): void => {\n const { identifier, controller, element } = this\n detail = Object.assign({ identifier, controller, element }, detail)\n this.application.logDebugActivity(this.identifier, functionName, detail)\n }\n\n // Target observer delegate\n\n targetConnected(element: Element, name: string) {\n this.invokeControllerMethod(`${name}TargetConnected`, element)\n }\n\n targetDisconnected(element: Element, name: string) {\n this.invokeControllerMethod(`${name}TargetDisconnected`, element)\n }\n\n // Outlet observer delegate\n\n outletConnected(outlet: Controller, element: Element, name: string) {\n this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element)\n }\n\n outletDisconnected(outlet: Controller, element: Element, name: string) {\n this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element)\n }\n\n // Private\n\n invokeControllerMethod(methodName: string, ...args: any[]) {\n const controller: any = this.controller\n if (typeof controller[methodName] == \"function\") {\n controller[methodName](...args)\n }\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\n\nexport type Blessing<T> = (constructor: Constructor<T>) => PropertyDescriptorMap\n\nexport interface Blessable<T> extends Constructor<T> {\n readonly blessings?: Blessing<T>[]\n}\n\nexport function bless<T>(constructor: Blessable<T>): Constructor<T> {\n return shadow(constructor, getBlessedProperties(constructor))\n}\n\nfunction shadow<T>(constructor: Constructor<T>, properties: PropertyDescriptorMap) {\n const shadowConstructor = extend(constructor)\n const shadowProperties = getShadowProperties(constructor.prototype, properties)\n Object.defineProperties(shadowConstructor.prototype, shadowProperties)\n return shadowConstructor\n}\n\nfunction getBlessedProperties<T>(constructor: Constructor<T>) {\n const blessings = readInheritableStaticArrayValues(constructor, \"blessings\") as Blessing<T>[]\n return blessings.reduce((blessedProperties, blessing) => {\n const properties = blessing(constructor)\n for (const key in properties) {\n const descriptor = blessedProperties[key] || ({} as PropertyDescriptor)\n blessedProperties[key] = Object.assign(descriptor, properties[key])\n }\n return blessedProperties\n }, {} as PropertyDescriptorMap)\n}\n\nfunction getShadowProperties(prototype: any, properties: PropertyDescriptorMap) {\n return getOwnKeys(properties).reduce((shadowProperties, key) => {\n const descriptor = getShadowedDescriptor(prototype, properties, key)\n if (descriptor) {\n Object.assign(shadowProperties, { [key]: descriptor })\n }\n return shadowProperties\n }, {} as PropertyDescriptorMap)\n}\n\nfunction getShadowedDescriptor(prototype: any, properties: PropertyDescriptorMap, key: string | symbol) {\n const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key)\n const shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor\n if (!shadowedByValue) {\n const descriptor = Object.getOwnPropertyDescriptor(properties, key)!.value\n if (shadowingDescriptor) {\n descriptor.get = shadowingDescriptor.get || descriptor.get\n descriptor.set = shadowingDescriptor.set || descriptor.set\n }\n return descriptor\n }\n}\n\nconst getOwnKeys = (() => {\n if (typeof Object.getOwnPropertySymbols == \"function\") {\n return (object: any) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)]\n } else {\n return Object.getOwnPropertyNames\n }\n})()\n\nconst extend = (() => {\n function extendWithReflect<T extends Constructor<any>>(constructor: T): T {\n function extended() {\n return Reflect.construct(constructor, arguments, new.target)\n }\n\n extended.prototype = Object.create(constructor.prototype, {\n constructor: { value: extended },\n })\n\n Reflect.setPrototypeOf(extended, constructor)\n return extended as any\n }\n\n function testReflectExtension() {\n const a = function (this: any) {\n this.a.call(this)\n } as any\n const b = extendWithReflect(a)\n b.prototype.a = function () {}\n return new b()\n }\n\n try {\n testReflectExtension()\n return extendWithReflect\n } catch (error: any) {\n return <T extends Constructor<any>>(constructor: T) => class extended extends constructor {}\n }\n})()\n","import { Application } from \"./application\"\nimport { Context } from \"./context\"\nimport { ControllerConstructor } from \"./controller\"\nimport { Definition, blessDefinition } from \"./definition\"\nimport { Scope } from \"./scope\"\n\nexport class Module {\n readonly application: Application\n readonly definition: Definition\n private contextsByScope: WeakMap<Scope, Context>\n private connectedContexts: Set<Context>\n\n constructor(application: Application, definition: Definition) {\n this.application = application\n this.definition = blessDefinition(definition)\n this.contextsByScope = new WeakMap()\n this.connectedContexts = new Set()\n }\n\n get identifier(): string {\n return this.definition.identifier\n }\n\n get controllerConstructor(): ControllerConstructor {\n return this.definition.controllerConstructor\n }\n\n get contexts(): Context[] {\n return Array.from(this.connectedContexts)\n }\n\n connectContextForScope(scope: Scope) {\n const context = this.fetchContextForScope(scope)\n this.connectedContexts.add(context)\n context.connect()\n }\n\n disconnectContextForScope(scope: Scope) {\n const context = this.contextsByScope.get(scope)\n if (context) {\n this.connectedContexts.delete(context)\n context.disconnect()\n }\n }\n\n private fetchContextForScope(scope: Scope): Context {\n let context = this.contextsByScope.get(scope)\n if (!context) {\n context = new Context(this, scope)\n this.contextsByScope.set(scope, context)\n }\n return context\n }\n}\n","import { bless } from \"./blessing\"\nimport { ControllerConstructor } from \"./controller\"\n\nexport interface Definition {\n identifier: string\n controllerConstructor: ControllerConstructor\n}\n\nexport function blessDefinition(definition: Definition): Definition {\n return {\n identifier: definition.identifier,\n controllerConstructor: bless(definition.controllerConstructor),\n }\n}\n","import { Scope } from \"./scope\"\nimport { tokenize } from \"./string_helpers\"\n\nexport class ClassMap {\n readonly scope: Scope\n\n constructor(scope: Scope) {\n this.scope = scope\n }\n\n has(name: string) {\n return this.data.has(this.getDataKey(name))\n }\n\n get(name: string): string | undefined {\n return this.getAll(name)[0]\n }\n\n getAll(name: string) {\n const tokenString = this.data.get(this.getDataKey(name)) || \"\"\n return tokenize(tokenString)\n }\n\n getAttributeName(name: string) {\n return this.data.getAttributeNameForKey(this.getDataKey(name))\n }\n\n getDataKey(name: string) {\n return `${name}-class`\n }\n\n get data() {\n return this.scope.data\n }\n}\n","import { Scope } from \"./scope\"\nimport { dasherize } from \"./string_helpers\"\n\nexport class DataMap {\n readonly scope: Scope\n\n constructor(scope: Scope) {\n this.scope = scope\n }\n\n get element(): Element {\n return this.scope.element\n }\n\n get identifier(): string {\n return this.scope.identifier\n }\n\n get(key: string): string | null {\n const name = this.getAttributeNameForKey(key)\n return this.element.getAttribute(name)\n }\n\n set(key: string, value: string): string | null {\n const name = this.getAttributeNameForKey(key)\n this.element.setAttribute(name, value)\n return this.get(key)\n }\n\n has(key: string): boolean {\n const name = this.getAttributeNameForKey(key)\n return this.element.hasAttribute(name)\n }\n\n delete(key: string): boolean {\n if (this.has(key)) {\n const name = this.getAttributeNameForKey(key)\n this.element.removeAttribute(name)\n return true\n } else {\n return false\n }\n }\n\n getAttributeNameForKey(key: string): string {\n return `data-${this.identifier}-${dasherize(key)}`\n }\n}\n","import { Logger } from \"./logger\"\n\nexport class Guide {\n readonly logger: Logger\n readonly warnedKeysByObject: WeakMap<any, Set<string>> = new WeakMap()\n\n constructor(logger: Logger) {\n this.logger = logger\n }\n\n warn(object: any, key: string, message: string) {\n let warnedKeys: Set<string> | undefined = this.warnedKeysByObject.get(object)\n\n if (!warnedKeys) {\n warnedKeys = new Set()\n this.warnedKeysByObject.set(object, warnedKeys)\n }\n\n if (!warnedKeys.has(key)) {\n warnedKeys.add(key)\n this.logger.warn(message, object)\n }\n }\n}\n","export function attributeValueContainsToken(attributeName: string, token: string) {\n return `[${attributeName}~=\"${token}\"]`\n}\n","import { Scope } from \"./scope\"\nimport { attributeValueContainsToken } from \"./selectors\"\n\nexport class TargetSet {\n readonly scope: Scope\n\n constructor(scope: Scope) {\n this.scope = scope\n }\n\n get element() {\n return this.scope.element\n }\n\n get identifier() {\n return this.scope.identifier\n }\n\n get schema() {\n return this.scope.schema\n }\n\n has(targetName: string) {\n return this.find(targetName) != null\n }\n\n find(...targetNames: string[]) {\n return targetNames.reduce(\n (target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName),\n undefined as Element | undefined\n )\n }\n\n findAll(...targetNames: string[]) {\n return targetNames.reduce(\n (targets, targetName) => [\n ...targets,\n ...this.findAllTargets(targetName),\n ...this.findAllLegacyTargets(targetName),\n ],\n [] as Element[]\n )\n }\n\n private findTarget(targetName: string) {\n const selector = this.getSelectorForTargetName(targetName)\n return this.scope.findElement(selector)\n }\n\n private findAllTargets(targetName: string) {\n const selector = this.getSelectorForTargetName(targetName)\n return this.scope.findAllElements(selector)\n }\n\n private getSelectorForTargetName(targetName: string) {\n const attributeName = this.schema.targetAttributeForScope(this.identifier)\n return attributeValueContainsToken(attributeName, targetName)\n }\n\n private findLegacyTarget(targetName: string) {\n const selector = this.getLegacySelectorForTargetName(targetName)\n return this.deprecate(this.scope.findElement(selector), targetName)\n }\n\n private findAllLegacyTargets(targetName: string) {\n const selector = this.getLegacySelectorForTargetName(targetName)\n return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName))\n }\n\n private getLegacySelectorForTargetName(targetName: string) {\n const targetDescriptor = `${this.identifier}.${targetName}`\n return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor)\n }\n\n private deprecate<T>(element: T, targetName: string) {\n if (element) {\n const { identifier } = this\n const attributeName = this.schema.targetAttribute\n const revisedAttributeName = this.schema.targetAttributeForScope(identifier)\n this.guide.warn(\n element,\n `target:${targetName}`,\n `Please replace ${attributeName}=\"${identifier}.${targetName}\" with ${revisedAttributeName}=\"${targetName}\". ` +\n `The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`\n )\n }\n return element\n }\n\n private get guide() {\n return this.scope.guide\n }\n}\n","import { Scope } from \"./scope\"\n\nexport class OutletSet {\n readonly scope: Scope\n readonly controllerElement: Element\n\n constructor(scope: Scope, controllerElement: Element) {\n this.scope = scope\n this.controllerElement = controllerElement\n }\n\n get element() {\n return this.scope.element\n }\n\n get identifier() {\n return this.scope.identifier\n }\n\n get schema() {\n return this.scope.schema\n }\n\n has(outletName: string) {\n return this.find(outletName) != null\n }\n\n find(...outletNames: string[]) {\n return outletNames.reduce(\n (outlet, outletName) => outlet || this.findOutlet(outletName),\n undefined as Element | undefined\n )\n }\n\n findAll(...outletNames: string[]) {\n return outletNames.reduce(\n (outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)],\n [] as Element[]\n )\n }\n\n getSelectorForOutletName(outletName: string) {\n const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName)\n return this.controllerElement.getAttribute(attributeName)\n }\n\n private findOutlet(outletName: string) {\n const selector = this.getSelectorForOutletName(outletName)\n if (selector) return this.findElement(selector, outletName)\n }\n\n private findAllOutlets(outletName: string) {\n const selector = this.getSelectorForOutletName(outletName)\n return selector ? this.findAllElements(selector, outletName) : []\n }\n\n private findElement(selector: string, outletName: string): Element | undefined {\n const elements = this.scope.queryElements(selector)\n return elements.filter((element) => this.matchesElement(element, selector, outletName))[0]\n }\n\n private findAllElements(selector: string, outletName: string): Element[] {\n const elements = this.scope.queryElements(selector)\n return elements.filter((element) => this.matchesElement(element, selector, outletName))\n }\n\n private matchesElement(element: Element, selector: string, outletName: string): boolean {\n const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || \"\"\n return element.matches(selector) && controllerAttribute.split(\" \").includes(outletName)\n }\n}\n","import { ClassMap } from \"./class_map\"\nimport { DataMap } from \"./data_map\"\nimport { Guide } from \"./guide\"\nimport { Logger } from \"./logger\"\nimport { Schema } from \"./schema\"\nimport { attributeValueContainsToken } from \"./selectors\"\nimport { TargetSet } from \"./target_set\"\nimport { OutletSet } from \"./outlet_set\"\n\nexport class Scope {\n readonly schema: Schema\n readonly element: Element\n readonly identifier: string\n readonly guide: Guide\n readonly outlets: OutletSet\n readonly targets = new TargetSet(this)\n readonly classes = new ClassMap(this)\n readonly data = new DataMap(this)\n\n constructor(schema: Schema, element: Element, identifier: string, logger: Logger) {\n this.schema = schema\n this.element = element\n this.identifier = identifier\n this.guide = new Guide(logger)\n this.outlets = new OutletSet(this.documentScope, element)\n }\n\n findElement(selector: string): Element | undefined {\n return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement)\n }\n\n findAllElements(selector: string): Element[] {\n return [\n ...(this.element.matches(selector) ? [this.element] : []),\n ...this.queryElements(selector).filter(this.containsElement),\n ]\n }\n\n containsElement = (element: Element): boolean => {\n return element.closest(this.controllerSelector) === this.element\n }\n\n queryElements(selector: string): Element[] {\n return Array.from(this.element.querySelectorAll(selector))\n }\n\n private get controllerSelector(): string {\n return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier)\n }\n\n private get isDocumentScope() {\n return this.element === document.documentElement\n }\n\n private get documentScope(): Scope {\n return this.isDocumentScope\n ? this\n : new Scope(this.schema, document.documentElement, this.identifier, this.guide.logger)\n }\n}\n","import { ErrorHandler } from \"./error_handler\"\nimport { Schema } from \"./schema\"\nimport { Scope } from \"./scope\"\nimport { Token, ValueListObserver, ValueListObserverDelegate } from \"../mutation-observers\"\n\nexport interface ScopeObserverDelegate extends ErrorHandler {\n createScopeForElementAndIdentifier(element: Element, identifier: string): Scope\n scopeConnected(scope: Scope): void\n scopeDisconnected(scope: Scope): void\n}\n\nexport class ScopeObserver implements ValueListObserverDelegate<Scope> {\n readonly element: Element\n readonly schema: Schema\n private delegate: ScopeObserverDelegate\n private valueListObserver: ValueListObserver<Scope>\n private scopesByIdentifierByElement: WeakMap<Element, Map<string, Scope>>\n private scopeReferenceCounts: WeakMap<Scope, number>\n\n constructor(element: Element, schema: Schema, delegate: ScopeObserverDelegate) {\n this.element = element\n this.schema = schema\n this.delegate = delegate\n this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this)\n this.scopesByIdentifierByElement = new WeakMap()\n this.scopeReferenceCounts = new WeakMap()\n }\n\n start() {\n this.valueListObserver.start()\n }\n\n stop() {\n this.valueListObserver.stop()\n }\n\n get controllerAttribute() {\n return this.schema.controllerAttribute\n }\n\n // Value observer delegate\n\n parseValueForToken(token: Token): Scope | undefined {\n const { element, content: identifier } = token\n return this.parseValueForElementAndIdentifier(element, identifier)\n }\n\n parseValueForElementAndIdentifier(element: Element, identifier: string): Scope | undefined {\n const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element)\n\n let scope = scopesByIdentifier.get(identifier)\n if (!scope) {\n scope = this.delegate.createScopeForElementAndIdentifier(element, identifier)\n scopesByIdentifier.set(identifier, scope)\n }\n\n return scope\n }\n\n elementMatchedValue(element: Element, value: Scope) {\n const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1\n this.scopeReferenceCounts.set(value, referenceCount)\n if (referenceCount == 1) {\n this.delegate.scopeConnected(value)\n }\n }\n\n elementUnmatchedValue(element: Element, value: Scope) {\n const referenceCount = this.scopeReferenceCounts.get(value)\n if (referenceCount) {\n this.scopeReferenceCounts.set(value, referenceCount - 1)\n if (referenceCount == 1) {\n this.delegate.scopeDisconnected(value)\n }\n }\n }\n\n private fetchScopesByIdentifierForElement(element: Element) {\n let scopesByIdentifier = this.scopesByIdentifierByElement.get(element)\n if (!scopesByIdentifier) {\n scopesByIdentifier = new Map()\n this.scopesByIdentifierByElement.set(element, scopesByIdentifier)\n }\n return scopesByIdentifier\n }\n}\n","import { Application } from \"./application\"\nimport { Context } from \"./context\"\nimport { Definition } from \"./definition\"\nimport { Module } from \"./module\"\nimport { Multimap } from \"../multimap\"\nimport { Scope } from \"./scope\"\nimport { ScopeObserver, ScopeObserverDelegate } from \"./scope_observer\"\n\nexport class Router implements ScopeObserverDelegate {\n readonly application: Application\n private scopeObserver: ScopeObserver\n private scopesByIdentifier: Multimap<string, Scope>\n private modulesByIdentifier: Map<string, Module>\n\n constructor(application: Application) {\n this.application = application\n this.scopeObserver = new ScopeObserver(this.element, this.schema, this)\n this.scopesByIdentifier = new Multimap()\n this.modulesByIdentifier = new Map()\n }\n\n get element() {\n return this.application.element\n }\n\n get schema() {\n return this.application.schema\n }\n\n get logger() {\n return this.application.logger\n }\n\n get controllerAttribute(): string {\n return this.schema.controllerAttribute\n }\n\n get modules() {\n return Array.from(this.modulesByIdentifier.values())\n }\n\n get contexts() {\n return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), [] as Context[])\n }\n\n start() {\n this.scopeObserver.start()\n }\n\n stop() {\n this.scopeObserver.stop()\n }\n\n loadDefinition(definition: Definition) {\n this.unloadIdentifier(definition.identifier)\n const module = new Module(this.application, definition)\n this.connectModule(module)\n const afterLoad = (definition.controllerConstructor as any).afterLoad\n if (afterLoad) {\n afterLoad.call(definition.controllerConstructor, definition.identifier, this.application)\n }\n }\n\n unloadIdentifier(identifier: string) {\n const module = this.modulesByIdentifier.get(identifier)\n if (module) {\n this.disconnectModule(module)\n }\n }\n\n getContextForElementAndIdentifier(element: Element, identifier: string) {\n const module = this.modulesByIdentifier.get(identifier)\n if (module) {\n return module.contexts.find((context) => context.element == element)\n }\n }\n\n proposeToConnectScopeForElementAndIdentifier(element: Element, identifier: string) {\n const scope = this.scopeObserver.parseValueForElementAndIdentifier(element, identifier)\n\n if (scope) {\n this.scopeObserver.elementMatchedValue(scope.element, scope)\n } else {\n console.error(`Couldn't find or create scope for identifier: \"${identifier}\" and element:`, element)\n }\n }\n\n // Error handler delegate\n\n handleError(error: Error, message: string, detail: any) {\n this.application.handleError(error, message, detail)\n }\n\n // Scope observer delegate\n\n createScopeForElementAndIdentifier(element: Element, identifier: string) {\n return new Scope(this.schema, element, identifier, this.logger)\n }\n\n scopeConnected(scope: Scope) {\n this.scopesByIdentifier.add(scope.identifier, scope)\n const module = this.modulesByIdentifier.get(scope.identifier)\n if (module) {\n module.connectContextForScope(scope)\n }\n }\n\n scopeDisconnected(scope: Scope) {\n this.scopesByIdentifier.delete(scope.identifier, scope)\n const module = this.modulesByIdentifier.get(scope.identifier)\n if (module) {\n module.disconnectContextForScope(scope)\n }\n }\n\n // Modules\n\n private connectModule(module: Module) {\n this.modulesByIdentifier.set(module.identifier, module)\n const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier)\n scopes.forEach((scope) => module.connectContextForScope(scope))\n }\n\n private disconnectModule(module: Module) {\n this.modulesByIdentifier.delete(module.identifier)\n const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier)\n scopes.forEach((scope) => module.disconnectContextForScope(scope))\n }\n}\n","export interface Schema {\n controllerAttribute: string\n actionAttribute: string\n targetAttribute: string\n targetAttributeForScope(identifier: string): string\n outletAttributeForScope(identifier: string, outlet: string): string\n keyMappings: { [key: string]: string }\n}\n\nexport const defaultSchema: Schema = {\n controllerAttribute: \"data-controller\",\n actionAttribute: \"data-action\",\n targetAttribute: \"data-target\",\n targetAttributeForScope: (identifier) => `data-${identifier}-target`,\n outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`,\n keyMappings: {\n enter: \"Enter\",\n tab: \"Tab\",\n esc: \"Escape\",\n space: \" \",\n up: \"ArrowUp\",\n down: \"ArrowDown\",\n left: \"ArrowLeft\",\n right: \"ArrowRight\",\n home: \"Home\",\n end: \"End\",\n page_up: \"PageUp\",\n page_down: \"PageDown\",\n // [a-z]\n ...objectFromEntries(\"abcdefghijklmnopqrstuvwxyz\".split(\"\").map((c) => [c, c])),\n // [0-9]\n ...objectFromEntries(\"0123456789\".split(\"\").map((n) => [n, n])),\n },\n}\n\nfunction objectFromEntries(array: [string, any][]): object {\n // polyfill\n return array.reduce((memo, [k, v]) => ({ ...memo, [k]: v }), {})\n}\n","import { Controller, ControllerConstructor } from \"./controller\"\nimport { Definition } from \"./definition\"\nimport { Dispatcher } from \"./dispatcher\"\nimport { ErrorHandler } from \"./error_handler\"\nimport { Logger } from \"./logger\"\nimport { Router } from \"./router\"\nimport { Schema, defaultSchema } from \"./schema\"\nimport { ActionDescriptorFilter, ActionDescriptorFilters, defaultActionDescriptorFilters } from \"./action_descriptor\"\n\nexport class Application implements ErrorHandler {\n readonly element: Element\n readonly schema: Schema\n readonly dispatcher: Dispatcher\n readonly router: Router\n readonly actionDescriptorFilters: ActionDescriptorFilters\n logger: Logger = console\n debug = false\n\n static start(element?: Element, schema?: Schema): Application {\n const application = new this(element, schema)\n application.start()\n return application\n }\n\n constructor(element: Element = document.documentElement, schema: Schema = defaultSchema) {\n this.element = element\n this.schema = schema\n this.dispatcher = new Dispatcher(this)\n this.router = new Router(this)\n this.actionDescriptorFilters = { ...defaultActionDescriptorFilters }\n }\n\n async start() {\n await domReady()\n this.logDebugActivity(\"application\", \"starting\")\n this.dispatcher.start()\n this.router.start()\n this.logDebugActivity(\"application\", \"start\")\n }\n\n stop() {\n this.logDebugActivity(\"application\", \"stopping\")\n this.dispatcher.stop()\n this.router.stop()\n this.logDebugActivity(\"application\", \"stop\")\n }\n\n register(identifier: string, controllerConstructor: ControllerConstructor) {\n this.load({ identifier, controllerConstructor })\n }\n\n registerActionOption(name: string, filter: ActionDescriptorFilter) {\n this.actionDescriptorFilters[name] = filter\n }\n\n load(...definitions: Definition[]): void\n load(definitions: Definition[]): void\n load(head: Definition | Definition[], ...rest: Definition[]) {\n const definitions = Array.isArray(head) ? head : [head, ...rest]\n definitions.forEach((definition) => {\n if ((definition.controllerConstructor as any).shouldLoad) {\n this.router.loadDefinition(definition)\n }\n })\n }\n\n unload(...identifiers: string[]): void\n unload(identifiers: string[]): void\n unload(head: string | string[], ...rest: string[]) {\n const identifiers = Array.isArray(head) ? head : [head, ...rest]\n identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier))\n }\n\n // Controllers\n\n get controllers(): Controller[] {\n return this.router.contexts.map((context) => context.controller)\n }\n\n getControllerForElementAndIdentifier(element: Element, identifier: string): Controller | null {\n const context = this.router.getContextForElementAndIdentifier(element, identifier)\n return context ? context.controller : null\n }\n\n // Error handling\n\n handleError(error: Error, message: string, detail: object) {\n this.logger.error(`%s\\n\\n%o\\n\\n%o`, message, error, detail)\n\n window.onerror?.(message, \"\", 0, 0, error)\n }\n\n // Debug logging\n\n logDebugActivity = (identifier: string, functionName: string, detail: object = {}): void => {\n if (this.debug) {\n this.logFormattedMessage(identifier, functionName, detail)\n }\n }\n\n private logFormattedMessage(identifier: string, functionName: string, detail: object = {}) {\n detail = Object.assign({ application: this }, detail)\n\n this.logger.groupCollapsed(`${identifier} #${functionName}`)\n this.logger.log(\"details:\", { ...detail })\n this.logger.groupEnd()\n }\n}\n\nfunction domReady() {\n return new Promise<void>((resolve) => {\n if (document.readyState == \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => resolve())\n } else {\n resolve()\n }\n })\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\nimport { capitalize, namespaceCamelize } from \"./string_helpers\"\n\nexport function OutletPropertiesBlessing<T>(constructor: Constructor<T>) {\n const outlets = readInheritableStaticArrayValues(constructor, \"outlets\")\n return outlets.reduce((properties: any, outletDefinition: any) => {\n return Object.assign(properties, propertiesForOutletDefinition(outletDefinition))\n }, {} as PropertyDescriptorMap)\n}\n\nfunction getOutletController(controller: Controller, element: Element, identifier: string) {\n return controller.application.getControllerForElementAndIdentifier(element, identifier)\n}\n\nfunction getControllerAndEnsureConnectedScope(controller: Controller, element: Element, outletName: string) {\n let outletController = getOutletController(controller, element, outletName)\n if (outletController) return outletController\n\n controller.application.router.proposeToConnectScopeForElementAndIdentifier(element, outletName)\n\n outletController = getOutletController(controller, element, outletName)\n if (outletController) return outletController\n}\n\nfunction propertiesForOutletDefinition(name: string) {\n const camelizedName = namespaceCamelize(name)\n\n return {\n [`${camelizedName}Outlet`]: {\n get(this: Controller) {\n const outletElement = this.outlets.find(name)\n const selector = this.outlets.getSelectorForOutletName(name)\n\n if (outletElement) {\n const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name)\n\n if (outletController) return outletController\n\n throw new Error(\n `The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`\n )\n }\n\n throw new Error(\n `Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`\n )\n },\n },\n\n [`${camelizedName}Outlets`]: {\n get(this: Controller) {\n const outlets = this.outlets.findAll(name)\n\n if (outlets.length > 0) {\n return outlets\n .map((outletElement: Element) => {\n const outletController = getControllerAndEnsureConnectedScope(this, outletElement, name)\n\n if (outletController) return outletController\n\n console.warn(\n `The provided outlet element is missing an outlet controller \"${name}\" instance for host controller \"${this.identifier}\"`,\n outletElement\n )\n })\n .filter((controller) => controller) as Controller[]\n }\n\n return []\n },\n },\n\n [`${camelizedName}OutletElement`]: {\n get(this: Controller) {\n const outletElement = this.outlets.find(name)\n const selector = this.outlets.getSelectorForOutletName(name)\n\n if (outletElement) {\n return outletElement\n } else {\n throw new Error(\n `Missing outlet element \"${name}\" for host controller \"${this.identifier}\". Stimulus couldn't find a matching outlet element using selector \"${selector}\".`\n )\n }\n },\n },\n\n [`${camelizedName}OutletElements`]: {\n get(this: Controller) {\n return this.outlets.findAll(name)\n },\n },\n\n [`has${capitalize(camelizedName)}Outlet`]: {\n get(this: Controller) {\n return this.outlets.has(name)\n },\n },\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticObjectPairs } from \"./inheritable_statics\"\nimport { camelize, capitalize, dasherize } from \"./string_helpers\"\nimport { isSomething, hasProperty } from \"./utils\"\n\nexport function ValuePropertiesBlessing<T>(constructor: Constructor<T>) {\n const valueDefinitionPairs = readInheritableStaticObjectPairs<T, ValueTypeDefinition>(constructor, \"values\")\n const propertyDescriptorMap: PropertyDescriptorMap = {\n valueDescriptorMap: {\n get(this: Controller) {\n return valueDefinitionPairs.reduce((result, valueDefinitionPair) => {\n const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier)\n const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key)\n return Object.assign(result, { [attributeName]: valueDescriptor })\n }, {} as ValueDescriptorMap)\n },\n },\n }\n\n return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => {\n return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair))\n }, propertyDescriptorMap)\n}\n\nexport function propertiesForValueDefinitionPair<T>(\n valueDefinitionPair: ValueDefinitionPair,\n controller?: string\n): PropertyDescriptorMap {\n const definition = parseValueDefinitionPair(valueDefinitionPair, controller)\n const { key, name, reader: read, writer: write } = definition\n\n return {\n [name]: {\n get(this: Controller) {\n const value = this.data.get(key)\n if (value !== null) {\n return read(value)\n } else {\n return definition.defaultValue\n }\n },\n\n set(this: Controller, value: T | undefined) {\n if (value === undefined) {\n this.data.delete(key)\n } else {\n this.data.set(key, write(value))\n }\n },\n },\n\n [`has${capitalize(name)}`]: {\n get(this: Controller): boolean {\n return this.data.has(key) || definition.hasCustomDefaultValue\n },\n },\n }\n}\n\nexport type ValueDescriptor = {\n type: ValueType\n key: string\n name: string\n defaultValue: ValueTypeDefault\n hasCustomDefaultValue: boolean\n reader: Reader\n writer: Writer\n}\n\nexport type ValueDescriptorMap = { [attributeName: string]: ValueDescriptor }\n\nexport type ValueDefinitionMap = { [token: string]: ValueTypeDefinition }\n\nexport type ValueDefinitionPair = [string, ValueTypeDefinition]\n\nexport type ValueTypeConstant = typeof Array | typeof Boolean | typeof Number | typeof Object | typeof String\n\nexport type ValueTypeDefault = Array<any> | boolean | number | Object | string\n\nexport type ValueTypeObject = Partial<{ type: ValueTypeConstant; default: ValueTypeDefault }>\n\nexport type ValueTypeDefinition = ValueTypeConstant | ValueTypeDefault | ValueTypeObject\n\nexport type ValueType = \"array\" | \"boolean\" | \"number\" | \"object\" | \"string\"\n\nfunction parseValueDefinitionPair([token, typeDefinition]: ValueDefinitionPair, controller?: string): ValueDescriptor {\n return valueDescriptorForTokenAndTypeDefinition({\n controller,\n token,\n typeDefinition,\n })\n}\n\nexport function parseValueTypeConstant(constant?: ValueTypeConstant) {\n switch (constant) {\n case Array:\n return \"array\"\n case Boolean:\n return \"boolean\"\n case Number:\n return \"number\"\n case Object:\n return \"object\"\n case String:\n return \"string\"\n }\n}\n\nexport function parseValueTypeDefault(defaultValue?: ValueTypeDefault) {\n switch (typeof defaultValue) {\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return \"number\"\n case \"string\":\n return \"string\"\n }\n\n if (Array.isArray(defaultValue)) return \"array\"\n if (Object.prototype.toString.call(defaultValue) === \"[object Object]\") return \"object\"\n}\n\ntype ValueTypeObjectPayload = {\n controller?: string\n token: string\n typeObject: ValueTypeObject\n}\n\nexport function parseValueTypeObject(payload: ValueTypeObjectPayload) {\n const { controller, token, typeObject } = payload\n\n const hasType = isSomething(typeObject.type)\n const hasDefault = isSomething(typeObject.default)\n\n const fullObject = hasType && hasDefault\n const onlyType = hasType && !hasDefault\n const onlyDefault = !hasType && hasDefault\n\n const typeFromObject = parseValueTypeConstant(typeObject.type)\n const typeFromDefaultValue = parseValueTypeDefault(payload.typeObject.default)\n\n if (onlyType) return typeFromObject\n if (onlyDefault) return typeFromDefaultValue\n\n if (typeFromObject !== typeFromDefaultValue) {\n const propertyPath = controller ? `${controller}.${token}` : token\n\n throw new Error(\n `The specified default value for the Stimulus Value \"${propertyPath}\" must match the defined type \"${typeFromObject}\". The provided default value of \"${typeObject.default}\" is of type \"${typeFromDefaultValue}\".`\n )\n }\n\n if (fullObject) return typeFromObject\n}\n\ntype ValueTypeDefinitionPayload = {\n controller?: string\n token: string\n typeDefinition: ValueTypeDefinition\n}\n\nexport function parseValueTypeDefinition(payload: ValueTypeDefinitionPayload): ValueType {\n const { controller, token, typeDefinition } = payload\n\n const typeObject = { controller, token, typeObject: typeDefinition as ValueTypeObject }\n\n const typeFromObject = parseValueTypeObject(typeObject as ValueTypeObjectPayload)\n const typeFromDefaultValue = parseValueTypeDefault(typeDefinition as ValueTypeDefault)\n const typeFromConstant = parseValueTypeConstant(typeDefinition as ValueTypeConstant)\n\n const type = typeFromObject || typeFromDefaultValue || typeFromConstant\n\n if (type) return type\n\n const propertyPath = controller ? `${controller}.${typeDefinition}` : token\n\n throw new Error(`Unknown value type \"${propertyPath}\" for \"${token}\" value`)\n}\n\nexport function defaultValueForDefinition(typeDefinition: ValueTypeDefinition): ValueTypeDefault {\n const constant = parseValueTypeConstant(typeDefinition as ValueTypeConstant)\n if (constant) return defaultValuesByType[constant]\n\n const hasDefault = hasProperty(typeDefinition, \"default\")\n const hasType = hasProperty(typeDefinition, \"type\")\n const typeObject = typeDefinition as ValueTypeObject\n\n if (hasDefault) return typeObject.default!\n\n if (hasType) {\n const { type } = typeObject\n const constantFromType = parseValueTypeConstant(type)\n\n if (constantFromType) return defaultValuesByType[constantFromType]\n }\n\n return typeDefinition\n}\n\nfunction valueDescriptorForTokenAndTypeDefinition(payload: ValueTypeDefinitionPayload) {\n const { token, typeDefinition } = payload\n\n const key = `${dasherize(token)}-value`\n const type = parseValueTypeDefinition(payload)\n return {\n type,\n key,\n name: camelize(key),\n get defaultValue() {\n return defaultValueForDefinition(typeDefinition)\n },\n get hasCustomDefaultValue() {\n return parseValueTypeDefault(typeDefinition) !== undefined\n },\n reader: readers[type],\n writer: writers[type] || writers.default,\n }\n}\n\nconst defaultValuesByType = {\n get array() {\n return []\n },\n boolean: false,\n number: 0,\n get object() {\n return {}\n },\n string: \"\",\n}\n\ntype Reader = (value: string) => any\n\nconst readers: { [type: string]: Reader } = {\n array(value: string): any[] {\n const array = JSON.parse(value)\n if (!Array.isArray(array)) {\n throw new TypeError(\n `expected value of type \"array\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(array)}\"`\n )\n }\n return array\n },\n\n boolean(value: string): boolean {\n return !(value == \"0\" || String(value).toLowerCase() == \"false\")\n },\n\n number(value: string): number {\n return Number(value.replace(/_/g, \"\"))\n },\n\n object(value: string): object {\n const object = JSON.parse(value)\n if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n throw new TypeError(\n `expected value of type \"object\" but instead got value \"${value}\" of type \"${parseValueTypeDefault(object)}\"`\n )\n }\n return object\n },\n\n string(value: string): string {\n return value\n },\n}\n\ntype Writer = (value: any) => string\n\nconst writers: { [type: string]: Writer } = {\n default: writeString,\n array: writeJSON,\n object: writeJSON,\n}\n\nfunction writeJSON(value: any) {\n return JSON.stringify(value)\n}\n\nfunction writeString(value: any) {\n return `${value}`\n}\n","import { Application } from \"./application\"\nimport { ClassPropertiesBlessing } from \"./class_properties\"\nimport { Constructor } from \"./constructor\"\nimport { Context } from \"./context\"\nimport { OutletPropertiesBlessing } from \"./outlet_properties\"\nimport { TargetPropertiesBlessing } from \"./target_properties\"\nimport { ValuePropertiesBlessing, ValueDefinitionMap } from \"./value_properties\"\n\nexport type ControllerConstructor = Constructor<Controller>\n\ntype DispatchOptions = Partial<{\n target: Element | Window | Document\n detail: Object\n prefix: string\n bubbles: boolean\n cancelable: boolean\n}>\n\nexport class Controller<ElementType extends Element = Element> {\n static blessings = [\n ClassPropertiesBlessing,\n TargetPropertiesBlessing,\n ValuePropertiesBlessing,\n OutletPropertiesBlessing,\n ]\n static targets: string[] = []\n static outlets: string[] = []\n static values: ValueDefinitionMap = {}\n\n static get shouldLoad() {\n return true\n }\n\n static afterLoad(_identifier: string, _application: Application) {\n return\n }\n\n readonly context: Context\n\n constructor(context: Context) {\n this.context = context\n }\n\n get application() {\n return this.context.application\n }\n\n get scope() {\n return this.context.scope\n }\n\n get element() {\n return this.scope.element as ElementType\n }\n\n get identifier() {\n return this.scope.identifier\n }\n\n get targets() {\n return this.scope.targets\n }\n\n get outlets() {\n return this.scope.outlets\n }\n\n get classes() {\n return this.scope.classes\n }\n\n get data() {\n return this.scope.data\n }\n\n initialize() {\n // Override in your subclass to set up initial controller state\n }\n\n connect() {\n // Override in your subclass to respond when the controller is connected to the DOM\n }\n\n disconnect() {\n // Override in your subclass to respond when the controller is disconnected from the DOM\n }\n\n dispatch(\n eventName: string,\n {\n target = this.element,\n detail = {},\n prefix = this.identifier,\n bubbles = true,\n cancelable = true,\n }: DispatchOptions = {}\n ) {\n const type = prefix ? `${prefix}:${eventName}` : eventName\n const event = new CustomEvent(type, { detail, bubbles, cancelable })\n target.dispatchEvent(event)\n return event\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\nimport { capitalize } from \"./string_helpers\"\n\nexport function ClassPropertiesBlessing<T>(constructor: Constructor<T>) {\n const classes = readInheritableStaticArrayValues(constructor, \"classes\")\n return classes.reduce((properties, classDefinition) => {\n return Object.assign(properties, propertiesForClassDefinition(classDefinition))\n }, {} as PropertyDescriptorMap)\n}\n\nfunction propertiesForClassDefinition(key: string) {\n return {\n [`${key}Class`]: {\n get(this: Controller) {\n const { classes } = this\n if (classes.has(key)) {\n return classes.get(key)\n } else {\n const attribute = classes.getAttributeName(key)\n throw new Error(`Missing attribute \"${attribute}\"`)\n }\n },\n },\n\n [`${key}Classes`]: {\n get(this: Controller) {\n return this.classes.getAll(key)\n },\n },\n\n [`has${capitalize(key)}Class`]: {\n get(this: Controller) {\n return this.classes.has(key)\n },\n },\n }\n}\n","import { Constructor } from \"./constructor\"\nimport { Controller } from \"./controller\"\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\"\nimport { capitalize } from \"./string_helpers\"\n\nexport function TargetPropertiesBlessing<T>(constructor: Constructor<T>) {\n const targets = readInheritableStaticArrayValues(constructor, \"targets\")\n return targets.reduce((properties, targetDefinition) => {\n return Object.assign(properties, propertiesForTargetDefinition(targetDefinition))\n }, {} as PropertyDescriptorMap)\n}\n\nfunction propertiesForTargetDefinition(name: string) {\n return {\n [`${name}Target`]: {\n get(this: Controller) {\n const target = this.targets.find(name)\n if (target) {\n return target\n } else {\n throw new Error(`Missing target element \"${name}\" for \"${this.identifier}\" controller`)\n }\n },\n },\n\n [`${name}Targets`]: {\n get(this: Controller) {\n return this.targets.findAll(name)\n },\n },\n\n [`has${capitalize(name)}Target`]: {\n get(this: Controller) {\n return this.targets.has(name)\n },\n },\n }\n}\n"],"names":["EventListener","constructor","eventTarget","eventName","eventOptions","this","unorderedBindings","Set","connect","addEventListener","disconnect","removeEventListener","bindingConnected","binding","add","bindingDisconnected","delete","handleEvent","event","extendedEvent","stopImmediatePropagation","Object","assign","immediatePropagationStopped","call","extendEvent","bindings","hasBindings","size","Array","from","sort","left","right","leftIndex","index","rightIndex","Dispatcher","application","eventListenerMaps","Map","started","start","eventListeners","forEach","eventListener","stop","values","reduce","listeners","map","concat","fetchEventListenerForBinding","clearEventListeners","clearEventListenersForBinding","handleError","error","message","detail","removeMappedEventListenerFor","eventListenerMap","fetchEventListenerMapForEventTarget","cacheKey","fetchEventListener","get","createEventListener","set","parts","keys","key","push","join","defaultActionDescriptorFilters","value","stopPropagation","prevent","preventDefault","self","element","target","descriptorPattern","parseEventTarget","eventTargetName","window","document","camelize","replace","_","char","toUpperCase","namespaceCamelize","capitalize","charAt","slice","dasherize","toLowerCase","isSomething","object","hasProperty","property","prototype","hasOwnProperty","allModifiers","defaultEventNames","a","button","form","details","input","e","getAttribute","select","textarea","Error","typecast","JSON","parse","o_O","Binding","context","action","identifier","actionEvent","prepareActionEvent","willBeInvokedByEvent","applyEventModifiers","invokeWithEvent","method","controller","methodName","actionDescriptorFilters","passes","name","entries","filter","params","currentTarget","logDebugActivity","KeyboardEvent","shouldIgnoreKeyboardEvent","MouseEvent","shouldIgnoreMouseEvent","Element","contains","scope","containsElement","ElementObserver","delegate","attributes","childList","subtree","elements","mutationObserver","MutationObserver","mutations","processMutations","observe","mutationObserverInit","refresh","pause","callback","takeRecords","matches","matchElementsInTree","has","removeElement","addElement","mutation","processMutation","type","processAttributeChange","attributeName","processRemovedNodes","removedNodes","processAddedNodes","addedNodes","elementAttributeChanged","matchElement","nodes","node","elementFromNode","processTree","elementIsActive","tree","processor","nodeType","Node","ELEMENT_NODE","isConnected","elementMatched","elementUnmatched","AttributeObserver","elementObserver","selector","hasAttribute","match","querySelectorAll","elementMatchedAttribute","elementUnmatchedAttribute","elementAttributeValueChanged","fetch","del","prune","Multimap","valuesByKey","hasKey","hasValue","some","getValuesForKey","getKeysForValue","_key","_values","IndexedMultimap","super","keysByValue","SelectorObserver","_selector","matchesByElement","selectorMatchElement","selectorMatched","selectors","selectorUnmatched","_attributeName","matchedBefore","StringMapObserver","stringMap","attributeOldValue","knownAttributeNames","refreshAttribute","oldValue","getStringMapKeyForAttribute","stringMapKeyAdded","stringMapValueChanged","stringMapKeyRemoved","currentAttributeNames","recordedAttributeNames","attribute","TokenListObserver","attributeObserver","tokensByElement","tokensMatched","readTokensForElement","unmatchedTokens","matchedTokens","refreshTokensForElement","tokensUnmatched","tokens","token","tokenMatched","tokenUnmatched","previousTokens","currentTokens","firstDifferingIndex","length","Math","max","zip","findIndex","previousToken","currentToken","content","tokenString","trim","split","parseTokenString","ValueListObserver","tokenListObserver","parseResultsByToken","WeakMap","valuesByTokenByElement","fetchParseResultForToken","fetchValuesByTokenForElement","elementMatchedValue","elementUnmatchedValue","parseResult","parseToken","valuesByToken","parseValueForToken","BindingObserver","bindingsByAction","valueListObserver","actionAttribute","disconnectAllActions","schema","connectAction","disconnectAction","clear","descriptor","tagName","getDefaultEventNameForElement","keyFilter","forToken","descriptorString","includes","options","test","parseActionDescriptorString","toString","eventFilter","filters","keyFilterDissatisfied","standardFilter","keyMappings","pattern","RegExp","meta","ctrl","alt","shift","modifier","metaKey","ctrlKey","altKey","shiftKey","ValueObserver","receiver","stringMapObserver","valueDescriptorMap","invokeChangedCallbacksForDefaultValues","invokeChangedCallback","writer","defaultValue","valueDescriptorNameMap","valueDescriptors","undefined","data","rawValue","rawOldValue","changedMethodName","changedMethod","reader","TypeError","descriptors","hasMethodName","TargetObserver","targetsByName","disconnectAllTargets","connectTarget","disconnectTarget","targetConnected","targetDisconnected","readInheritableStaticArrayValues","propertyName","ancestors","getAncestorsForConstructor","definition","isArray","getOwnStaticArrayValues","readInheritableStaticObjectPairs","pairs","getOwnStaticObjectPairs","getPrototypeOf","reverse","OutletObserver","outletsByName","outletElementsByName","selectorObserverMap","attributeObserverMap","outletDefinitions","outletName","setupSelectorObserverForOutlet","setupAttributeObserverForOutlet","dependentContexts","observer","disconnectAllOutlets","stopSelectorObservers","stopAttributeObservers","outlet","getOutlet","connectOutlet","getOutletFromMap","disconnectOutlet","hasOutlet","hasOutletController","controllerAttribute","_element","getOutletNameFromOutletAttributeName","updateSelectorObserverForOutlet","outletConnected","outletDisconnected","selectorObserver","body","attributeNameForOutletName","outlets","getSelectorForOutletName","outletAttributeForScope","find","outletDependencies","dependencies","router","modules","module","controllerConstructor","dependentControllerIdentifiers","identifiers","contexts","getControllerForElementAndIdentifier","Context","functionName","bindingObserver","dispatcher","valueObserver","targetObserver","outletObserver","initialize","parentElement","invokeControllerMethod","args","bless","properties","shadowConstructor","extend","shadowProperties","getOwnKeys","shadowingDescriptor","getOwnPropertyDescriptor","getShadowedDescriptor","getShadowProperties","defineProperties","shadow","blessedProperties","blessing","getBlessedProperties","getOwnPropertySymbols","getOwnPropertyNames","extendWithReflect","extended","Reflect","construct","arguments","create","setPrototypeOf","b","testReflectExtension","Module","blessDefinition","contextsByScope","connectedContexts","connectContextForScope","fetchContextForScope","disconnectContextForScope","ClassMap","getDataKey","getAll","getAttributeName","getAttributeNameForKey","DataMap","setAttribute","removeAttribute","Guide","logger","warn","warnedKeys","warnedKeysByObject","attributeValueContainsToken","TargetSet","targetName","targetNames","findTarget","findLegacyTarget","findAll","targets","findAllTargets","findAllLegacyTargets","getSelectorForTargetName","findElement","findAllElements","targetAttributeForScope","getLegacySelectorForTargetName","deprecate","targetDescriptor","targetAttribute","revisedAttributeName","guide","OutletSet","controllerElement","outletNames","findOutlet","findAllOutlets","queryElements","matchesElement","Scope","closest","controllerSelector","documentScope","isDocumentScope","documentElement","ScopeObserver","scopesByIdentifierByElement","scopeReferenceCounts","parseValueForElementAndIdentifier","scopesByIdentifier","fetchScopesByIdentifierForElement","createScopeForElementAndIdentifier","referenceCount","scopeConnected","scopeDisconnected","Router","scopeObserver","modulesByIdentifier","loadDefinition","unloadIdentifier","connectModule","afterLoad","disconnectModule","getContextForElementAndIdentifier","proposeToConnectScopeForElementAndIdentifier","console","defaultSchema","enter","tab","esc","space","up","down","home","end","page_up","page_down","objectFromEntries","c","n","array","memo","k","v","Application","debug","logFormattedMessage","Promise","resolve","readyState","register","load","registerActionOption","head","rest","shouldLoad","unload","controllers","onerror","groupCollapsed","log","groupEnd","getOutletController","getControllerAndEnsureConnectedScope","outletController","parseValueDefinitionPair","typeDefinition","payload","typeFromObject","typeObject","hasType","hasDefault","default","fullObject","onlyType","onlyDefault","parseValueTypeConstant","typeFromDefaultValue","parseValueTypeDefault","parseValueTypeObject","typeFromConstant","parseValueTypeDefinition","constant","defaultValuesByType","constantFromType","defaultValueForDefinition","hasCustomDefaultValue","readers","writers","valueDescriptorForTokenAndTypeDefinition","Boolean","Number","String","boolean","number","string","writeJSON","stringify","Controller","_identifier","_application","classes","dispatch","prefix","bubbles","cancelable","CustomEvent","dispatchEvent","classDefinition","targetDefinition","valueDefinitionPairs","propertyDescriptorMap","result","valueDefinitionPair","valueDescriptor","read","write","propertiesForValueDefinitionPair","outletDefinition","camelizedName","outletElement","propertiesForOutletDefinition"],"mappings":"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"}