diff options
Diffstat (limited to 'alpinejs/packages/csp/dist/cdn.js')
-rw-r--r-- | alpinejs/packages/csp/dist/cdn.js | 659 |
1 files changed, 425 insertions, 234 deletions
diff --git a/alpinejs/packages/csp/dist/cdn.js b/alpinejs/packages/csp/dist/cdn.js index 8dd1204..1b07e7b 100644 --- a/alpinejs/packages/csp/dist/cdn.js +++ b/alpinejs/packages/csp/dist/cdn.js @@ -11,6 +11,11 @@ queue.push(job); queueFlush(); } + function dequeueJob(job) { + let index = queue.indexOf(job); + if (index !== -1) + queue.splice(index, 1); + } function queueFlush() { if (!flushing && !flushPending) { flushPending = true; @@ -84,8 +89,15 @@ function onElAdded(callback) { onElAddeds.push(callback); } - function onElRemoved(callback) { - onElRemoveds.push(callback); + function onElRemoved(el, callback) { + if (typeof callback === "function") { + if (!el._x_cleanups) + el._x_cleanups = []; + el._x_cleanups.push(callback); + } else { + callback = el; + onElRemoveds.push(callback); + } } function onAttributesAdded(callback) { onAttributeAddeds.push(callback); @@ -198,16 +210,34 @@ addedAttributes.forEach((attrs, el) => { onAttributeAddeds.forEach((i) => i(el, attrs)); }); - for (let node of addedNodes) { - if (removedNodes.includes(node)) - continue; - onElAddeds.forEach((i) => i(node)); - } for (let node of removedNodes) { if (addedNodes.includes(node)) continue; onElRemoveds.forEach((i) => i(node)); + if (node._x_cleanups) { + while (node._x_cleanups.length) + node._x_cleanups.pop()(); + } + } + addedNodes.forEach((node) => { + node._x_ignoreSelf = true; + node._x_ignore = true; + }); + for (let node of addedNodes) { + if (removedNodes.includes(node)) + continue; + if (!node.isConnected) + continue; + delete node._x_ignoreSelf; + delete node._x_ignore; + onElAddeds.forEach((i) => i(node)); + node._x_ignore = true; + node._x_ignoreSelf = true; } + addedNodes.forEach((node) => { + delete node._x_ignoreSelf; + delete node._x_ignore; + }); addedNodes = null; removedNodes = null; addedAttributes = null; @@ -215,15 +245,18 @@ } // packages/alpinejs/src/scope.js + function scope(node) { + return mergeProxies(closestDataStack(node)); + } function addScopeToNode(node, data2, referenceNode) { node._x_dataStack = [data2, ...closestDataStack(referenceNode || node)]; return () => { node._x_dataStack = node._x_dataStack.filter((i) => i !== data2); }; } - function refreshScope(element, scope) { + function refreshScope(element, scope2) { let existingScope = element._x_dataStack[0]; - Object.entries(scope).forEach(([key, value]) => { + Object.entries(scope2).forEach(([key, value]) => { existingScope[key] = value; }); } @@ -359,7 +392,10 @@ Object.entries(magics).forEach(([name, callback]) => { Object.defineProperty(obj, `$${name}`, { get() { - return callback(el, {Alpine: alpine_default, interceptor}); + let [utilities, cleanup2] = getElementBoundUtilities(el); + utilities = {interceptor, ...utilities}; + onElRemoved(el, cleanup2); + return callback(el, utilities); }, enumerable: false }); @@ -416,8 +452,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } function generateEvaluatorFromFunction(dataStack, func) { return (receiver = () => { - }, {scope = {}, params = []} = {}) => { - let result = func.apply(mergeProxies([scope, ...dataStack]), params); + }, {scope: scope2 = {}, params = []} = {}) => { + let result = func.apply(mergeProxies([scope2, ...dataStack]), params); runIfTypeOfFunction(receiver, result); }; } @@ -444,27 +480,28 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); function generateEvaluatorFromString(dataStack, expression, el) { let func = generateFunctionFromString(expression, el); return (receiver = () => { - }, {scope = {}, params = []} = {}) => { + }, {scope: scope2 = {}, params = []} = {}) => { func.result = void 0; func.finished = false; - let completeScope = mergeProxies([scope, ...dataStack]); + let completeScope = mergeProxies([scope2, ...dataStack]); if (typeof func === "function") { let promise = func(func, completeScope).catch((error2) => handleError(error2, el, expression)); if (func.finished) { runIfTypeOfFunction(receiver, func.result, completeScope, params, el); + func.result = void 0; } else { promise.then((result) => { runIfTypeOfFunction(receiver, result, completeScope, params, el); - }).catch((error2) => handleError(error2, el, expression)); + }).catch((error2) => handleError(error2, el, expression)).finally(() => func.result = void 0); } } }; } - function runIfTypeOfFunction(receiver, value, scope, params, el) { + function runIfTypeOfFunction(receiver, value, scope2, params, el) { if (typeof value === "function") { - let result = value.apply(scope, params); + let result = value.apply(scope2, params); if (result instanceof Promise) { - result.then((i) => runIfTypeOfFunction(receiver, i, scope, params)).catch((error2) => handleError(error2, el, value)); + result.then((i) => runIfTypeOfFunction(receiver, i, scope2, params)).catch((error2) => handleError(error2, el, value)); } else { receiver(result); } @@ -515,10 +552,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); callback(flushHandlers); stopDeferring(); } - function getDirectiveHandler(el, directive2) { - let noop = () => { - }; - let handler3 = directiveHandlers[directive2.type] || noop; + function getElementBoundUtilities(el) { let cleanups = []; let cleanup2 = (callback) => cleanups.push(callback); let [effect3, cleanupEffect] = elementBoundEffect(el); @@ -531,7 +565,14 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); evaluate: evaluate.bind(evaluate, el) }; let doCleanup = () => cleanups.forEach((i) => i()); - onAttributeRemoved(el, directive2.original, doCleanup); + return [utilities, doCleanup]; + } + function getDirectiveHandler(el, directive2) { + let noop = () => { + }; + let handler3 = directiveHandlers[directive2.type] || noop; + let [utilities, cleanup2] = getElementBoundUtilities(el); + onAttributeRemoved(el, directive2.original, cleanup2); let fullHandler = () => { if (el._x_ignore || el._x_ignoreSelf) return; @@ -539,7 +580,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); handler3 = handler3.bind(handler3, el, directive2, utilities); isDeferringHandlers ? directiveHandlerStacks.get(currentHandlerStackKey).push(handler3) : handler3(); }; - fullHandler.runCleanups = doCleanup; + fullHandler.runCleanups = cleanup2; return fullHandler; } var startingWith = (subject, replacement) => ({name, value}) => { @@ -587,14 +628,17 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); "ignore", "ref", "data", + "id", "bind", "init", "for", "model", + "modelable", "transition", "show", "if", DEFAULT, + "teleport", "element" ]; function byPriority(a, b) { @@ -663,7 +707,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); dispatch(document, "alpine:initializing"); startObservingMutations(); onElAdded((el) => initTree(el, walk)); - onElRemoved((el) => nextTick(() => destroyTree(el))); + onElRemoved((el) => destroyTree(el)); onAttributesAdded((el, attrs) => { directives(el, attrs).forEach((handle) => handle()); }); @@ -688,14 +732,22 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); initSelectorCallbacks.push(selectorCallback); } function closestRoot(el, includeInitSelectors = false) { + return findClosest(el, (element) => { + const selectors = includeInitSelectors ? allSelectors() : rootSelectors(); + if (selectors.some((selector) => element.matches(selector))) + return true; + }); + } + function findClosest(el, callback) { if (!el) return; - const selectors = includeInitSelectors ? allSelectors() : rootSelectors(); - if (selectors.some((selector) => el.matches(selector))) + if (callback(el)) return el; + if (el._x_teleportBack) + el = el._x_teleportBack; if (!el.parentElement) return; - return closestRoot(el.parentElement, includeInitSelectors); + return findClosest(el.parentElement, callback); } function isRoot(el) { return rootSelectors().some((selector) => el.matches(selector)); @@ -770,7 +822,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); let previousStyles = {}; Object.entries(value).forEach(([key, value2]) => { previousStyles[key] = el.style[key]; - el.style.setProperty(kebabCase(key), value2); + if (!key.startsWith("--")) { + key = kebabCase(key); + } + el.style.setProperty(key, value2); }); setTimeout(() => { if (el.style.length === 0) { @@ -785,7 +840,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); let cache = el.getAttribute("style", value); el.setAttribute("style", value); return () => { - el.setAttribute("style", cache); + el.setAttribute("style", cache || ""); }; } function kebabCase(subject) { @@ -1082,6 +1137,179 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return rawValue; } + // packages/alpinejs/src/clone.js + var isCloning = false; + function skipDuringClone(callback, fallback = () => { + }) { + return (...args) => isCloning ? fallback(...args) : callback(...args); + } + function clone(oldEl, newEl) { + if (!newEl._x_dataStack) + newEl._x_dataStack = oldEl._x_dataStack; + isCloning = true; + dontRegisterReactiveSideEffects(() => { + cloneTree(newEl); + }); + isCloning = false; + } + function cloneTree(el) { + let hasRunThroughFirstEl = false; + let shallowWalker = (el2, callback) => { + walk(el2, (el3, skip) => { + if (hasRunThroughFirstEl && isRoot(el3)) + return skip(); + hasRunThroughFirstEl = true; + callback(el3, skip); + }); + }; + initTree(el, shallowWalker); + } + function dontRegisterReactiveSideEffects(callback) { + let cache = effect; + overrideEffect((callback2, el) => { + let storedEffect = cache(callback2); + release(storedEffect); + return () => { + }; + }); + callback(); + overrideEffect(cache); + } + + // packages/alpinejs/src/utils/bind.js + function bind(el, name, value, modifiers = []) { + if (!el._x_bindings) + el._x_bindings = reactive({}); + el._x_bindings[name] = value; + name = modifiers.includes("camel") ? camelCase(name) : name; + switch (name) { + case "value": + bindInputValue(el, value); + break; + case "style": + bindStyles(el, value); + break; + case "class": + bindClasses(el, value); + break; + default: + bindAttribute(el, name, value); + break; + } + } + function bindInputValue(el, value) { + if (el.type === "radio") { + if (el.attributes.value === void 0) { + el.value = value; + } + if (window.fromModel) { + el.checked = checkedAttrLooseCompare(el.value, value); + } + } else if (el.type === "checkbox") { + if (Number.isInteger(value)) { + el.value = value; + } else if (!Number.isInteger(value) && !Array.isArray(value) && typeof value !== "boolean" && ![null, void 0].includes(value)) { + el.value = String(value); + } else { + if (Array.isArray(value)) { + el.checked = value.some((val) => checkedAttrLooseCompare(val, el.value)); + } else { + el.checked = !!value; + } + } + } else if (el.tagName === "SELECT") { + updateSelect(el, value); + } else { + if (el.value === value) + return; + el.value = value; + } + } + function bindClasses(el, value) { + if (el._x_undoAddedClasses) + el._x_undoAddedClasses(); + el._x_undoAddedClasses = setClasses(el, value); + } + function bindStyles(el, value) { + if (el._x_undoAddedStyles) + el._x_undoAddedStyles(); + el._x_undoAddedStyles = setStyles(el, value); + } + function bindAttribute(el, name, value) { + if ([null, void 0, false].includes(value) && attributeShouldntBePreservedIfFalsy(name)) { + el.removeAttribute(name); + } else { + if (isBooleanAttr(name)) + value = name; + setIfChanged(el, name, value); + } + } + function setIfChanged(el, attrName, value) { + if (el.getAttribute(attrName) != value) { + el.setAttribute(attrName, value); + } + } + function updateSelect(el, value) { + const arrayWrappedValue = [].concat(value).map((value2) => { + return value2 + ""; + }); + Array.from(el.options).forEach((option) => { + option.selected = arrayWrappedValue.includes(option.value); + }); + } + function camelCase(subject) { + return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase()); + } + function checkedAttrLooseCompare(valueA, valueB) { + return valueA == valueB; + } + function isBooleanAttr(attrName) { + const booleanAttributes = [ + "disabled", + "checked", + "required", + "readonly", + "hidden", + "open", + "selected", + "autofocus", + "itemscope", + "multiple", + "novalidate", + "allowfullscreen", + "allowpaymentrequest", + "formnovalidate", + "autoplay", + "controls", + "loop", + "muted", + "playsinline", + "default", + "ismap", + "reversed", + "async", + "defer", + "nomodule" + ]; + return booleanAttributes.includes(attrName); + } + function attributeShouldntBePreservedIfFalsy(name) { + return !["aria-pressed", "aria-checked", "aria-expanded", "aria-selected"].includes(name); + } + function getBinding(el, name, fallback) { + if (el._x_bindings && el._x_bindings[name] !== void 0) + return el._x_bindings[name]; + let attr = el.getAttribute(name); + if (attr === null) + return typeof fallback === "function" ? fallback() : fallback; + if (isBooleanAttr(name)) { + return !![name, "true"].includes(attr); + } + if (attr === "") + return true; + return attr; + } + // packages/alpinejs/src/utils/debounce.js function debounce(func, wait) { var timeout; @@ -1135,42 +1363,22 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return stores; } - // packages/alpinejs/src/clone.js - var isCloning = false; - function skipDuringClone(callback, fallback = () => { - }) { - return (...args) => isCloning ? fallback(...args) : callback(...args); + // packages/alpinejs/src/binds.js + var binds = {}; + function bind2(name, object) { + binds[name] = typeof object !== "function" ? () => object : object; } - function clone(oldEl, newEl) { - newEl._x_dataStack = oldEl._x_dataStack; - isCloning = true; - dontRegisterReactiveSideEffects(() => { - cloneTree(newEl); - }); - isCloning = false; - } - function cloneTree(el) { - let hasRunThroughFirstEl = false; - let shallowWalker = (el2, callback) => { - walk(el2, (el3, skip) => { - if (hasRunThroughFirstEl && isRoot(el3)) - return skip(); - hasRunThroughFirstEl = true; - callback(el3, skip); + function injectBindingProviders(obj) { + Object.entries(binds).forEach(([name, callback]) => { + Object.defineProperty(obj, name, { + get() { + return (...args) => { + return callback(...args); + }; + } }); - }; - initTree(el, shallowWalker); - } - function dontRegisterReactiveSideEffects(callback) { - let cache = effect; - overrideEffect((callback2, el) => { - let storedEffect = cache(callback2); - release(storedEffect); - return () => { - }; }); - callback(); - overrideEffect(cache); + return obj; } // packages/alpinejs/src/datas.js @@ -1206,19 +1414,23 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); get raw() { return raw; }, - version: "3.5.1", + version: "3.9.1", flushAndStopDeferringMutations, disableEffectScheduling, stopObservingMutations, + destroyTree, setReactivityEngine, + closestDataStack, skipDuringClone, addRootSelector, + addInitSelector, + addScopeToNode, deferMutations, mapAttributes, evaluateLater, setEvaluator, mergeProxies, - destroyTree, + findClosest, closestRoot, interceptor, transition, @@ -1230,13 +1442,17 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); evaluate, initTree, nextTick, + prefixed: prefix, prefix: setPrefix, plugin, magic, store, start, clone, - data + bound: getBinding, + $data: scope, + data, + bind: bind2 }; var alpine_default = Alpine; @@ -1271,7 +1487,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); [3]: "FORWARDED" }; var specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; - var isBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`); + var isBooleanAttr2 = /* @__PURE__ */ makeMap(specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`); var EMPTY_OBJ = true ? Object.freeze({}) : {}; var EMPTY_ARR = true ? Object.freeze([]) : []; var extend = Object.assign; @@ -1926,15 +2142,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); magic("dispatch", (el) => dispatch.bind(dispatch, el)); // packages/alpinejs/src/magics/$watch.js - magic("watch", (el) => (key, callback) => { - let evaluate2 = evaluateLater(el, key); + magic("watch", (el, {evaluateLater: evaluateLater2, effect: effect3}) => (key, callback) => { + let evaluate2 = evaluateLater2(key); let firstTime = true; let oldValue; - let [effect3, cleanupEffect] = elementBoundEffect(el); - onAttributeRemoved(el, key, cleanupEffect); effect3(() => evaluate2((value) => { - let div = document.createElement("div"); - div.dataset.throwAway = value; + JSON.stringify(value); if (!firstTime) { queueMicrotask(() => { callback(value, oldValue); @@ -1951,9 +2164,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); magic("store", getStores); // packages/alpinejs/src/magics/$data.js - magic("data", (el) => { - return mergeProxies(closestDataStack(el)); - }); + magic("data", (el) => scope(el)); // packages/alpinejs/src/magics/$root.js magic("root", (el) => closestRoot(el)); @@ -1976,9 +2187,88 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return refObjects; } + // packages/alpinejs/src/ids.js + var globalIdMemo = {}; + function findAndIncrementId(name) { + if (!globalIdMemo[name]) + globalIdMemo[name] = 0; + return ++globalIdMemo[name]; + } + function closestIdRoot(el, name) { + return findClosest(el, (element) => { + if (element._x_ids && element._x_ids[name]) + return true; + }); + } + function setIdRoot(el, name) { + if (!el._x_ids) + el._x_ids = {}; + if (!el._x_ids[name]) + el._x_ids[name] = findAndIncrementId(name); + } + + // packages/alpinejs/src/magics/$id.js + magic("id", (el) => (name, key = null) => { + let root = closestIdRoot(el, name); + let id = root ? root._x_ids[name] : findAndIncrementId(name); + return key ? `${name}-${id}-${key}` : `${name}-${id}`; + }); + // packages/alpinejs/src/magics/$el.js magic("el", (el) => el); + // packages/alpinejs/src/directives/x-modelable.js + directive("modelable", (el, {expression}, {effect: effect3, evaluate: evaluate2, evaluateLater: evaluateLater2}) => { + let func = evaluateLater2(expression); + let innerGet = () => { + let result; + func((i) => result = i); + return result; + }; + let evaluateInnerSet = evaluateLater2(`${expression} = __placeholder`); + let innerSet = (val) => evaluateInnerSet(() => { + }, {scope: {__placeholder: val}}); + let initialValue = innerGet(); + if (el._x_modelable_hook) + initialValue = el._x_modelable_hook(initialValue); + innerSet(initialValue); + queueMicrotask(() => { + if (!el._x_model) + return; + let outerGet = el._x_model.get; + let outerSet = el._x_model.set; + effect3(() => innerSet(outerGet())); + effect3(() => outerSet(innerGet())); + }); + }); + + // packages/alpinejs/src/directives/x-teleport.js + directive("teleport", (el, {expression}, {cleanup: cleanup2}) => { + if (el.tagName.toLowerCase() !== "template") + warn("x-teleport can only be used on a <template> tag", el); + let target = document.querySelector(expression); + if (!target) + warn(`Cannot find x-teleport element for selector: "${expression}"`); + let clone2 = el.content.cloneNode(true).firstElementChild; + el._x_teleport = clone2; + clone2._x_teleportBack = el; + if (el._x_forwardEvents) { + el._x_forwardEvents.forEach((eventName) => { + clone2.addEventListener(eventName, (e) => { + e.stopPropagation(); + el.dispatchEvent(new e.constructor(e.type, e)); + }); + }); + } + addScopeToNode(clone2, {}, el); + mutateDom(() => { + target.appendChild(clone2); + initTree(clone2); + clone2._x_ignore = true; + }); + cleanup2(() => clone2.remove()); + }); + // packages/alpinejs/src/directives/x-ignore.js var handler = () => { }; @@ -1993,127 +2283,6 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); // packages/alpinejs/src/directives/x-effect.js directive("effect", (el, {expression}, {effect: effect3}) => effect3(evaluateLater(el, expression))); - // packages/alpinejs/src/utils/bind.js - function bind(el, name, value, modifiers = []) { - if (!el._x_bindings) - el._x_bindings = reactive({}); - el._x_bindings[name] = value; - name = modifiers.includes("camel") ? camelCase(name) : name; - switch (name) { - case "value": - bindInputValue(el, value); - break; - case "style": - bindStyles(el, value); - break; - case "class": - bindClasses(el, value); - break; - default: - bindAttribute(el, name, value); - break; - } - } - function bindInputValue(el, value) { - if (el.type === "radio") { - if (el.attributes.value === void 0) { - el.value = value; - } - if (window.fromModel) { - el.checked = checkedAttrLooseCompare(el.value, value); - } - } else if (el.type === "checkbox") { - if (Number.isInteger(value)) { - el.value = value; - } else if (!Number.isInteger(value) && !Array.isArray(value) && typeof value !== "boolean" && ![null, void 0].includes(value)) { - el.value = String(value); - } else { - if (Array.isArray(value)) { - el.checked = value.some((val) => checkedAttrLooseCompare(val, el.value)); - } else { - el.checked = !!value; - } - } - } else if (el.tagName === "SELECT") { - updateSelect(el, value); - } else { - if (el.value === value) - return; - el.value = value; - } - } - function bindClasses(el, value) { - if (el._x_undoAddedClasses) - el._x_undoAddedClasses(); - el._x_undoAddedClasses = setClasses(el, value); - } - function bindStyles(el, value) { - if (el._x_undoAddedStyles) - el._x_undoAddedStyles(); - el._x_undoAddedStyles = setStyles(el, value); - } - function bindAttribute(el, name, value) { - if ([null, void 0, false].includes(value) && attributeShouldntBePreservedIfFalsy(name)) { - el.removeAttribute(name); - } else { - if (isBooleanAttr2(name)) - value = name; - setIfChanged(el, name, value); - } - } - function setIfChanged(el, attrName, value) { - if (el.getAttribute(attrName) != value) { - el.setAttribute(attrName, value); - } - } - function updateSelect(el, value) { - const arrayWrappedValue = [].concat(value).map((value2) => { - return value2 + ""; - }); - Array.from(el.options).forEach((option) => { - option.selected = arrayWrappedValue.includes(option.value); - }); - } - function camelCase(subject) { - return subject.toLowerCase().replace(/-(\w)/g, (match, char) => char.toUpperCase()); - } - function checkedAttrLooseCompare(valueA, valueB) { - return valueA == valueB; - } - function isBooleanAttr2(attrName) { - const booleanAttributes = [ - "disabled", - "checked", - "required", - "readonly", - "hidden", - "open", - "selected", - "autofocus", - "itemscope", - "multiple", - "novalidate", - "allowfullscreen", - "allowpaymentrequest", - "formnovalidate", - "autoplay", - "controls", - "loop", - "muted", - "playsinline", - "default", - "ismap", - "reversed", - "async", - "defer", - "nomodule" - ]; - return booleanAttributes.includes(attrName); - } - function attributeShouldntBePreservedIfFalsy(name) { - return !["aria-pressed", "aria-checked", "aria-expanded"].includes(name); - } - // packages/alpinejs/src/utils/on.js function on(el, event, modifiers, callback) { let listenerTarget = el; @@ -2345,11 +2514,11 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); // packages/alpinejs/src/directives/x-init.js addInitSelector(() => `[${prefix("init")}]`); - directive("init", skipDuringClone((el, {expression}) => { + directive("init", skipDuringClone((el, {expression}, {evaluate: evaluate2}) => { if (typeof expression === "string") { - return !!expression.trim() && evaluate(el, expression, {}, false); + return !!expression.trim() && evaluate2(expression, {}, false); } - return evaluate(el, expression, {}, false); + return evaluate2(expression, {}, false); })); // packages/alpinejs/src/directives/x-text.js @@ -2377,8 +2546,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); // packages/alpinejs/src/directives/x-bind.js mapAttributes(startingWith(":", into(prefix("bind:")))); directive("bind", (el, {value, modifiers, expression, original}, {effect: effect3}) => { - if (!value) + if (!value) { return applyBindingsObject(el, expression, original, effect3); + } if (value === "key") return storeKeyForXFor(el, expression); let evaluate2 = evaluateLater(el, expression); @@ -2389,32 +2559,29 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); })); }); function applyBindingsObject(el, expression, original, effect3) { + let bindingProviders = {}; + injectBindingProviders(bindingProviders); let getBindings = evaluateLater(el, expression); let cleanupRunners = []; - effect3(() => { - while (cleanupRunners.length) - cleanupRunners.pop()(); - getBindings((bindings) => { - let attributes = Object.entries(bindings).map(([name, value]) => ({name, value})); - attributes = attributes.filter((attr) => { - return !(typeof attr.value === "object" && !Array.isArray(attr.value) && attr.value !== null); - }); - let staticAttributes = attributesOnly(attributes); - attributes = attributes.map((attribute) => { - if (staticAttributes.find((attr) => attr.name === attribute.name)) { - return { - name: `x-bind:${attribute.name}`, - value: `"${attribute.value}"` - }; - } - return attribute; - }); - directives(el, attributes, original).map((handle) => { - cleanupRunners.push(handle.runCleanups); - handle(); - }); + while (cleanupRunners.length) + cleanupRunners.pop()(); + getBindings((bindings) => { + let attributes = Object.entries(bindings).map(([name, value]) => ({name, value})); + let staticAttributes = attributesOnly(attributes); + attributes = attributes.map((attribute) => { + if (staticAttributes.find((attr) => attr.name === attribute.name)) { + return { + name: `x-bind:${attribute.name}`, + value: `"${attribute.value}"` + }; + } + return attribute; }); - }); + directives(el, attributes, original).map((handle) => { + cleanupRunners.push(handle.runCleanups); + handle(); + }); + }, {scope: bindingProviders}); } function storeKeyForXFor(el, expression) { el._x_keyExpression = expression; @@ -2509,15 +2676,15 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); let keys = []; if (isObject2(items)) { items = Object.entries(items).map(([key, value]) => { - let scope = getIterationScopeVariables(iteratorNames, value, key, items); - evaluateKey((value2) => keys.push(value2), {scope: {index: key, ...scope}}); - scopes.push(scope); + let scope2 = getIterationScopeVariables(iteratorNames, value, key, items); + evaluateKey((value2) => keys.push(value2), {scope: {index: key, ...scope2}}); + scopes.push(scope2); }); } else { for (let i = 0; i < items.length; i++) { - let scope = getIterationScopeVariables(iteratorNames, items[i], i, items); - evaluateKey((value) => keys.push(value), {scope: {index: i, ...scope}}); - scopes.push(scope); + let scope2 = getIterationScopeVariables(iteratorNames, items[i], i, items); + evaluateKey((value) => keys.push(value), {scope: {index: i, ...scope2}}); + scopes.push(scope2); } } let adds = []; @@ -2550,6 +2717,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); } for (let i = 0; i < removes.length; i++) { let key = removes[i]; + if (!!lookup[key]._x_effects) { + lookup[key]._x_effects.forEach(dequeueJob); + } lookup[key].remove(); lookup[key] = null; delete lookup[key]; @@ -2562,7 +2732,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); mutateDom(() => { elForSpot.after(marker); elInSpot.after(elForSpot); + elForSpot._x_currentIfEl && elForSpot.after(elForSpot._x_currentIfEl); marker.before(elInSpot); + elInSpot._x_currentIfEl && elInSpot.after(elInSpot._x_currentIfEl); marker.remove(); }); refreshScope(elForSpot, scopes[keys.indexOf(keyForSpot)]); @@ -2570,10 +2742,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); for (let i = 0; i < adds.length; i++) { let [lastKey2, index] = adds[i]; let lastEl = lastKey2 === "template" ? templateEl : lookup[lastKey2]; - let scope = scopes[index]; + if (lastEl._x_currentIfEl) + lastEl = lastEl._x_currentIfEl; + let scope2 = scopes[index]; let key = keys[index]; let clone2 = document.importNode(templateEl.content, true).firstElementChild; - addScopeToNode(clone2, reactive(scope), templateEl); + addScopeToNode(clone2, reactive(scope2), templateEl); mutateDom(() => { lastEl.after(clone2); initTree(clone2); @@ -2662,6 +2836,11 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); }); el._x_currentIfEl = clone2; el._x_undoIf = () => { + walk(clone2, (node) => { + if (!!node._x_effects) { + node._x_effects.forEach(dequeueJob); + } + }); clone2.remove(); delete el._x_currentIfEl; }; @@ -2679,11 +2858,23 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); cleanup2(() => el._x_undoIf && el._x_undoIf()); }); + // packages/alpinejs/src/directives/x-id.js + directive("id", (el, {expression}, {evaluate: evaluate2}) => { + let names = evaluate2(expression); + names.forEach((name) => setIdRoot(el, name)); + }); + // packages/alpinejs/src/directives/x-on.js mapAttributes(startingWith("@", into(prefix("on:")))); directive("on", skipDuringClone((el, {value, modifiers, expression}, {cleanup: cleanup2}) => { let evaluate2 = expression ? evaluateLater(el, expression) : () => { }; + if (el.tagName.toLowerCase() === "template") { + if (!el._x_forwardEvents) + el._x_forwardEvents = []; + if (!el._x_forwardEvents.includes(value)) + el._x_forwardEvents.push(value); + } let removeListener = on(el, value, modifiers, (e) => { evaluate2(() => { }, {scope: {$event: e}, params: [e]}); @@ -2702,8 +2893,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el); return generateEvaluatorFromFunction(dataStack, expression); } let evaluator = (receiver = () => { - }, {scope = {}, params = []} = {}) => { - let completeScope = mergeProxies([scope, ...dataStack]); + }, {scope: scope2 = {}, params = []} = {}) => { + let completeScope = mergeProxies([scope2, ...dataStack]); if (completeScope[expression] !== void 0) { runIfTypeOfFunction(receiver, completeScope[expression], completeScope, params); } |