diff options
Diffstat (limited to 'alpinejs/packages/csp/src/index.js')
-rw-r--r-- | alpinejs/packages/csp/src/index.js | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/alpinejs/packages/csp/src/index.js b/alpinejs/packages/csp/src/index.js new file mode 100644 index 0000000..2f69a10 --- /dev/null +++ b/alpinejs/packages/csp/src/index.js @@ -0,0 +1,37 @@ +import Alpine from 'alpinejs/src/alpine' + +Alpine.setEvaluator(cspCompliantEvaluator) + +import { reactive, effect, stop, toRaw } from '@vue/reactivity' +Alpine.setReactivityEngine({ reactive, effect, release: stop, raw: toRaw }) + +import 'alpinejs/src/magics/index' +import 'alpinejs/src/directives/index' + +import { closestDataStack, mergeProxies } from 'alpinejs/src/scope' +import { injectMagics } from 'alpinejs/src/magics' +import { generateEvaluatorFromFunction, runIfTypeOfFunction, tryCatch } from 'alpinejs/src/evaluator' + +function cspCompliantEvaluator(el, expression) { + let overriddenMagics = {} + + injectMagics(overriddenMagics, el) + + let dataStack = [overriddenMagics, ...closestDataStack(el)] + + if (typeof expression === 'function') { + return generateEvaluatorFromFunction(dataStack, expression) + } + + let evaluator = (receiver = () => {}, { scope = {}, params = [] } = {}) => { + let completeScope = mergeProxies([scope, ...dataStack]) + + if (completeScope[expression] !== undefined) { + runIfTypeOfFunction(receiver, completeScope[expression], completeScope, params) + } + } + + return tryCatch.bind(null, el, expression, evaluator) +} + +export default Alpine |