spec.html 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <html>
  2. <!-- Using a <blockquote> because it's an obscure tag -->
  3. <!-- which allows us to use document.querySelector() -->
  4. <!-- with generic tags freely inside Cypress tests. -->
  5. <blockquote id="root">
  6. <!-- This is where our test subjects will be injected. -->
  7. </blockquote>
  8. <script src="/../../packages/history/dist/cdn.js"></script>
  9. <script src="/../../packages/morph/dist/cdn.js"></script>
  10. <script src="/../../packages/persist/dist/cdn.js"></script>
  11. <script src="/../../packages/trap/dist/cdn.js"></script>
  12. <script src="/../../packages/intersect/dist/cdn.js"></script>
  13. <script src="/../../packages/collapse/dist/cdn.js"></script>
  14. <script>
  15. let root = document.querySelector('#root')
  16. // We aren't loading Alpine directly because we are expecting
  17. // Cypress to inject HTML into "#root", THEN we'll call
  18. // this function from Cypress to boot everything up.
  19. root.evalScripts = (extraJavaScript) => {
  20. // Load bespoke JavaScript.
  21. if (extraJavaScript) {
  22. let script = document.createElement('script')
  23. script.src = `data:text/javascript;base64,${btoa(`
  24. document.addEventListener('alpine:init', () => {
  25. ${extraJavaScript}
  26. })
  27. `)}`
  28. root.after(script)
  29. }
  30. // Load all injected script tags.
  31. root.querySelectorAll('script').forEach(el => {
  32. eval(el.innerHTML)
  33. })
  34. // Load Alpine.
  35. let script = document.createElement('script')
  36. script.src = '/../../packages/alpinejs/dist/cdn.js'
  37. root.after(script)
  38. document.addEventListener('alpine:initialized', () => {
  39. let readyEl = document.createElement('blockquote')
  40. readyEl.setAttribute('alpine-is-ready', true)
  41. readyEl.style.width = '1px'
  42. readyEl.style.height = '1px'
  43. document.querySelector('blockquote').after(readyEl)
  44. })
  45. }
  46. </script>
  47. </html>