evaluator.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { generateEvaluatorFromFunction, runIfTypeOfFunction } from 'alpinejs/src/evaluator'
  2. import { closestDataStack, mergeProxies } from 'alpinejs/src/scope'
  3. import { tryCatch } from 'alpinejs/src/utils/error'
  4. import { injectMagics } from 'alpinejs/src/magics'
  5. export function cspEvaluator(el, expression) {
  6. let dataStack = generateDataStack(el)
  7. // Return if the provided expression is already a function...
  8. if (typeof expression === 'function') {
  9. return generateEvaluatorFromFunction(dataStack, expression)
  10. }
  11. let evaluator = generateEvaluator(el, expression, dataStack)
  12. return tryCatch.bind(null, el, expression, evaluator)
  13. }
  14. function generateDataStack(el) {
  15. let overriddenMagics = {}
  16. injectMagics(overriddenMagics, el)
  17. return [overriddenMagics, ...closestDataStack(el)]
  18. }
  19. function generateEvaluator(el, expression, dataStack) {
  20. return (receiver = () => {}, { scope = {}, params = [] } = {}) => {
  21. let completeScope = mergeProxies([scope, ...dataStack])
  22. if (completeScope[expression] === undefined) {
  23. throwExpressionError(el, expression)
  24. }
  25. runIfTypeOfFunction(receiver, completeScope[expression], completeScope, params)
  26. }
  27. }
  28. function throwExpressionError(el, expression) {
  29. console.warn(
  30. `Alpine Error: Alpine is unable to interpret the following expression using the CSP-friendly build:
  31. "${expression}"
  32. Read more about the Alpine's CSP-friendly build restrictions here: https://alpinejs.dev/advanced/csp
  33. `,
  34. el
  35. )
  36. }