1(() => { 2 var __defProp = Object.defineProperty; 3 var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 4 var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); 5 6
vendor: 78,069 bytes, lines 6-2302
6// node_modules/@hotwired/stimulus/dist/stimulus.js 7 var EventListener = class { 8 constructor(eventTarget, eventName, eventOptions) { 9 this.eventTarget = eventTarget; 10 this.eventName = eventName; 11 this.eventOptions = eventOptions; 12 this.unorderedBindings = /* @__PURE__ */ new Set(); 13 } 14 connect() { 15 this.eventTarget.addEventListener(this.eventName, this, this.eventOptions); 16 } 17 disconnect() { 18 this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions); 19 } 20 bindingConnected(binding) { 21 this.unorderedBindings.add(binding); 22 } 23 bindingDisconnected(binding) { 24 this.unorderedBindings.delete(binding); 25 } 26 handleEvent(event) { 27 const extendedEvent = extendEvent(event); 28 for (const binding of this.bindings) { 29 if (extendedEvent.immediatePropagationStopped) { 30 break; 31 } else { 32 binding.handleEvent(extendedEvent); 33 } 34 } 35 } 36 hasBindings() { 37 return this.unorderedBindings.size > 0; 38 } 39 get bindings() { 40 return Array.from(this.unorderedBindings).sort((left, right) => { 41 const leftIndex = left.index, rightIndex = right.index; 42 return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0; 43 }); 44 } 45 }; 46 function extendEvent(event) { 47 if ("immediatePropagationStopped" in event) { 48 return event; 49 } else { 50 const { stopImmediatePropagation } = event; 51 return Object.assign(event, { 52 immediatePropagationStopped: false, 53 stopImmediatePropagation() { 54 this.immediatePropagationStopped = true; 55 stopImmediatePropagation.call(this); 56 } 57 }); 58 } 59 } 60 var Dispatcher = class { 61 constructor(application2) { 62 this.application = application2; 63 this.eventListenerMaps = /* @__PURE__ */ new Map(); 64 this.started = false; 65 } 66 start() { 67 if (!this.started) { 68 this.started = true; 69 this.eventListeners.forEach((eventListener) => eventListener.connect()); 70 } 71 } 72 stop() { 73 if (this.started) { 74 this.started = false; 75 this.eventListeners.forEach((eventListener) => eventListener.disconnect()); 76 } 77 } 78 get eventListeners() { 79 return Array.from(this.eventListenerMaps.values()).reduce((listeners, map) => listeners.concat(Array.from(map.values())), []); 80 } 81 bindingConnected(binding) { 82 this.fetchEventListenerForBinding(binding).bindingConnected(binding); 83 } 84 bindingDisconnected(binding, clearEventListeners = false) { 85 this.fetchEventListenerForBinding(binding).bindingDisconnected(binding); 86 if (clearEventListeners) 87 this.clearEventListenersForBinding(binding); 88 } 89 handleError(error2, message, detail = {}) { 90 this.application.handleError(error2, `Error ${message}`, detail); 91 } 92 clearEventListenersForBinding(binding) { 93 const eventListener = this.fetchEventListenerForBinding(binding); 94 if (!eventListener.hasBindings()) { 95 eventListener.disconnect(); 96 this.removeMappedEventListenerFor(binding); 97 } 98 } 99 removeMappedEventListenerFor(binding) { 100 const { eventTarget, eventName, eventOptions } = binding; 101 const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget); 102 const cacheKey = this.cacheKey(eventName, eventOptions); 103 eventListenerMap.delete(cacheKey); 104 if (eventListenerMap.size == 0) 105 this.eventListenerMaps.delete(eventTarget); 106 } 107 fetchEventListenerForBinding(binding) { 108 const { eventTarget, eventName, eventOptions } = binding; 109 return this.fetchEventListener(eventTarget, eventName, eventOptions); 110 } 111 fetchEventListener(eventTarget, eventName, eventOptions) { 112 const eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget); 113 const cacheKey = this.cacheKey(eventName, eventOptions); 114 let eventListener = eventListenerMap.get(cacheKey); 115 if (!eventListener) { 116 eventListener = this.createEventListener(eventTarget, eventName, eventOptions); 117 eventListenerMap.set(cacheKey, eventListener); 118 } 119 return eventListener; 120 } 121 createEventListener(eventTarget, eventName, eventOptions) { 122 const eventListener = new EventListener(eventTarget, eventName, eventOptions); 123 if (this.started) { 124 eventListener.connect(); 125 } 126 return eventListener; 127 } 128 fetchEventListenerMapForEventTarget(eventTarget) { 129 let eventListenerMap = this.eventListenerMaps.get(eventTarget); 130 if (!eventListenerMap) { 131 eventListenerMap = /* @__PURE__ */ new Map(); 132 this.eventListenerMaps.set(eventTarget, eventListenerMap); 133 } 134 return eventListenerMap; 135 } 136 cacheKey(eventName, eventOptions) { 137 const parts = [eventName]; 138 Object.keys(eventOptions).sort().forEach((key) => { 139 parts.push(`${eventOptions[key] ? "" : "!"}${key}`); 140 }); 141 return parts.join(":"); 142 } 143 }; 144 var defaultActionDescriptorFilters = { 145 stop({ event, value }) { 146 if (value) 147 event.stopPropagation(); 148 return true; 149 }, 150 prevent({ event, value }) { 151 if (value) 152 event.preventDefault(); 153 return true; 154 }, 155 self({ event, value, element }) { 156 if (value) { 157 return element === event.target; 158 } else { 159 return true; 160 } 161 } 162 }; 163 var descriptorPattern = /^(?:(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/; 164 function parseActionDescriptorString(descriptorString) { 165 const source = descriptorString.trim(); 166 const matches = source.match(descriptorPattern) || []; 167 let eventName = matches[1]; 168 let keyFilter = matches[2]; 169 if (keyFilter && !["keydown", "keyup", "keypress"].includes(eventName)) { 170 eventName += `.${keyFilter}`; 171 keyFilter = ""; 172 } 173 return { 174 eventTarget: parseEventTarget(matches[3]), 175 eventName, 176 eventOptions: matches[6] ? parseEventOptions(matches[6]) : {}, 177 identifier: matches[4], 178 methodName: matches[5], 179 keyFilter 180 }; 181 } 182 function parseEventTarget(eventTargetName) { 183 if (eventTargetName == "window") { 184 return window; 185 } else if (eventTargetName == "document") { 186 return document; 187 } 188 } 189 function parseEventOptions(eventOptions) { 190 return eventOptions.split(":").reduce((options, token) => Object.assign(options, { [token.replace(/^!/, "")]: !/^!/.test(token) }), {}); 191 } 192 function stringifyEventTarget(eventTarget) { 193 if (eventTarget == window) { 194 return "window"; 195 } else if (eventTarget == document) { 196 return "document"; 197 } 198 } 199 function camelize(value) { 200 return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase()); 201 } 202 function namespaceCamelize(value) { 203 return camelize(value.replace(/--/g, "-").replace(/__/g, "_")); 204 } 205 function capitalize(value) { 206 return value.charAt(0).toUpperCase() + value.slice(1); 207 } 208 function dasherize(value) { 209 return value.replace(/([A-Z])/g, (_, char) => `-${char.toLowerCase()}`); 210 } 211 function tokenize(value) { 212 return value.match(/[^\s]+/g) || []; 213 } 214 var Action = class { 215 constructor(element, index, descriptor, schema) { 216 this.element = element; 217 this.index = index; 218 this.eventTarget = descriptor.eventTarget || element; 219 this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error("missing event name"); 220 this.eventOptions = descriptor.eventOptions || {}; 221 this.identifier = descriptor.identifier || error("missing identifier"); 222 this.methodName = descriptor.methodName || error("missing method name"); 223 this.keyFilter = descriptor.keyFilter || ""; 224 this.schema = schema; 225 } 226 static forToken(token, schema) { 227 return new this(token.element, token.index, parseActionDescriptorString(token.content), schema); 228 } 229 toString() { 230 const eventFilter = this.keyFilter ? `.${this.keyFilter}` : ""; 231 const eventTarget = this.eventTargetName ? `@${this.eventTargetName}` : ""; 232 return `${this.eventName}${eventFilter}${eventTarget}->${this.identifier}#${this.methodName}`; 233 } 234 isFilterTarget(event) { 235 if (!this.keyFilter) { 236 return false; 237 } 238 const filteres = this.keyFilter.split("+"); 239 const modifiers = ["meta", "ctrl", "alt", "shift"]; 240 const [meta, ctrl, alt, shift] = modifiers.map((modifier) => filteres.includes(modifier)); 241 if (event.metaKey !== meta || event.ctrlKey !== ctrl || event.altKey !== alt || event.shiftKey !== shift) { 242 return true; 243 } 244 const standardFilter = filteres.filter((key) => !modifiers.includes(key))[0]; 245 if (!standardFilter) { 246 return false; 247 } 248 if (!Object.prototype.hasOwnProperty.call(this.keyMappings, standardFilter)) { 249 error(`contains unknown key filter: ${this.keyFilter}`); 250 } 251 return this.keyMappings[standardFilter].toLowerCase() !== event.key.toLowerCase(); 252 } 253 get params() { 254 const params = {}; 255 const pattern = new RegExp(`^data-${this.identifier}-(.+)-param$`, "i"); 256 for (const { name, value } of Array.from(this.element.attributes)) { 257 const match = name.match(pattern); 258 const key = match && match[1]; 259 if (key) { 260 params[camelize(key)] = typecast(value); 261 } 262 } 263 return params; 264 } 265 get eventTargetName() { 266 return stringifyEventTarget(this.eventTarget); 267 } 268 get keyMappings() { 269 return this.schema.keyMappings; 270 } 271 }; 272 var defaultEventNames = { 273 a: () => "click", 274 button: () => "click", 275 form: () => "submit", 276 details: () => "toggle", 277 input: (e) => e.getAttribute("type") == "submit" ? "click" : "input", 278 select: () => "change", 279 textarea: () => "input" 280 }; 281 function getDefaultEventNameForElement(element) { 282 const tagName = element.tagName.toLowerCase(); 283 if (tagName in defaultEventNames) { 284 return defaultEventNames[tagName](element); 285 } 286 } 287 function error(message) { 288 throw new Error(message); 289 } 290 function typecast(value) { 291 try { 292 return JSON.parse(value); 293 } catch (o_O) { 294 return value; 295 } 296 } 297 var Binding = class { 298 constructor(context, action) { 299 this.context = context; 300 this.action = action; 301 } 302 get index() { 303 return this.action.index; 304 } 305 get eventTarget() { 306 return this.action.eventTarget; 307 } 308 get eventOptions() { 309 return this.action.eventOptions; 310 } 311 get identifier() { 312 return this.context.identifier; 313 } 314 handleEvent(event) { 315 if (this.willBeInvokedByEvent(event) && this.applyEventModifiers(event)) { 316 this.invokeWithEvent(event); 317 } 318 } 319 get eventName() { 320 return this.action.eventName; 321 } 322 get method() { 323 const method = this.controller[this.methodName]; 324 if (typeof method == "function") { 325 return method; 326 } 327 throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`); 328 } 329 applyEventModifiers(event) { 330 const { element } = this.action; 331 const { actionDescriptorFilters } = this.context.application; 332 let passes = true; 333 for (const [name, value] of Object.entries(this.eventOptions)) { 334 if (name in actionDescriptorFilters) { 335 const filter = actionDescriptorFilters[name]; 336 passes = passes && filter({ name, value, event, element }); 337 } else { 338 continue; 339 } 340 } 341 return passes; 342 } 343 invokeWithEvent(event) { 344 const { target, currentTarget } = event; 345 try { 346 const { params } = this.action; 347 const actionEvent = Object.assign(event, { params }); 348 this.method.call(this.controller, actionEvent); 349 this.context.logDebugActivity(this.methodName, { event, target, currentTarget, action: this.methodName }); 350 } catch (error2) { 351 const { identifier, controller, element, index } = this; 352 const detail = { identifier, controller, element, index, event }; 353 this.context.handleError(error2, `invoking action "${this.action}"`, detail); 354 } 355 } 356 willBeInvokedByEvent(event) { 357 const eventTarget = event.target; 358 if (event instanceof KeyboardEvent && this.action.isFilterTarget(event)) { 359 return false; 360 } 361 if (this.element === eventTarget) { 362 return true; 363 } else if (eventTarget instanceof Element && this.element.contains(eventTarget)) { 364 return this.scope.containsElement(eventTarget); 365 } else { 366 return this.scope.containsElement(this.action.element); 367 } 368 } 369 get controller() { 370 return this.context.controller; 371 } 372 get methodName() { 373 return this.action.methodName; 374 } 375 get element() { 376 return this.scope.element; 377 } 378 get scope() { 379 return this.context.scope; 380 } 381 }; 382 var ElementObserver = class { 383 constructor(element, delegate) { 384 this.mutationObserverInit = { attributes: true, childList: true, subtree: true }; 385 this.element = element; 386 this.started = false; 387 this.delegate = delegate; 388 this.elements = /* @__PURE__ */ new Set(); 389 this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations)); 390 } 391 start() { 392 if (!this.started) { 393 this.started = true; 394 this.mutationObserver.observe(this.element, this.mutationObserverInit); 395 this.refresh(); 396 } 397 } 398 pause(callback) { 399 if (this.started) { 400 this.mutationObserver.disconnect(); 401 this.started = false; 402 } 403 callback(); 404 if (!this.started) { 405 this.mutationObserver.observe(this.element, this.mutationObserverInit); 406 this.started = true; 407 } 408 } 409 stop() { 410 if (this.started) { 411 this.mutationObserver.takeRecords(); 412 this.mutationObserver.disconnect(); 413 this.started = false; 414 } 415 } 416 refresh() { 417 if (this.started) { 418 const matches = new Set(this.matchElementsInTree()); 419 for (const element of Array.from(this.elements)) { 420 if (!matches.has(element)) { 421 this.removeElement(element); 422 } 423 } 424 for (const element of Array.from(matches)) { 425 this.addElement(element); 426 } 427 } 428 } 429 processMutations(mutations) { 430 if (this.started) { 431 for (const mutation of mutations) { 432 this.processMutation(mutation); 433 } 434 } 435 } 436 processMutation(mutation) { 437 if (mutation.type == "attributes") { 438 this.processAttributeChange(mutation.target, mutation.attributeName); 439 } else if (mutation.type == "childList") { 440 this.processRemovedNodes(mutation.removedNodes); 441 this.processAddedNodes(mutation.addedNodes); 442 } 443 } 444 processAttributeChange(node, attributeName) { 445 const element = node; 446 if (this.elements.has(element)) { 447 if (this.delegate.elementAttributeChanged && this.matchElement(element)) { 448 this.delegate.elementAttributeChanged(element, attributeName); 449 } else { 450 this.removeElement(element); 451 } 452 } else if (this.matchElement(element)) { 453 this.addElement(element); 454 } 455 } 456 processRemovedNodes(nodes) { 457 for (const node of Array.from(nodes)) { 458 const element = this.elementFromNode(node); 459 if (element) { 460 this.processTree(element, this.removeElement); 461 } 462 } 463 } 464 processAddedNodes(nodes) { 465 for (const node of Array.from(nodes)) { 466 const element = this.elementFromNode(node); 467 if (element && this.elementIsActive(element)) { 468 this.processTree(element, this.addElement); 469 } 470 } 471 } 472 matchElement(element) { 473 return this.delegate.matchElement(element); 474 } 475 matchElementsInTree(tree = this.element) { 476 return this.delegate.matchElementsInTree(tree); 477 } 478 processTree(tree, processor) { 479 for (const element of this.matchElementsInTree(tree)) { 480 processor.call(this, element); 481 } 482 } 483 elementFromNode(node) { 484 if (node.nodeType == Node.ELEMENT_NODE) { 485 return node; 486 } 487 } 488 elementIsActive(element) { 489 if (element.isConnected != this.element.isConnected) { 490 return false; 491 } else { 492 return this.element.contains(element); 493 } 494 } 495 addElement(element) { 496 if (!this.elements.has(element)) { 497 if (this.elementIsActive(element)) { 498 this.elements.add(element); 499 if (this.delegate.elementMatched) { 500 this.delegate.elementMatched(element); 501 } 502 } 503 } 504 } 505 removeElement(element) { 506 if (this.elements.has(element)) { 507 this.elements.delete(element); 508 if (this.delegate.elementUnmatched) { 509 this.delegate.elementUnmatched(element); 510 } 511 } 512 } 513 }; 514 var AttributeObserver = class { 515 constructor(element, attributeName, delegate) { 516 this.attributeName = attributeName; 517 this.delegate = delegate; 518 this.elementObserver = new ElementObserver(element, this); 519 } 520 get element() { 521 return this.elementObserver.element; 522 } 523 get selector() { 524 return `[${this.attributeName}]`; 525 } 526 start() { 527 this.elementObserver.start(); 528 } 529 pause(callback) { 530 this.elementObserver.pause(callback); 531 } 532 stop() { 533 this.elementObserver.stop(); 534 } 535 refresh() { 536 this.elementObserver.refresh(); 537 } 538 get started() { 539 return this.elementObserver.started; 540 } 541 matchElement(element) { 542 return element.hasAttribute(this.attributeName); 543 } 544 matchElementsInTree(tree) { 545 const match = this.matchElement(tree) ? [tree] : []; 546 const matches = Array.from(tree.querySelectorAll(this.selector)); 547 return match.concat(matches); 548 } 549 elementMatched(element) { 550 if (this.delegate.elementMatchedAttribute) { 551 this.delegate.elementMatchedAttribute(element, this.attributeName); 552 } 553 } 554 elementUnmatched(element) { 555 if (this.delegate.elementUnmatchedAttribute) { 556 this.delegate.elementUnmatchedAttribute(element, this.attributeName); 557 } 558 } 559 elementAttributeChanged(element, attributeName) { 560 if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) { 561 this.delegate.elementAttributeValueChanged(element, attributeName); 562 } 563 } 564 }; 565 function add(map, key, value) { 566 fetch2(map, key).add(value); 567 } 568 function del(map, key, value) { 569 fetch2(map, key).delete(value); 570 prune(map, key); 571 } 572 function fetch2(map, key) { 573 let values = map.get(key); 574 if (!values) { 575 values = /* @__PURE__ */ new Set(); 576 map.set(key, values); 577 } 578 return values; 579 } 580 function prune(map, key) { 581 const values = map.get(key); 582 if (values != null && values.size == 0) { 583 map.delete(key); 584 } 585 } 586 var Multimap = class { 587 constructor() { 588 this.valuesByKey = /* @__PURE__ */ new Map(); 589 } 590 get keys() { 591 return Array.from(this.valuesByKey.keys()); 592 } 593 get values() { 594 const sets = Array.from(this.valuesByKey.values()); 595 return sets.reduce((values, set) => values.concat(Array.from(set)), []); 596 } 597 get size() { 598 const sets = Array.from(this.valuesByKey.values()); 599 return sets.reduce((size, set) => size + set.size, 0); 600 } 601 add(key, value) { 602 add(this.valuesByKey, key, value); 603 } 604 delete(key, value) { 605 del(this.valuesByKey, key, value); 606 } 607 has(key, value) { 608 const values = this.valuesByKey.get(key); 609 return values != null && values.has(value); 610 } 611 hasKey(key) { 612 return this.valuesByKey.has(key); 613 } 614 hasValue(value) { 615 const sets = Array.from(this.valuesByKey.values()); 616 return sets.some((set) => set.has(value)); 617 } 618 getValuesForKey(key) { 619 const values = this.valuesByKey.get(key); 620 return values ? Array.from(values) : []; 621 } 622 getKeysForValue(value) { 623 return Array.from(this.valuesByKey).filter(([_key, values]) => values.has(value)).map(([key, _values]) => key); 624 } 625 }; 626 var SelectorObserver = class { 627 constructor(element, selector, delegate, details = {}) { 628 this.selector = selector; 629 this.details = details; 630 this.elementObserver = new ElementObserver(element, this); 631 this.delegate = delegate; 632 this.matchesByElement = new Multimap(); 633 } 634 get started() { 635 return this.elementObserver.started; 636 } 637 start() { 638 this.elementObserver.start(); 639 } 640 pause(callback) { 641 this.elementObserver.pause(callback); 642 } 643 stop() { 644 this.elementObserver.stop(); 645 } 646 refresh() { 647 this.elementObserver.refresh(); 648 } 649 get element() { 650 return this.elementObserver.element; 651 } 652 matchElement(element) { 653 const matches = element.matches(this.selector); 654 if (this.delegate.selectorMatchElement) { 655 return matches && this.delegate.selectorMatchElement(element, this.details); 656 } 657 return matches; 658 } 659 matchElementsInTree(tree) { 660 const match = this.matchElement(tree) ? [tree] : []; 661 const matches = Array.from(tree.querySelectorAll(this.selector)).filter((match2) => this.matchElement(match2)); 662 return match.concat(matches); 663 } 664 elementMatched(element) { 665 this.selectorMatched(element); 666 } 667 elementUnmatched(element) { 668 this.selectorUnmatched(element); 669 } 670 elementAttributeChanged(element, _attributeName) { 671 const matches = this.matchElement(element); 672 const matchedBefore = this.matchesByElement.has(this.selector, element); 673 if (!matches && matchedBefore) { 674 this.selectorUnmatched(element); 675 } 676 } 677 selectorMatched(element) { 678 if (this.delegate.selectorMatched) { 679 this.delegate.selectorMatched(element, this.selector, this.details); 680 this.matchesByElement.add(this.selector, element); 681 } 682 } 683 selectorUnmatched(element) { 684 this.delegate.selectorUnmatched(element, this.selector, this.details); 685 this.matchesByElement.delete(this.selector, element); 686 } 687 }; 688 var StringMapObserver = class { 689 constructor(element, delegate) { 690 this.element = element; 691 this.delegate = delegate; 692 this.started = false; 693 this.stringMap = /* @__PURE__ */ new Map(); 694 this.mutationObserver = new MutationObserver((mutations) => this.processMutations(mutations)); 695 } 696 start() { 697 if (!this.started) { 698 this.started = true; 699 this.mutationObserver.observe(this.element, { attributes: true, attributeOldValue: true }); 700 this.refresh(); 701 } 702 } 703 stop() { 704 if (this.started) { 705 this.mutationObserver.takeRecords(); 706 this.mutationObserver.disconnect(); 707 this.started = false; 708 } 709 } 710 refresh() { 711 if (this.started) { 712 for (const attributeName of this.knownAttributeNames) { 713 this.refreshAttribute(attributeName, null); 714 } 715 } 716 } 717 processMutations(mutations) { 718 if (this.started) { 719 for (const mutation of mutations) { 720 this.processMutation(mutation); 721 } 722 } 723 } 724 processMutation(mutation) { 725 const attributeName = mutation.attributeName; 726 if (attributeName) { 727 this.refreshAttribute(attributeName, mutation.oldValue); 728 } 729 } 730 refreshAttribute(attributeName, oldValue) { 731 const key = this.delegate.getStringMapKeyForAttribute(attributeName); 732 if (key != null) { 733 if (!this.stringMap.has(attributeName)) { 734 this.stringMapKeyAdded(key, attributeName); 735 } 736 const value = this.element.getAttribute(attributeName); 737 if (this.stringMap.get(attributeName) != value) { 738 this.stringMapValueChanged(value, key, oldValue); 739 } 740 if (value == null) { 741 const oldValue2 = this.stringMap.get(attributeName); 742 this.stringMap.delete(attributeName); 743 if (oldValue2) 744 this.stringMapKeyRemoved(key, attributeName, oldValue2); 745 } else { 746 this.stringMap.set(attributeName, value); 747 } 748 } 749 } 750 stringMapKeyAdded(key, attributeName) { 751 if (this.delegate.stringMapKeyAdded) { 752 this.delegate.stringMapKeyAdded(key, attributeName); 753 } 754 } 755 stringMapValueChanged(value, key, oldValue) { 756 if (this.delegate.stringMapValueChanged) { 757 this.delegate.stringMapValueChanged(value, key, oldValue); 758 } 759 } 760 stringMapKeyRemoved(key, attributeName, oldValue) { 761 if (this.delegate.stringMapKeyRemoved) { 762 this.delegate.stringMapKeyRemoved(key, attributeName, oldValue); 763 } 764 } 765 get knownAttributeNames() { 766 return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames))); 767 } 768 get currentAttributeNames() { 769 return Array.from(this.element.attributes).map((attribute) => attribute.name); 770 } 771 get recordedAttributeNames() { 772 return Array.from(this.stringMap.keys()); 773 } 774 }; 775 var TokenListObserver = class { 776 constructor(element, attributeName, delegate) { 777 this.attributeObserver = new AttributeObserver(element, attributeName, this); 778 this.delegate = delegate; 779 this.tokensByElement = new Multimap(); 780 } 781 get started() { 782 return this.attributeObserver.started; 783 } 784 start() { 785 this.attributeObserver.start(); 786 } 787 pause(callback) { 788 this.attributeObserver.pause(callback); 789 } 790 stop() { 791 this.attributeObserver.stop(); 792 } 793 refresh() { 794 this.attributeObserver.refresh(); 795 } 796 get element() { 797 return this.attributeObserver.element; 798 } 799 get attributeName() { 800 return this.attributeObserver.attributeName; 801 } 802 elementMatchedAttribute(element) { 803 this.tokensMatched(this.readTokensForElement(element)); 804 } 805 elementAttributeValueChanged(element) { 806 const [unmatchedTokens, matchedTokens] = this.refreshTokensForElement(element); 807 this.tokensUnmatched(unmatchedTokens); 808 this.tokensMatched(matchedTokens); 809 } 810 elementUnmatchedAttribute(element) { 811 this.tokensUnmatched(this.tokensByElement.getValuesForKey(element)); 812 } 813 tokensMatched(tokens) { 814 tokens.forEach((token) => this.tokenMatched(token)); 815 } 816 tokensUnmatched(tokens) { 817 tokens.forEach((token) => this.tokenUnmatched(token)); 818 } 819 tokenMatched(token) { 820 this.delegate.tokenMatched(token); 821 this.tokensByElement.add(token.element, token); 822 } 823 tokenUnmatched(token) { 824 this.delegate.tokenUnmatched(token); 825 this.tokensByElement.delete(token.element, token); 826 } 827 refreshTokensForElement(element) { 828 const previousTokens = this.tokensByElement.getValuesForKey(element); 829 const currentTokens = this.readTokensForElement(element); 830 const firstDifferingIndex = zip(previousTokens, currentTokens).findIndex(([previousToken, currentToken]) => !tokensAreEqual(previousToken, currentToken)); 831 if (firstDifferingIndex == -1) { 832 return [[], []]; 833 } else { 834 return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)]; 835 } 836 } 837 readTokensForElement(element) { 838 const attributeName = this.attributeName; 839 const tokenString = element.getAttribute(attributeName) || ""; 840 return parseTokenString(tokenString, element, attributeName); 841 } 842 }; 843 function parseTokenString(tokenString, element, attributeName) { 844 return tokenString.trim().split(/\s+/).filter((content) => content.length).map((content, index) => ({ element, attributeName, content, index })); 845 } 846 function zip(left, right) { 847 const length = Math.max(left.length, right.length); 848 return Array.from({ length }, (_, index) => [left[index], right[index]]); 849 } 850 function tokensAreEqual(left, right) { 851 return left && right && left.index == right.index && left.content == right.content; 852 } 853 var ValueListObserver = class { 854 constructor(element, attributeName, delegate) { 855 this.tokenListObserver = new TokenListObserver(element, attributeName, this); 856 this.delegate = delegate; 857 this.parseResultsByToken = /* @__PURE__ */ new WeakMap(); 858 this.valuesByTokenByElement = /* @__PURE__ */ new WeakMap(); 859 } 860 get started() { 861 return this.tokenListObserver.started; 862 } 863 start() { 864 this.tokenListObserver.start(); 865 } 866 stop() { 867 this.tokenListObserver.stop(); 868 } 869 refresh() { 870 this.tokenListObserver.refresh(); 871 } 872 get element() { 873 return this.tokenListObserver.element; 874 } 875 get attributeName() { 876 return this.tokenListObserver.attributeName; 877 } 878 tokenMatched(token) { 879 const { element } = token; 880 const { value } = this.fetchParseResultForToken(token); 881 if (value) { 882 this.fetchValuesByTokenForElement(element).set(token, value); 883 this.delegate.elementMatchedValue(element, value); 884 } 885 } 886 tokenUnmatched(token) { 887 const { element } = token; 888 const { value } = this.fetchParseResultForToken(token); 889 if (value) { 890 this.fetchValuesByTokenForElement(element).delete(token); 891 this.delegate.elementUnmatchedValue(element, value); 892 } 893 } 894 fetchParseResultForToken(token) { 895 let parseResult = this.parseResultsByToken.get(token); 896 if (!parseResult) { 897 parseResult = this.parseToken(token); 898 this.parseResultsByToken.set(token, parseResult); 899 } 900 return parseResult; 901 } 902 fetchValuesByTokenForElement(element) { 903 let valuesByToken = this.valuesByTokenByElement.get(element); 904 if (!valuesByToken) { 905 valuesByToken = /* @__PURE__ */ new Map(); 906 this.valuesByTokenByElement.set(element, valuesByToken); 907 } 908 return valuesByToken; 909 } 910 parseToken(token) { 911 try { 912 const value = this.delegate.parseValueForToken(token); 913 return { value }; 914 } catch (error2) { 915 return { error: error2 }; 916 } 917 } 918 }; 919 var BindingObserver = class { 920 constructor(context, delegate) { 921 this.context = context; 922 this.delegate = delegate; 923 this.bindingsByAction = /* @__PURE__ */ new Map(); 924 } 925 start() { 926 if (!this.valueListObserver) { 927 this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this); 928 this.valueListObserver.start(); 929 } 930 } 931 stop() { 932 if (this.valueListObserver) { 933 this.valueListObserver.stop(); 934 delete this.valueListObserver; 935 this.disconnectAllActions(); 936 } 937 } 938 get element() { 939 return this.context.element; 940 } 941 get identifier() { 942 return this.context.identifier; 943 } 944 get actionAttribute() { 945 return this.schema.actionAttribute; 946 } 947 get schema() { 948 return this.context.schema; 949 } 950 get bindings() { 951 return Array.from(this.bindingsByAction.values()); 952 } 953 connectAction(action) { 954 const binding = new Binding(this.context, action); 955 this.bindingsByAction.set(action, binding); 956 this.delegate.bindingConnected(binding); 957 } 958 disconnectAction(action) { 959 const binding = this.bindingsByAction.get(action); 960 if (binding) { 961 this.bindingsByAction.delete(action); 962 this.delegate.bindingDisconnected(binding); 963 } 964 } 965 disconnectAllActions() { 966 this.bindings.forEach((binding) => this.delegate.bindingDisconnected(binding, true)); 967 this.bindingsByAction.clear(); 968 } 969 parseValueForToken(token) { 970 const action = Action.forToken(token, this.schema); 971 if (action.identifier == this.identifier) { 972 return action; 973 } 974 } 975 elementMatchedValue(element, action) { 976 this.connectAction(action); 977 } 978 elementUnmatchedValue(element, action) { 979 this.disconnectAction(action); 980 } 981 }; 982 var ValueObserver = class { 983 constructor(context, receiver) { 984 this.context = context; 985 this.receiver = receiver; 986 this.stringMapObserver = new StringMapObserver(this.element, this); 987 this.valueDescriptorMap = this.controller.valueDescriptorMap; 988 } 989 start() { 990 this.stringMapObserver.start(); 991 this.invokeChangedCallbacksForDefaultValues(); 992 } 993 stop() { 994 this.stringMapObserver.stop(); 995 } 996 get element() { 997 return this.context.element; 998 } 999 get controller() { 1000 return this.context.controller; 1001 } 1002 getStringMapKeyForAttribute(attributeName) { 1003 if (attributeName in this.valueDescriptorMap) { 1004 return this.valueDescriptorMap[attributeName].name; 1005 } 1006 } 1007 stringMapKeyAdded(key, attributeName) { 1008 const descriptor = this.valueDescriptorMap[attributeName]; 1009 if (!this.hasValue(key)) { 1010 this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), descriptor.writer(descriptor.defaultValue)); 1011 } 1012 } 1013 stringMapValueChanged(value, name, oldValue) { 1014 const descriptor = this.valueDescriptorNameMap[name]; 1015 if (value === null) 1016 return; 1017 if (oldValue === null) { 1018 oldValue = descriptor.writer(descriptor.defaultValue); 1019 } 1020 this.invokeChangedCallback(name, value, oldValue); 1021 } 1022 stringMapKeyRemoved(key, attributeName, oldValue) { 1023 const descriptor = this.valueDescriptorNameMap[key]; 1024 if (this.hasValue(key)) { 1025 this.invokeChangedCallback(key, descriptor.writer(this.receiver[key]), oldValue); 1026 } else { 1027 this.invokeChangedCallback(key, descriptor.writer(descriptor.defaultValue), oldValue); 1028 } 1029 } 1030 invokeChangedCallbacksForDefaultValues() { 1031 for (const { key, name, defaultValue, writer } of this.valueDescriptors) { 1032 if (defaultValue != void 0 && !this.controller.data.has(key)) { 1033 this.invokeChangedCallback(name, writer(defaultValue), void 0); 1034 } 1035 } 1036 } 1037 invokeChangedCallback(name, rawValue, rawOldValue) { 1038 const changedMethodName = `${name}Changed`; 1039 const changedMethod = this.receiver[changedMethodName]; 1040 if (typeof changedMethod == "function") { 1041 const descriptor = this.valueDescriptorNameMap[name]; 1042 try { 1043 const value = descriptor.reader(rawValue); 1044 let oldValue = rawOldValue; 1045 if (rawOldValue) { 1046 oldValue = descriptor.reader(rawOldValue); 1047 } 1048 changedMethod.call(this.receiver, value, oldValue); 1049 } catch (error2) { 1050 if (error2 instanceof TypeError) { 1051 error2.message = `Stimulus Value "${this.context.identifier}.${descriptor.name}" - ${error2.message}`; 1052 } 1053 throw error2; 1054 } 1055 } 1056 } 1057 get valueDescriptors() { 1058 const { valueDescriptorMap } = this; 1059 return Object.keys(valueDescriptorMap).map((key) => valueDescriptorMap[key]); 1060 } 1061 get valueDescriptorNameMap() { 1062 const descriptors = {}; 1063 Object.keys(this.valueDescriptorMap).forEach((key) => { 1064 const descriptor = this.valueDescriptorMap[key]; 1065 descriptors[descriptor.name] = descriptor; 1066 }); 1067 return descriptors; 1068 } 1069 hasValue(attributeName) { 1070 const descriptor = this.valueDescriptorNameMap[attributeName]; 1071 const hasMethodName = `has${capitalize(descriptor.name)}`; 1072 return this.receiver[hasMethodName]; 1073 } 1074 }; 1075 var TargetObserver = class { 1076 constructor(context, delegate) { 1077 this.context = context; 1078 this.delegate = delegate; 1079 this.targetsByName = new Multimap(); 1080 } 1081 start() { 1082 if (!this.tokenListObserver) { 1083 this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this); 1084 this.tokenListObserver.start(); 1085 } 1086 } 1087 stop() { 1088 if (this.tokenListObserver) { 1089 this.disconnectAllTargets(); 1090 this.tokenListObserver.stop(); 1091 delete this.tokenListObserver; 1092 } 1093 } 1094 tokenMatched({ element, content: name }) { 1095 if (this.scope.containsElement(element)) { 1096 this.connectTarget(element, name); 1097 } 1098 } 1099 tokenUnmatched({ element, content: name }) { 1100 this.disconnectTarget(element, name); 1101 } 1102 connectTarget(element, name) { 1103 var _a; 1104 if (!this.targetsByName.has(name, element)) { 1105 this.targetsByName.add(name, element); 1106 (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetConnected(element, name)); 1107 } 1108 } 1109 disconnectTarget(element, name) { 1110 var _a; 1111 if (this.targetsByName.has(name, element)) { 1112 this.targetsByName.delete(name, element); 1113 (_a = this.tokenListObserver) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.targetDisconnected(element, name)); 1114 } 1115 } 1116 disconnectAllTargets() { 1117 for (const name of this.targetsByName.keys) { 1118 for (const element of this.targetsByName.getValuesForKey(name)) { 1119 this.disconnectTarget(element, name); 1120 } 1121 } 1122 } 1123 get attributeName() { 1124 return `data-${this.context.identifier}-target`; 1125 } 1126 get element() { 1127 return this.context.element; 1128 } 1129 get scope() { 1130 return this.context.scope; 1131 } 1132 }; 1133 function readInheritableStaticArrayValues(constructor, propertyName) { 1134 const ancestors = getAncestorsForConstructor(constructor); 1135 return Array.from(ancestors.reduce((values, constructor2) => { 1136 getOwnStaticArrayValues(constructor2, propertyName).forEach((name) => values.add(name)); 1137 return values; 1138 }, /* @__PURE__ */ new Set())); 1139 } 1140 function readInheritableStaticObjectPairs(constructor, propertyName) { 1141 const ancestors = getAncestorsForConstructor(constructor); 1142 return ancestors.reduce((pairs, constructor2) => { 1143 pairs.push(...getOwnStaticObjectPairs(constructor2, propertyName)); 1144 return pairs; 1145 }, []); 1146 } 1147 function getAncestorsForConstructor(constructor) { 1148 const ancestors = []; 1149 while (constructor) { 1150 ancestors.push(constructor); 1151 constructor = Object.getPrototypeOf(constructor); 1152 } 1153 return ancestors.reverse(); 1154 } 1155 function getOwnStaticArrayValues(constructor, propertyName) { 1156 const definition = constructor[propertyName]; 1157 return Array.isArray(definition) ? definition : []; 1158 } 1159 function getOwnStaticObjectPairs(constructor, propertyName) { 1160 const definition = constructor[propertyName]; 1161 return definition ? Object.keys(definition).map((key) => [key, definition[key]]) : []; 1162 } 1163 var OutletObserver = class { 1164 constructor(context, delegate) { 1165 this.context = context; 1166 this.delegate = delegate; 1167 this.outletsByName = new Multimap(); 1168 this.outletElementsByName = new Multimap(); 1169 this.selectorObserverMap = /* @__PURE__ */ new Map(); 1170 } 1171 start() { 1172 if (this.selectorObserverMap.size === 0) { 1173 this.outletDefinitions.forEach((outletName) => { 1174 const selector = this.selector(outletName); 1175 const details = { outletName }; 1176 if (selector) { 1177 this.selectorObserverMap.set(outletName, new SelectorObserver(document.body, selector, this, details)); 1178 } 1179 }); 1180 this.selectorObserverMap.forEach((observer) => observer.start()); 1181 } 1182 this.dependentContexts.forEach((context) => context.refresh()); 1183 } 1184 stop() { 1185 if (this.selectorObserverMap.size > 0) { 1186 this.disconnectAllOutlets(); 1187 this.selectorObserverMap.forEach((observer) => observer.stop()); 1188 this.selectorObserverMap.clear(); 1189 } 1190 } 1191 refresh() { 1192 this.selectorObserverMap.forEach((observer) => observer.refresh()); 1193 } 1194 selectorMatched(element, _selector, { outletName }) { 1195 const outlet = this.getOutlet(element, outletName); 1196 if (outlet) { 1197 this.connectOutlet(outlet, element, outletName); 1198 } 1199 } 1200 selectorUnmatched(element, _selector, { outletName }) { 1201 const outlet = this.getOutletFromMap(element, outletName); 1202 if (outlet) { 1203 this.disconnectOutlet(outlet, element, outletName); 1204 } 1205 } 1206 selectorMatchElement(element, { outletName }) { 1207 return this.hasOutlet(element, outletName) && element.matches(`[${this.context.application.schema.controllerAttribute}~=${outletName}]`); 1208 } 1209 connectOutlet(outlet, element, outletName) { 1210 var _a; 1211 if (!this.outletElementsByName.has(outletName, element)) { 1212 this.outletsByName.add(outletName, outlet); 1213 this.outletElementsByName.add(outletName, element); 1214 (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletConnected(outlet, element, outletName)); 1215 } 1216 } 1217 disconnectOutlet(outlet, element, outletName) { 1218 var _a; 1219 if (this.outletElementsByName.has(outletName, element)) { 1220 this.outletsByName.delete(outletName, outlet); 1221 this.outletElementsByName.delete(outletName, element); 1222 (_a = this.selectorObserverMap.get(outletName)) === null || _a === void 0 ? void 0 : _a.pause(() => this.delegate.outletDisconnected(outlet, element, outletName)); 1223 } 1224 } 1225 disconnectAllOutlets() { 1226 for (const outletName of this.outletElementsByName.keys) { 1227 for (const element of this.outletElementsByName.getValuesForKey(outletName)) { 1228 for (const outlet of this.outletsByName.getValuesForKey(outletName)) { 1229 this.disconnectOutlet(outlet, element, outletName); 1230 } 1231 } 1232 } 1233 } 1234 selector(outletName) { 1235 return this.scope.outlets.getSelectorForOutletName(outletName); 1236 } 1237 get outletDependencies() { 1238 const dependencies = new Multimap(); 1239 this.router.modules.forEach((module) => { 1240 const constructor = module.definition.controllerConstructor; 1241 const outlets = readInheritableStaticArrayValues(constructor, "outlets"); 1242 outlets.forEach((outlet) => dependencies.add(outlet, module.identifier)); 1243 }); 1244 return dependencies; 1245 } 1246 get outletDefinitions() { 1247 return this.outletDependencies.getKeysForValue(this.identifier); 1248 } 1249 get dependentControllerIdentifiers() { 1250 return this.outletDependencies.getValuesForKey(this.identifier); 1251 } 1252 get dependentContexts() { 1253 const identifiers = this.dependentControllerIdentifiers; 1254 return this.router.contexts.filter((context) => identifiers.includes(context.identifier)); 1255 } 1256 hasOutlet(element, outletName) { 1257 return !!this.getOutlet(element, outletName) || !!this.getOutletFromMap(element, outletName); 1258 } 1259 getOutlet(element, outletName) { 1260 return this.application.getControllerForElementAndIdentifier(element, outletName); 1261 } 1262 getOutletFromMap(element, outletName) { 1263 return this.outletsByName.getValuesForKey(outletName).find((outlet) => outlet.element === element); 1264 } 1265 get scope() { 1266 return this.context.scope; 1267 } 1268 get identifier() { 1269 return this.context.identifier; 1270 } 1271 get application() { 1272 return this.context.application; 1273 } 1274 get router() { 1275 return this.application.router; 1276 } 1277 }; 1278 var Context = class { 1279 constructor(module, scope) { 1280 this.logDebugActivity = (functionName, detail = {}) => { 1281 const { identifier, controller, element } = this; 1282 detail = Object.assign({ identifier, controller, element }, detail); 1283 this.application.logDebugActivity(this.identifier, functionName, detail); 1284 }; 1285 this.module = module; 1286 this.scope = scope; 1287 this.controller = new module.controllerConstructor(this); 1288 this.bindingObserver = new BindingObserver(this, this.dispatcher); 1289 this.valueObserver = new ValueObserver(this, this.controller); 1290 this.targetObserver = new TargetObserver(this, this); 1291 this.outletObserver = new OutletObserver(this, this); 1292 try { 1293 this.controller.initialize(); 1294 this.logDebugActivity("initialize"); 1295 } catch (error2) { 1296 this.handleError(error2, "initializing controller"); 1297 } 1298 } 1299 connect() { 1300 this.bindingObserver.start(); 1301 this.valueObserver.start(); 1302 this.targetObserver.start(); 1303 this.outletObserver.start(); 1304 try { 1305 this.controller.connect(); 1306 this.logDebugActivity("connect"); 1307 } catch (error2) { 1308 this.handleError(error2, "connecting controller"); 1309 } 1310 } 1311 refresh() { 1312 this.outletObserver.refresh(); 1313 } 1314 disconnect() { 1315 try { 1316 this.controller.disconnect(); 1317 this.logDebugActivity("disconnect"); 1318 } catch (error2) { 1319 this.handleError(error2, "disconnecting controller"); 1320 } 1321 this.outletObserver.stop(); 1322 this.targetObserver.stop(); 1323 this.valueObserver.stop(); 1324 this.bindingObserver.stop(); 1325 } 1326 get application() { 1327 return this.module.application; 1328 } 1329 get identifier() { 1330 return this.module.identifier; 1331 } 1332 get schema() { 1333 return this.application.schema; 1334 } 1335 get dispatcher() { 1336 return this.application.dispatcher; 1337 } 1338 get element() { 1339 return this.scope.element; 1340 } 1341 get parentElement() { 1342 return this.element.parentElement; 1343 } 1344 handleError(error2, message, detail = {}) { 1345 const { identifier, controller, element } = this; 1346 detail = Object.assign({ identifier, controller, element }, detail); 1347 this.application.handleError(error2, `Error ${message}`, detail); 1348 } 1349 targetConnected(element, name) { 1350 this.invokeControllerMethod(`${name}TargetConnected`, element); 1351 } 1352 targetDisconnected(element, name) { 1353 this.invokeControllerMethod(`${name}TargetDisconnected`, element); 1354 } 1355 outletConnected(outlet, element, name) { 1356 this.invokeControllerMethod(`${namespaceCamelize(name)}OutletConnected`, outlet, element); 1357 } 1358 outletDisconnected(outlet, element, name) { 1359 this.invokeControllerMethod(`${namespaceCamelize(name)}OutletDisconnected`, outlet, element); 1360 } 1361 invokeControllerMethod(methodName, ...args) { 1362 const controller = this.controller; 1363 if (typeof controller[methodName] == "function") { 1364 controller[methodName](...args); 1365 } 1366 } 1367 }; 1368 function bless(constructor) { 1369 return shadow(constructor, getBlessedProperties(constructor)); 1370 } 1371 function shadow(constructor, properties) { 1372 const shadowConstructor = extend(constructor); 1373 const shadowProperties = getShadowProperties(constructor.prototype, properties); 1374 Object.defineProperties(shadowConstructor.prototype, shadowProperties); 1375 return shadowConstructor; 1376 } 1377 function getBlessedProperties(constructor) { 1378 const blessings = readInheritableStaticArrayValues(constructor, "blessings"); 1379 return blessings.reduce((blessedProperties, blessing) => { 1380 const properties = blessing(constructor); 1381 for (const key in properties) { 1382 const descriptor = blessedProperties[key] || {}; 1383 blessedProperties[key] = Object.assign(descriptor, properties[key]); 1384 } 1385 return blessedProperties; 1386 }, {}); 1387 } 1388 function getShadowProperties(prototype, properties) { 1389 return getOwnKeys(properties).reduce((shadowProperties, key) => { 1390 const descriptor = getShadowedDescriptor(prototype, properties, key); 1391 if (descriptor) { 1392 Object.assign(shadowProperties, { [key]: descriptor }); 1393 } 1394 return shadowProperties; 1395 }, {}); 1396 } 1397 function getShadowedDescriptor(prototype, properties, key) { 1398 const shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key); 1399 const shadowedByValue = shadowingDescriptor && "value" in shadowingDescriptor; 1400 if (!shadowedByValue) { 1401 const descriptor = Object.getOwnPropertyDescriptor(properties, key).value; 1402 if (shadowingDescriptor) { 1403 descriptor.get = shadowingDescriptor.get || descriptor.get; 1404 descriptor.set = shadowingDescriptor.set || descriptor.set; 1405 } 1406 return descriptor; 1407 } 1408 } 1409 var getOwnKeys = (() => { 1410 if (typeof Object.getOwnPropertySymbols == "function") { 1411 return (object) => [...Object.getOwnPropertyNames(object), ...Object.getOwnPropertySymbols(object)]; 1412 } else { 1413 return Object.getOwnPropertyNames; 1414 } 1415 })(); 1416 var extend = (() => { 1417 function extendWithReflect(constructor) { 1418 function extended() { 1419 return Reflect.construct(constructor, arguments, new.target); 1420 } 1421 extended.prototype = Object.create(constructor.prototype, { 1422 constructor: { value: extended } 1423 }); 1424 Reflect.setPrototypeOf(extended, constructor); 1425 return extended; 1426 } 1427 function testReflectExtension() { 1428 const a = function() { 1429 this.a.call(this); 1430 }; 1431 const b = extendWithReflect(a); 1432 b.prototype.a = function() { 1433 }; 1434 return new b(); 1435 } 1436 try { 1437 testReflectExtension(); 1438 return extendWithReflect; 1439 } catch (error2) { 1440 return (constructor) => class extended extends constructor { 1441 }; 1442 } 1443 })(); 1444 function blessDefinition(definition) { 1445 return { 1446 identifier: definition.identifier, 1447 controllerConstructor: bless(definition.controllerConstructor) 1448 }; 1449 } 1450 var Module = class { 1451 constructor(application2, definition) { 1452 this.application = application2; 1453 this.definition = blessDefinition(definition); 1454 this.contextsByScope = /* @__PURE__ */ new WeakMap(); 1455 this.connectedContexts = /* @__PURE__ */ new Set(); 1456 } 1457 get identifier() { 1458 return this.definition.identifier; 1459 } 1460 get controllerConstructor() { 1461 return this.definition.controllerConstructor; 1462 } 1463 get contexts() { 1464 return Array.from(this.connectedContexts); 1465 } 1466 connectContextForScope(scope) { 1467 const context = this.fetchContextForScope(scope); 1468 this.connectedContexts.add(context); 1469 context.connect(); 1470 } 1471 disconnectContextForScope(scope) { 1472 const context = this.contextsByScope.get(scope); 1473 if (context) { 1474 this.connectedContexts.delete(context); 1475 context.disconnect(); 1476 } 1477 } 1478 fetchContextForScope(scope) { 1479 let context = this.contextsByScope.get(scope); 1480 if (!context) { 1481 context = new Context(this, scope); 1482 this.contextsByScope.set(scope, context); 1483 } 1484 return context; 1485 } 1486 }; 1487 var ClassMap = class { 1488 constructor(scope) { 1489 this.scope = scope; 1490 } 1491 has(name) { 1492 return this.data.has(this.getDataKey(name)); 1493 } 1494 get(name) { 1495 return this.getAll(name)[0]; 1496 } 1497 getAll(name) { 1498 const tokenString = this.data.get(this.getDataKey(name)) || ""; 1499 return tokenize(tokenString); 1500 } 1501 getAttributeName(name) { 1502 return this.data.getAttributeNameForKey(this.getDataKey(name)); 1503 } 1504 getDataKey(name) { 1505 return `${name}-class`; 1506 } 1507 get data() { 1508 return this.scope.data; 1509 } 1510 }; 1511 var DataMap = class { 1512 constructor(scope) { 1513 this.scope = scope; 1514 } 1515 get element() { 1516 return this.scope.element; 1517 } 1518 get identifier() { 1519 return this.scope.identifier; 1520 } 1521 get(key) { 1522 const name = this.getAttributeNameForKey(key); 1523 return this.element.getAttribute(name); 1524 } 1525 set(key, value) { 1526 const name = this.getAttributeNameForKey(key); 1527 this.element.setAttribute(name, value); 1528 return this.get(key); 1529 } 1530 has(key) { 1531 const name = this.getAttributeNameForKey(key); 1532 return this.element.hasAttribute(name); 1533 } 1534 delete(key) { 1535 if (this.has(key)) { 1536 const name = this.getAttributeNameForKey(key); 1537 this.element.removeAttribute(name); 1538 return true; 1539 } else { 1540 return false; 1541 } 1542 } 1543 getAttributeNameForKey(key) { 1544 return `data-${this.identifier}-${dasherize(key)}`; 1545 } 1546 }; 1547 var Guide = class { 1548 constructor(logger) { 1549 this.warnedKeysByObject = /* @__PURE__ */ new WeakMap(); 1550 this.logger = logger; 1551 } 1552 warn(object, key, message) { 1553 let warnedKeys = this.warnedKeysByObject.get(object); 1554 if (!warnedKeys) { 1555 warnedKeys = /* @__PURE__ */ new Set(); 1556 this.warnedKeysByObject.set(object, warnedKeys); 1557 } 1558 if (!warnedKeys.has(key)) { 1559 warnedKeys.add(key); 1560 this.logger.warn(message, object); 1561 } 1562 } 1563 }; 1564 function attributeValueContainsToken(attributeName, token) { 1565 return `[${attributeName}~="${token}"]`; 1566 } 1567 var TargetSet = class { 1568 constructor(scope) { 1569 this.scope = scope; 1570 } 1571 get element() { 1572 return this.scope.element; 1573 } 1574 get identifier() { 1575 return this.scope.identifier; 1576 } 1577 get schema() { 1578 return this.scope.schema; 1579 } 1580 has(targetName) { 1581 return this.find(targetName) != null; 1582 } 1583 find(...targetNames) { 1584 return targetNames.reduce((target, targetName) => target || this.findTarget(targetName) || this.findLegacyTarget(targetName), void 0); 1585 } 1586 findAll(...targetNames) { 1587 return targetNames.reduce((targets, targetName) => [ 1588 ...targets, 1589 ...this.findAllTargets(targetName), 1590 ...this.findAllLegacyTargets(targetName) 1591 ], []); 1592 } 1593 findTarget(targetName) { 1594 const selector = this.getSelectorForTargetName(targetName); 1595 return this.scope.findElement(selector); 1596 } 1597 findAllTargets(targetName) { 1598 const selector = this.getSelectorForTargetName(targetName); 1599 return this.scope.findAllElements(selector); 1600 } 1601 getSelectorForTargetName(targetName) { 1602 const attributeName = this.schema.targetAttributeForScope(this.identifier); 1603 return attributeValueContainsToken(attributeName, targetName); 1604 } 1605 findLegacyTarget(targetName) { 1606 const selector = this.getLegacySelectorForTargetName(targetName); 1607 return this.deprecate(this.scope.findElement(selector), targetName); 1608 } 1609 findAllLegacyTargets(targetName) { 1610 const selector = this.getLegacySelectorForTargetName(targetName); 1611 return this.scope.findAllElements(selector).map((element) => this.deprecate(element, targetName)); 1612 } 1613 getLegacySelectorForTargetName(targetName) { 1614 const targetDescriptor = `${this.identifier}.${targetName}`; 1615 return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor); 1616 } 1617 deprecate(element, targetName) { 1618 if (element) { 1619 const { identifier } = this; 1620 const attributeName = this.schema.targetAttribute; 1621 const revisedAttributeName = this.schema.targetAttributeForScope(identifier); 1622 this.guide.warn(element, `target:${targetName}`, `Please replace ${attributeName}="${identifier}.${targetName}" with ${revisedAttributeName}="${targetName}". The ${attributeName} attribute is deprecated and will be removed in a future version of Stimulus.`); 1623 } 1624 return element; 1625 } 1626 get guide() { 1627 return this.scope.guide; 1628 } 1629 }; 1630 var OutletSet = class { 1631 constructor(scope, controllerElement) { 1632 this.scope = scope; 1633 this.controllerElement = controllerElement; 1634 } 1635 get element() { 1636 return this.scope.element; 1637 } 1638 get identifier() { 1639 return this.scope.identifier; 1640 } 1641 get schema() { 1642 return this.scope.schema; 1643 } 1644 has(outletName) { 1645 return this.find(outletName) != null; 1646 } 1647 find(...outletNames) { 1648 return outletNames.reduce((outlet, outletName) => outlet || this.findOutlet(outletName), void 0); 1649 } 1650 findAll(...outletNames) { 1651 return outletNames.reduce((outlets, outletName) => [...outlets, ...this.findAllOutlets(outletName)], []); 1652 } 1653 getSelectorForOutletName(outletName) { 1654 const attributeName = this.schema.outletAttributeForScope(this.identifier, outletName); 1655 return this.controllerElement.getAttribute(attributeName); 1656 } 1657 findOutlet(outletName) { 1658 const selector = this.getSelectorForOutletName(outletName); 1659 if (selector) 1660 return this.findElement(selector, outletName); 1661 } 1662 findAllOutlets(outletName) { 1663 const selector = this.getSelectorForOutletName(outletName); 1664 return selector ? this.findAllElements(selector, outletName) : []; 1665 } 1666 findElement(selector, outletName) { 1667 const elements = this.scope.queryElements(selector); 1668 return elements.filter((element) => this.matchesElement(element, selector, outletName))[0]; 1669 } 1670 findAllElements(selector, outletName) { 1671 const elements = this.scope.queryElements(selector); 1672 return elements.filter((element) => this.matchesElement(element, selector, outletName)); 1673 } 1674 matchesElement(element, selector, outletName) { 1675 const controllerAttribute = element.getAttribute(this.scope.schema.controllerAttribute) || ""; 1676 return element.matches(selector) && controllerAttribute.split(" ").includes(outletName); 1677 } 1678 }; 1679 var Scope = class _Scope { 1680 constructor(schema, element, identifier, logger) { 1681 this.targets = new TargetSet(this); 1682 this.classes = new ClassMap(this); 1683 this.data = new DataMap(this); 1684 this.containsElement = (element2) => { 1685 return element2.closest(this.controllerSelector) === this.element; 1686 }; 1687 this.schema = schema; 1688 this.element = element; 1689 this.identifier = identifier; 1690 this.guide = new Guide(logger); 1691 this.outlets = new OutletSet(this.documentScope, element); 1692 } 1693 findElement(selector) { 1694 return this.element.matches(selector) ? this.element : this.queryElements(selector).find(this.containsElement); 1695 } 1696 findAllElements(selector) { 1697 return [ 1698 ...this.element.matches(selector) ? [this.element] : [], 1699 ...this.queryElements(selector).filter(this.containsElement) 1700 ]; 1701 } 1702 queryElements(selector) { 1703 return Array.from(this.element.querySelectorAll(selector)); 1704 } 1705 get controllerSelector() { 1706 return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier); 1707 } 1708 get isDocumentScope() { 1709 return this.element === document.documentElement; 1710 } 1711 get documentScope() { 1712 return this.isDocumentScope ? this : new _Scope(this.schema, document.documentElement, this.identifier, this.guide.logger); 1713 } 1714 }; 1715 var ScopeObserver = class { 1716 constructor(element, schema, delegate) { 1717 this.element = element; 1718 this.schema = schema; 1719 this.delegate = delegate; 1720 this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this); 1721 this.scopesByIdentifierByElement = /* @__PURE__ */ new WeakMap(); 1722 this.scopeReferenceCounts = /* @__PURE__ */ new WeakMap(); 1723 } 1724 start() { 1725 this.valueListObserver.start(); 1726 } 1727 stop() { 1728 this.valueListObserver.stop(); 1729 } 1730 get controllerAttribute() { 1731 return this.schema.controllerAttribute; 1732 } 1733 parseValueForToken(token) { 1734 const { element, content: identifier } = token; 1735 const scopesByIdentifier = this.fetchScopesByIdentifierForElement(element); 1736 let scope = scopesByIdentifier.get(identifier); 1737 if (!scope) { 1738 scope = this.delegate.createScopeForElementAndIdentifier(element, identifier); 1739 scopesByIdentifier.set(identifier, scope); 1740 } 1741 return scope; 1742 } 1743 elementMatchedValue(element, value) { 1744 const referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1; 1745 this.scopeReferenceCounts.set(value, referenceCount); 1746 if (referenceCount == 1) { 1747 this.delegate.scopeConnected(value); 1748 } 1749 } 1750 elementUnmatchedValue(element, value) { 1751 const referenceCount = this.scopeReferenceCounts.get(value); 1752 if (referenceCount) { 1753 this.scopeReferenceCounts.set(value, referenceCount - 1); 1754 if (referenceCount == 1) { 1755 this.delegate.scopeDisconnected(value); 1756 } 1757 } 1758 } 1759 fetchScopesByIdentifierForElement(element) { 1760 let scopesByIdentifier = this.scopesByIdentifierByElement.get(element); 1761 if (!scopesByIdentifier) { 1762 scopesByIdentifier = /* @__PURE__ */ new Map(); 1763 this.scopesByIdentifierByElement.set(element, scopesByIdentifier); 1764 } 1765 return scopesByIdentifier; 1766 } 1767 }; 1768 var Router = class { 1769 constructor(application2) { 1770 this.application = application2; 1771 this.scopeObserver = new ScopeObserver(this.element, this.schema, this); 1772 this.scopesByIdentifier = new Multimap(); 1773 this.modulesByIdentifier = /* @__PURE__ */ new Map(); 1774 } 1775 get element() { 1776 return this.application.element; 1777 } 1778 get schema() { 1779 return this.application.schema; 1780 } 1781 get logger() { 1782 return this.application.logger; 1783 } 1784 get controllerAttribute() { 1785 return this.schema.controllerAttribute; 1786 } 1787 get modules() { 1788 return Array.from(this.modulesByIdentifier.values()); 1789 } 1790 get contexts() { 1791 return this.modules.reduce((contexts, module) => contexts.concat(module.contexts), []); 1792 } 1793 start() { 1794 this.scopeObserver.start(); 1795 } 1796 stop() { 1797 this.scopeObserver.stop(); 1798 } 1799 loadDefinition(definition) { 1800 this.unloadIdentifier(definition.identifier); 1801 const module = new Module(this.application, definition); 1802 this.connectModule(module); 1803 const afterLoad = definition.controllerConstructor.afterLoad; 1804 if (afterLoad) { 1805 afterLoad(definition.identifier, this.application); 1806 } 1807 } 1808 unloadIdentifier(identifier) { 1809 const module = this.modulesByIdentifier.get(identifier); 1810 if (module) { 1811 this.disconnectModule(module); 1812 } 1813 } 1814 getContextForElementAndIdentifier(element, identifier) { 1815 const module = this.modulesByIdentifier.get(identifier); 1816 if (module) { 1817 return module.contexts.find((context) => context.element == element); 1818 } 1819 } 1820 handleError(error2, message, detail) { 1821 this.application.handleError(error2, message, detail); 1822 } 1823 createScopeForElementAndIdentifier(element, identifier) { 1824 return new Scope(this.schema, element, identifier, this.logger); 1825 } 1826 scopeConnected(scope) { 1827 this.scopesByIdentifier.add(scope.identifier, scope); 1828 const module = this.modulesByIdentifier.get(scope.identifier); 1829 if (module) { 1830 module.connectContextForScope(scope); 1831 } 1832 } 1833 scopeDisconnected(scope) { 1834 this.scopesByIdentifier.delete(scope.identifier, scope); 1835 const module = this.modulesByIdentifier.get(scope.identifier); 1836 if (module) { 1837 module.disconnectContextForScope(scope); 1838 } 1839 } 1840 connectModule(module) { 1841 this.modulesByIdentifier.set(module.identifier, module); 1842 const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier); 1843 scopes.forEach((scope) => module.connectContextForScope(scope)); 1844 } 1845 disconnectModule(module) { 1846 this.modulesByIdentifier.delete(module.identifier); 1847 const scopes = this.scopesByIdentifier.getValuesForKey(module.identifier); 1848 scopes.forEach((scope) => module.disconnectContextForScope(scope)); 1849 } 1850 }; 1851 var defaultSchema = { 1852 controllerAttribute: "data-controller", 1853 actionAttribute: "data-action", 1854 targetAttribute: "data-target", 1855 targetAttributeForScope: (identifier) => `data-${identifier}-target`, 1856 outletAttributeForScope: (identifier, outlet) => `data-${identifier}-${outlet}-outlet`, 1857 keyMappings: Object.assign(Object.assign({ enter: "Enter", tab: "Tab", esc: "Escape", space: " ", up: "ArrowUp", down: "ArrowDown", left: "ArrowLeft", right: "ArrowRight", home: "Home", end: "End" }, objectFromEntries("abcdefghijklmnopqrstuvwxyz".split("").map((c) => [c, c]))), objectFromEntries("0123456789".split("").map((n) => [n, n]))) 1858 }; 1859 function objectFromEntries(array) { 1860 return array.reduce((memo, [k, v]) => Object.assign(Object.assign({}, memo), { [k]: v }), {}); 1861 } 1862 var Application = class { 1863 constructor(element = document.documentElement, schema = defaultSchema) { 1864 this.logger = console; 1865 this.debug = false; 1866 this.logDebugActivity = (identifier, functionName, detail = {}) => { 1867 if (this.debug) { 1868 this.logFormattedMessage(identifier, functionName, detail); 1869 } 1870 }; 1871 this.element = element; 1872 this.schema = schema; 1873 this.dispatcher = new Dispatcher(this); 1874 this.router = new Router(this); 1875 this.actionDescriptorFilters = Object.assign({}, defaultActionDescriptorFilters); 1876 } 1877 static start(element, schema) { 1878 const application2 = new this(element, schema); 1879 application2.start(); 1880 return application2; 1881 } 1882 async start() { 1883 await domReady(); 1884 this.logDebugActivity("application", "starting"); 1885 this.dispatcher.start(); 1886 this.router.start(); 1887 this.logDebugActivity("application", "start"); 1888 } 1889 stop() { 1890 this.logDebugActivity("application", "stopping"); 1891 this.dispatcher.stop(); 1892 this.router.stop(); 1893 this.logDebugActivity("application", "stop"); 1894 } 1895 register(identifier, controllerConstructor) { 1896 this.load({ identifier, controllerConstructor }); 1897 } 1898 registerActionOption(name, filter) { 1899 this.actionDescriptorFilters[name] = filter; 1900 } 1901 load(head, ...rest) { 1902 const definitions = Array.isArray(head) ? head : [head, ...rest]; 1903 definitions.forEach((definition) => { 1904 if (definition.controllerConstructor.shouldLoad) { 1905 this.router.loadDefinition(definition); 1906 } 1907 }); 1908 } 1909 unload(head, ...rest) { 1910 const identifiers = Array.isArray(head) ? head : [head, ...rest]; 1911 identifiers.forEach((identifier) => this.router.unloadIdentifier(identifier)); 1912 } 1913 get controllers() { 1914 return this.router.contexts.map((context) => context.controller); 1915 } 1916 getControllerForElementAndIdentifier(element, identifier) { 1917 const context = this.router.getContextForElementAndIdentifier(element, identifier); 1918 return context ? context.controller : null; 1919 } 1920 handleError(error2, message, detail) { 1921 var _a; 1922 this.logger.error(`%s 1923 1924%o 1925 1926%o`, message, error2, detail); 1927 (_a = window.onerror) === null || _a === void 0 ? void 0 : _a.call(window, message, "", 0, 0, error2); 1928 } 1929 logFormattedMessage(identifier, functionName, detail = {}) { 1930 detail = Object.assign({ application: this }, detail); 1931 this.logger.groupCollapsed(`${identifier} #${functionName}`); 1932 this.logger.log("details:", Object.assign({}, detail)); 1933 this.logger.groupEnd(); 1934 } 1935 }; 1936 function domReady() { 1937 return new Promise((resolve) => { 1938 if (document.readyState == "loading") { 1939 document.addEventListener("DOMContentLoaded", () => resolve()); 1940 } else { 1941 resolve(); 1942 } 1943 }); 1944 } 1945 function ClassPropertiesBlessing(constructor) { 1946 const classes = readInheritableStaticArrayValues(constructor, "classes"); 1947 return classes.reduce((properties, classDefinition) => { 1948 return Object.assign(properties, propertiesForClassDefinition(classDefinition)); 1949 }, {}); 1950 } 1951 function propertiesForClassDefinition(key) { 1952 return { 1953 [`${key}Class`]: { 1954 get() { 1955 const { classes } = this; 1956 if (classes.has(key)) { 1957 return classes.get(key); 1958 } else { 1959 const attribute = classes.getAttributeName(key); 1960 throw new Error(`Missing attribute "${attribute}"`); 1961 } 1962 } 1963 }, 1964 [`${key}Classes`]: { 1965 get() { 1966 return this.classes.getAll(key); 1967 } 1968 }, 1969 [`has${capitalize(key)}Class`]: { 1970 get() { 1971 return this.classes.has(key); 1972 } 1973 } 1974 }; 1975 } 1976 function OutletPropertiesBlessing(constructor) { 1977 const outlets = readInheritableStaticArrayValues(constructor, "outlets"); 1978 return outlets.reduce((properties, outletDefinition) => { 1979 return Object.assign(properties, propertiesForOutletDefinition(outletDefinition)); 1980 }, {}); 1981 } 1982 function propertiesForOutletDefinition(name) { 1983 const camelizedName = namespaceCamelize(name); 1984 return { 1985 [`${camelizedName}Outlet`]: { 1986 get() { 1987 const outlet = this.outlets.find(name); 1988 if (outlet) { 1989 const outletController = this.application.getControllerForElementAndIdentifier(outlet, name); 1990 if (outletController) { 1991 return outletController; 1992 } else { 1993 throw new Error(`Missing "data-controller=${name}" attribute on outlet element for "${this.identifier}" controller`); 1994 } 1995 } 1996 throw new Error(`Missing outlet element "${name}" for "${this.identifier}" controller`); 1997 } 1998 }, 1999 [`${camelizedName}Outlets`]: { 2000 get() { 2001 const outlets = this.outlets.findAll(name); 2002 if (outlets.length > 0) { 2003 return outlets.map((outlet) => { 2004 const controller = this.application.getControllerForElementAndIdentifier(outlet, name); 2005 if (controller) { 2006 return controller; 2007 } else { 2008 console.warn(`The provided outlet element is missing the outlet controller "${name}" for "${this.identifier}"`, outlet); 2009 } 2010 }).filter((controller) => controller); 2011 } 2012 return []; 2013 } 2014 }, 2015 [`${camelizedName}OutletElement`]: { 2016 get() { 2017 const outlet = this.outlets.find(name); 2018 if (outlet) { 2019 return outlet; 2020 } else { 2021 throw new Error(`Missing outlet element "${name}" for "${this.identifier}" controller`); 2022 } 2023 } 2024 }, 2025 [`${camelizedName}OutletElements`]: { 2026 get() { 2027 return this.outlets.findAll(name); 2028 } 2029 }, 2030 [`has${capitalize(camelizedName)}Outlet`]: { 2031 get() { 2032 return this.outlets.has(name); 2033 } 2034 } 2035 }; 2036 } 2037 function TargetPropertiesBlessing(constructor) { 2038 const targets = readInheritableStaticArrayValues(constructor, "targets"); 2039 return targets.reduce((properties, targetDefinition) => { 2040 return Object.assign(properties, propertiesForTargetDefinition(targetDefinition)); 2041 }, {}); 2042 } 2043 function propertiesForTargetDefinition(name) { 2044 return { 2045 [`${name}Target`]: { 2046 get() { 2047 const target = this.targets.find(name); 2048 if (target) { 2049 return target; 2050 } else { 2051 throw new Error(`Missing target element "${name}" for "${this.identifier}" controller`); 2052 } 2053 } 2054 }, 2055 [`${name}Targets`]: { 2056 get() { 2057 return this.targets.findAll(name); 2058 } 2059 }, 2060 [`has${capitalize(name)}Target`]: { 2061 get() { 2062 return this.targets.has(name); 2063 } 2064 } 2065 }; 2066 } 2067 function ValuePropertiesBlessing(constructor) { 2068 const valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, "values"); 2069 const propertyDescriptorMap = { 2070 valueDescriptorMap: { 2071 get() { 2072 return valueDefinitionPairs.reduce((result, valueDefinitionPair) => { 2073 const valueDescriptor = parseValueDefinitionPair(valueDefinitionPair, this.identifier); 2074 const attributeName = this.data.getAttributeNameForKey(valueDescriptor.key); 2075 return Object.assign(result, { [attributeName]: valueDescriptor }); 2076 }, {}); 2077 } 2078 } 2079 }; 2080 return valueDefinitionPairs.reduce((properties, valueDefinitionPair) => { 2081 return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair)); 2082 }, propertyDescriptorMap); 2083 } 2084 function propertiesForValueDefinitionPair(valueDefinitionPair, controller) { 2085 const definition = parseValueDefinitionPair(valueDefinitionPair, controller); 2086 const { key, name, reader: read, writer: write } = definition; 2087 return { 2088 [name]: { 2089 get() { 2090 const value = this.data.get(key); 2091 if (value !== null) { 2092 return read(value); 2093 } else { 2094 return definition.defaultValue; 2095 } 2096 }, 2097 set(value) { 2098 if (value === void 0) { 2099 this.data.delete(key); 2100 } else { 2101 this.data.set(key, write(value)); 2102 } 2103 } 2104 }, 2105 [`has${capitalize(name)}`]: { 2106 get() { 2107 return this.data.has(key) || definition.hasCustomDefaultValue; 2108 } 2109 } 2110 }; 2111 } 2112 function parseValueDefinitionPair([token, typeDefinition], controller) { 2113 return valueDescriptorForTokenAndTypeDefinition({ 2114 controller, 2115 token, 2116 typeDefinition 2117 }); 2118 } 2119 function parseValueTypeConstant(constant) { 2120 switch (constant) { 2121 case Array: 2122 return "array"; 2123 case Boolean: 2124 return "boolean"; 2125 case Number: 2126 return "number"; 2127 case Object: 2128 return "object"; 2129 case String: 2130 return "string"; 2131 } 2132 } 2133 function parseValueTypeDefault(defaultValue) { 2134 switch (typeof defaultValue) { 2135 case "boolean": 2136 return "boolean"; 2137 case "number": 2138 return "number"; 2139 case "string": 2140 return "string"; 2141 } 2142 if (Array.isArray(defaultValue)) 2143 return "array"; 2144 if (Object.prototype.toString.call(defaultValue) === "[object Object]") 2145 return "object"; 2146 } 2147 function parseValueTypeObject(payload) { 2148 const typeFromObject = parseValueTypeConstant(payload.typeObject.type); 2149 if (!typeFromObject) 2150 return; 2151 const defaultValueType = parseValueTypeDefault(payload.typeObject.default); 2152 if (typeFromObject !== defaultValueType) { 2153 const propertyPath = payload.controller ? `${payload.controller}.${payload.token}` : payload.token; 2154 throw new Error(`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}".`); 2155 } 2156 return typeFromObject; 2157 } 2158 function parseValueTypeDefinition(payload) { 2159 const typeFromObject = parseValueTypeObject({ 2160 controller: payload.controller, 2161 token: payload.token, 2162 typeObject: payload.typeDefinition 2163 }); 2164 const typeFromDefaultValue = parseValueTypeDefault(payload.typeDefinition); 2165 const typeFromConstant = parseValueTypeConstant(payload.typeDefinition); 2166 const type = typeFromObject || typeFromDefaultValue || typeFromConstant; 2167 if (type) 2168 return type; 2169 const propertyPath = payload.controller ? `${payload.controller}.${payload.typeDefinition}` : payload.token; 2170 throw new Error(`Unknown value type "${propertyPath}" for "${payload.token}" value`); 2171 } 2172 function defaultValueForDefinition(typeDefinition) { 2173 const constant = parseValueTypeConstant(typeDefinition); 2174 if (constant) 2175 return defaultValuesByType[constant]; 2176 const defaultValue = typeDefinition.default; 2177 if (defaultValue !== void 0) 2178 return defaultValue; 2179 return typeDefinition; 2180 } 2181 function valueDescriptorForTokenAndTypeDefinition(payload) { 2182 const key = `${dasherize(payload.token)}-value`; 2183 const type = parseValueTypeDefinition(payload); 2184 return { 2185 type, 2186 key, 2187 name: camelize(key), 2188 get defaultValue() { 2189 return defaultValueForDefinition(payload.typeDefinition); 2190 }, 2191 get hasCustomDefaultValue() { 2192 return parseValueTypeDefault(payload.typeDefinition) !== void 0; 2193 }, 2194 reader: readers[type], 2195 writer: writers[type] || writers.default 2196 }; 2197 } 2198 var defaultValuesByType = { 2199 get array() { 2200 return []; 2201 }, 2202 boolean: false, 2203 number: 0, 2204 get object() { 2205 return {}; 2206 }, 2207 string: "" 2208 }; 2209 var readers = { 2210 array(value) { 2211 const array = JSON.parse(value); 2212 if (!Array.isArray(array)) { 2213 throw new TypeError(`expected value of type "array" but instead got value "${value}" of type "${parseValueTypeDefault(array)}"`); 2214 } 2215 return array; 2216 }, 2217 boolean(value) { 2218 return !(value == "0" || String(value).toLowerCase() == "false"); 2219 }, 2220 number(value) { 2221 return Number(value); 2222 }, 2223 object(value) { 2224 const object = JSON.parse(value); 2225 if (object === null || typeof object != "object" || Array.isArray(object)) { 2226 throw new TypeError(`expected value of type "object" but instead got value "${value}" of type "${parseValueTypeDefault(object)}"`); 2227 } 2228 return object; 2229 }, 2230 string(value) { 2231 return value; 2232 } 2233 }; 2234 var writers = { 2235 default: writeString, 2236 array: writeJSON, 2237 object: writeJSON 2238 }; 2239 function writeJSON(value) { 2240 return JSON.stringify(value); 2241 } 2242 function writeString(value) { 2243 return `${value}`; 2244 } 2245 var Controller = class { 2246 constructor(context) { 2247 this.context = context; 2248 } 2249 static get shouldLoad() { 2250 return true; 2251 } 2252 static afterLoad(_identifier, _application) { 2253 return; 2254 } 2255 get application() { 2256 return this.context.application; 2257 } 2258 get scope() { 2259 return this.context.scope; 2260 } 2261 get element() { 2262 return this.scope.element; 2263 } 2264 get identifier() { 2265 return this.scope.identifier; 2266 } 2267 get targets() { 2268 return this.scope.targets; 2269 } 2270 get outlets() { 2271 return this.scope.outlets; 2272 } 2273 get classes() { 2274 return this.scope.classes; 2275 } 2276 get data() { 2277 return this.scope.data; 2278 } 2279 initialize() { 2280 } 2281 connect() { 2282 } 2283 disconnect() { 2284 } 2285 dispatch(eventName, { target = this.element, detail = {}, prefix = this.identifier, bubbles = true, cancelable = true } = {}) { 2286 const type = prefix ? `${prefix}:${eventName}` : eventName; 2287 const event = new CustomEvent(type, { detail, bubbles, cancelable }); 2288 target.dispatchEvent(event); 2289 return event; 2290 } 2291 }; 2292 Controller.blessings = [ 2293 ClassPropertiesBlessing, 2294 TargetPropertiesBlessing, 2295 ValuePropertiesBlessing, 2296 OutletPropertiesBlessing 2297 ]; 2298 Controller.targets = []; 2299 Controller.outlets = []; 2300 Controller.values = {}; 2301 2302
2302// app/javascript/lib/stimulus_app.js 2303 function stimulusApplication() { 2304 if (!window.Stimulus) { 2305 const application2 = Application.start(); 2306 application2.debug = false; 2307 window.Stimulus = conRegistroUnico(application2); 2308 } 2309 return window.Stimulus; 2310 } 2311 function conRegistroUnico(application2) { 2312 const registrados = /* @__PURE__ */ new Set(); 2313 const registrar = application2.register.bind(application2); 2314 application2.register = (identificador, controlador) => { 2315 if (registrados.has(identificador)) return; 2316 registrados.add(identificador); 2317 registrar(identificador, controlador); 2318 }; 2319 return application2; 2320 } 2321 2322
2322// app/javascript/packs/notificaciones.js 2323 var NotificacionesController = class extends Controller { 2324 marcarLeidaClick(e) { 2325 const url = e.target.dataset.url; 2326 fetch(url).then((response) => response.text()).then((responseText) => { 2327 this.contadorNoLeidasTarget.innerText = "(" + responseText + ")"; 2328 e.target.parentElement.classList.remove("rnk-HoverableList_ItemWrapper-unread"); 2329 e.target.parentElement.classList.add("rnk-HoverableList_ItemWrapper"); 2330 e.target.remove(); 2331 }); 2332 } 2333 marcarTodasLeidasClick(e) { 2334 const url = e.target.dataset.url; 2335 fetch(url).then((_) => { 2336 this.contadorNoLeidasTarget.innerText = "(0)"; 2337 this.element.querySelectorAll(".rnk-HoverableList_ItemWrapper-unread").forEach(function(elem) { 2338 elem.classList.remove("rnk-HoverableList_ItemWrapper-unread"); 2339 elem.classList.add("rnk-HoverableList_ItemWrapper"); 2340 elem.querySelector(".rnk-HoverableList_ItemMarkRead").remove(); 2341 }); 2342 }); 2343 } 2344 verMasClick() { 2345 const url = this.buildVerMasURL(this.siguientePagina()); 2346 fetch(url).then((response) => response.text()).then((responseText) => { 2347 this.verMasTarget.remove(); 2348 this.contentTarget.insertAdjacentHTML("beforeend", responseText); 2349 }); 2350 } 2351 // 2352 // Private 2353 // 2354 buildVerMasURL(pagina) { 2355 const url = this.baseNotificacionesURL(); 2356 url.pathname += "/ver-mas/"; 2357 url.search = `?page=${pagina}`; 2358 return url; 2359 } 2360 baseNotificacionesURL() { 2361 const url = new URL(location); 2362 url.pathname = "notificaciones"; 2363 return url; 2364 } 2365 siguientePagina() { 2366 this.data.set("pagina", parseInt(this.data.get("pagina")) + 1); 2367 return this.data.get("pagina"); 2368 } 2369 }; 2370 __publicField(NotificacionesController, "targets", ["contadorNoLeidas", "content", "verMas"]); 2371 var application = stimulusApplication(); 2372 application.register("notificaciones", NotificacionesController); 2373})(); 2374//# sourceMappingURL=/assets/notificaciones-e51c2f99.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.