scribo 1.0.38 → 1.0.40

Sign up to get free protection for your applications and to get access to all the features.
Files changed (628) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/gem-push.yml +11 -0
  3. data/.gitignore +12 -0
  4. data/.reek.yml +8 -0
  5. data/.rubocop.yml +44 -0
  6. data/.rubocop_todo.yml +129 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +31 -0
  9. data/Gemfile.lock +397 -0
  10. data/README.md +5 -9
  11. data/TODO.md +32 -0
  12. data/app/assets/config/scribo_manifest.js +4 -2
  13. data/app/assets/images/scribo/.keep +0 -0
  14. data/app/assets/images/scribo/Unknown-1.svg +2 -0
  15. data/app/assets/images/scribo/file.svg +4 -0
  16. data/app/assets/images/scribo/file_icons.svg +1 -0
  17. data/app/assets/images/scribo/folder-open.svg +1 -0
  18. data/app/assets/images/scribo/folder.svg +1 -0
  19. data/app/assets/images/scribo/icons/3d.svg +1 -0
  20. data/app/assets/images/scribo/icons/actionscript.svg +3 -0
  21. data/app/assets/images/scribo/icons/android.svg +1 -0
  22. data/app/assets/images/scribo/icons/angular-component.svg +3 -0
  23. data/app/assets/images/scribo/icons/angular-directive.svg +3 -0
  24. data/app/assets/images/scribo/icons/angular-guard.svg +3 -0
  25. data/app/assets/images/scribo/icons/angular-pipe.svg +3 -0
  26. data/app/assets/images/scribo/icons/angular-resolver.svg +3 -0
  27. data/app/assets/images/scribo/icons/angular-service.svg +3 -0
  28. data/app/assets/images/scribo/icons/angular.svg +3 -0
  29. data/app/assets/images/scribo/icons/apiblueprint.svg +5 -0
  30. data/app/assets/images/scribo/icons/applescript.svg +3 -0
  31. data/app/assets/images/scribo/icons/appveyor.svg +5 -0
  32. data/app/assets/images/scribo/icons/arduino.svg +1 -0
  33. data/app/assets/images/scribo/icons/asciidoc.svg +1 -0
  34. data/app/assets/images/scribo/icons/assembly.svg +4 -0
  35. data/app/assets/images/scribo/icons/audio.svg +4 -0
  36. data/app/assets/images/scribo/icons/aurelia.svg +107 -0
  37. data/app/assets/images/scribo/icons/authors.svg +1 -0
  38. data/app/assets/images/scribo/icons/autohotkey.svg +3 -0
  39. data/app/assets/images/scribo/icons/autoit.svg +21 -0
  40. data/app/assets/images/scribo/icons/azure-pipelines.svg +1 -0
  41. data/app/assets/images/scribo/icons/azure.svg +1 -0
  42. data/app/assets/images/scribo/icons/babel.svg +1 -0
  43. data/app/assets/images/scribo/icons/ballerina.svg +1 -0
  44. data/app/assets/images/scribo/icons/bazel.svg +1 -0
  45. data/app/assets/images/scribo/icons/bitbucket.svg +1 -0
  46. data/app/assets/images/scribo/icons/bithound.svg +1 -0
  47. data/app/assets/images/scribo/icons/blink.svg +4 -0
  48. data/app/assets/images/scribo/icons/blink_light.svg +4 -0
  49. data/app/assets/images/scribo/icons/bower.svg +1 -0
  50. data/app/assets/images/scribo/icons/browserlist.svg +6 -0
  51. data/app/assets/images/scribo/icons/browserlist_light.svg +7 -0
  52. data/app/assets/images/scribo/icons/bucklescript.svg +3 -0
  53. data/app/assets/images/scribo/icons/buildkite.svg +1 -0
  54. data/app/assets/images/scribo/icons/c.svg +1 -0
  55. data/app/assets/images/scribo/icons/cabal.svg +8 -0
  56. data/app/assets/images/scribo/icons/cake.svg +1 -0
  57. data/app/assets/images/scribo/icons/certificate.svg +3 -0
  58. data/app/assets/images/scribo/icons/changelog.svg +1 -0
  59. data/app/assets/images/scribo/icons/circleci.svg +14 -0
  60. data/app/assets/images/scribo/icons/circleci_light.svg +14 -0
  61. data/app/assets/images/scribo/icons/clojure.svg +1 -0
  62. data/app/assets/images/scribo/icons/cloudfoundry.svg +24 -0
  63. data/app/assets/images/scribo/icons/cmake.svg +7 -0
  64. data/app/assets/images/scribo/icons/code-climate.svg +4 -0
  65. data/app/assets/images/scribo/icons/code-climate_light.svg +4 -0
  66. data/app/assets/images/scribo/icons/coffee.svg +3 -0
  67. data/app/assets/images/scribo/icons/coldfusion.svg +7 -0
  68. data/app/assets/images/scribo/icons/conduct.svg +4 -0
  69. data/app/assets/images/scribo/icons/console.svg +3 -0
  70. data/app/assets/images/scribo/icons/contributing.svg +4 -0
  71. data/app/assets/images/scribo/icons/cpp.svg +1 -0
  72. data/app/assets/images/scribo/icons/credits.svg +3 -0
  73. data/app/assets/images/scribo/icons/crystal.svg +4 -0
  74. data/app/assets/images/scribo/icons/crystal_light.svg +4 -0
  75. data/app/assets/images/scribo/icons/csharp.svg +3 -0
  76. data/app/assets/images/scribo/icons/css-map.svg +1 -0
  77. data/app/assets/images/scribo/icons/css.svg +3 -0
  78. data/app/assets/images/scribo/icons/cucumber.svg +4 -0
  79. data/app/assets/images/scribo/icons/cuda.svg +4 -0
  80. data/app/assets/images/scribo/icons/d.svg +1 -0
  81. data/app/assets/images/scribo/icons/dart.svg +9 -0
  82. data/app/assets/images/scribo/icons/database.svg +1 -0
  83. data/app/assets/images/scribo/icons/diff.svg +1 -0
  84. data/app/assets/images/scribo/icons/django.svg +1 -0
  85. data/app/assets/images/scribo/icons/docker.svg +4 -0
  86. data/app/assets/images/scribo/icons/document.svg +3 -0
  87. data/app/assets/images/scribo/icons/dotjs.svg +8 -0
  88. data/app/assets/images/scribo/icons/drone.svg +6 -0
  89. data/app/assets/images/scribo/icons/drone_light.svg +6 -0
  90. data/app/assets/images/scribo/icons/edge.svg +1 -0
  91. data/app/assets/images/scribo/icons/editorconfig.svg +9 -0
  92. data/app/assets/images/scribo/icons/ejs.svg +7 -0
  93. data/app/assets/images/scribo/icons/elixir.svg +1 -0
  94. data/app/assets/images/scribo/icons/elm.svg +1 -0
  95. data/app/assets/images/scribo/icons/email.svg +3 -0
  96. data/app/assets/images/scribo/icons/erlang.svg +5 -0
  97. data/app/assets/images/scribo/icons/eslint.svg +3 -0
  98. data/app/assets/images/scribo/icons/exe.svg +3 -0
  99. data/app/assets/images/scribo/icons/fastlane.svg +1 -0
  100. data/app/assets/images/scribo/icons/favicon.svg +3 -0
  101. data/app/assets/images/scribo/icons/file.svg +3 -0
  102. data/app/assets/images/scribo/icons/firebase.svg +9 -0
  103. data/app/assets/images/scribo/icons/flash.svg +12 -0
  104. data/app/assets/images/scribo/icons/flow.svg +7 -0
  105. data/app/assets/images/scribo/icons/folder-android-open.svg +1 -0
  106. data/app/assets/images/scribo/icons/folder-android.svg +1 -0
  107. data/app/assets/images/scribo/icons/folder-animation-open.svg +1 -0
  108. data/app/assets/images/scribo/icons/folder-animation.svg +1 -0
  109. data/app/assets/images/scribo/icons/folder-ansible-open.svg +1 -0
  110. data/app/assets/images/scribo/icons/folder-ansible.svg +1 -0
  111. data/app/assets/images/scribo/icons/folder-api-open.svg +4 -0
  112. data/app/assets/images/scribo/icons/folder-api.svg +4 -0
  113. data/app/assets/images/scribo/icons/folder-app-open.svg +1 -0
  114. data/app/assets/images/scribo/icons/folder-app.svg +1 -0
  115. data/app/assets/images/scribo/icons/folder-archive-open.svg +1 -0
  116. data/app/assets/images/scribo/icons/folder-archive.svg +1 -0
  117. data/app/assets/images/scribo/icons/folder-audio-open.svg +2 -0
  118. data/app/assets/images/scribo/icons/folder-audio.svg +2 -0
  119. data/app/assets/images/scribo/icons/folder-aurelia-open.svg +2 -0
  120. data/app/assets/images/scribo/icons/folder-aurelia.svg +2 -0
  121. data/app/assets/images/scribo/icons/folder-aws-open.svg +2 -0
  122. data/app/assets/images/scribo/icons/folder-aws.svg +2 -0
  123. data/app/assets/images/scribo/icons/folder-batch-open.svg +1 -0
  124. data/app/assets/images/scribo/icons/folder-batch.svg +1 -0
  125. data/app/assets/images/scribo/icons/folder-benchmark-open.svg +1 -0
  126. data/app/assets/images/scribo/icons/folder-benchmark.svg +1 -0
  127. data/app/assets/images/scribo/icons/folder-bower-open.svg +2 -0
  128. data/app/assets/images/scribo/icons/folder-bower.svg +2 -0
  129. data/app/assets/images/scribo/icons/folder-ci-open.svg +1 -0
  130. data/app/assets/images/scribo/icons/folder-ci.svg +1 -0
  131. data/app/assets/images/scribo/icons/folder-circleci-open.svg +2 -0
  132. data/app/assets/images/scribo/icons/folder-circleci.svg +1 -0
  133. data/app/assets/images/scribo/icons/folder-class-open.svg +1 -0
  134. data/app/assets/images/scribo/icons/folder-class.svg +1 -0
  135. data/app/assets/images/scribo/icons/folder-client-open.svg +1 -0
  136. data/app/assets/images/scribo/icons/folder-client.svg +1 -0
  137. data/app/assets/images/scribo/icons/folder-cluster-open.svg +8 -0
  138. data/app/assets/images/scribo/icons/folder-cluster.svg +8 -0
  139. data/app/assets/images/scribo/icons/folder-command-open.svg +4 -0
  140. data/app/assets/images/scribo/icons/folder-command.svg +4 -0
  141. data/app/assets/images/scribo/icons/folder-components-open.svg +2 -0
  142. data/app/assets/images/scribo/icons/folder-components.svg +2 -0
  143. data/app/assets/images/scribo/icons/folder-config-open.svg +2 -0
  144. data/app/assets/images/scribo/icons/folder-config.svg +2 -0
  145. data/app/assets/images/scribo/icons/folder-constant-open.svg +1 -0
  146. data/app/assets/images/scribo/icons/folder-constant.svg +1 -0
  147. data/app/assets/images/scribo/icons/folder-container-open.svg +1 -0
  148. data/app/assets/images/scribo/icons/folder-container.svg +1 -0
  149. data/app/assets/images/scribo/icons/folder-content-open.svg +1 -0
  150. data/app/assets/images/scribo/icons/folder-content.svg +1 -0
  151. data/app/assets/images/scribo/icons/folder-controller-open.svg +1 -0
  152. data/app/assets/images/scribo/icons/folder-controller.svg +1 -0
  153. data/app/assets/images/scribo/icons/folder-core-open.svg +1 -0
  154. data/app/assets/images/scribo/icons/folder-core.svg +1 -0
  155. data/app/assets/images/scribo/icons/folder-coverage-open.svg +1 -0
  156. data/app/assets/images/scribo/icons/folder-coverage.svg +1 -0
  157. data/app/assets/images/scribo/icons/folder-css-open.svg +2 -0
  158. data/app/assets/images/scribo/icons/folder-css.svg +2 -0
  159. data/app/assets/images/scribo/icons/folder-custom-open.svg +1 -0
  160. data/app/assets/images/scribo/icons/folder-custom.svg +1 -0
  161. data/app/assets/images/scribo/icons/folder-database-open.svg +2 -0
  162. data/app/assets/images/scribo/icons/folder-database.svg +2 -0
  163. data/app/assets/images/scribo/icons/folder-debug-open.svg +1 -0
  164. data/app/assets/images/scribo/icons/folder-debug.svg +1 -0
  165. data/app/assets/images/scribo/icons/folder-delta-open.svg +4 -0
  166. data/app/assets/images/scribo/icons/folder-delta.svg +4 -0
  167. data/app/assets/images/scribo/icons/folder-dist-open.svg +2 -0
  168. data/app/assets/images/scribo/icons/folder-dist.svg +2 -0
  169. data/app/assets/images/scribo/icons/folder-docker-open.svg +2 -0
  170. data/app/assets/images/scribo/icons/folder-docker.svg +5 -0
  171. data/app/assets/images/scribo/icons/folder-docs-open.svg +2 -0
  172. data/app/assets/images/scribo/icons/folder-docs.svg +2 -0
  173. data/app/assets/images/scribo/icons/folder-download-open.svg +1 -0
  174. data/app/assets/images/scribo/icons/folder-download.svg +1 -0
  175. data/app/assets/images/scribo/icons/folder-dump-open.svg +1 -0
  176. data/app/assets/images/scribo/icons/folder-dump.svg +1 -0
  177. data/app/assets/images/scribo/icons/folder-environment-open.svg +1 -0
  178. data/app/assets/images/scribo/icons/folder-environment.svg +1 -0
  179. data/app/assets/images/scribo/icons/folder-error-open.svg +7 -0
  180. data/app/assets/images/scribo/icons/folder-error.svg +8 -0
  181. data/app/assets/images/scribo/icons/folder-event-open.svg +1 -0
  182. data/app/assets/images/scribo/icons/folder-event.svg +1 -0
  183. data/app/assets/images/scribo/icons/folder-examples-open.svg +1 -0
  184. data/app/assets/images/scribo/icons/folder-examples.svg +1 -0
  185. data/app/assets/images/scribo/icons/folder-expo-open.svg +1 -0
  186. data/app/assets/images/scribo/icons/folder-expo.svg +4 -0
  187. data/app/assets/images/scribo/icons/folder-export-open.svg +1 -0
  188. data/app/assets/images/scribo/icons/folder-export.svg +5 -0
  189. data/app/assets/images/scribo/icons/folder-fastlane-open.svg +1 -0
  190. data/app/assets/images/scribo/icons/folder-fastlane.svg +1 -0
  191. data/app/assets/images/scribo/icons/folder-flow-open.svg +1 -0
  192. data/app/assets/images/scribo/icons/folder-flow.svg +1 -0
  193. data/app/assets/images/scribo/icons/folder-font-open.svg +1 -0
  194. data/app/assets/images/scribo/icons/folder-font.svg +1 -0
  195. data/app/assets/images/scribo/icons/folder-functions-open.svg +1 -0
  196. data/app/assets/images/scribo/icons/folder-functions.svg +1 -0
  197. data/app/assets/images/scribo/icons/folder-generator-open.svg +1 -0
  198. data/app/assets/images/scribo/icons/folder-generator.svg +1 -0
  199. data/app/assets/images/scribo/icons/folder-git-open.svg +1 -0
  200. data/app/assets/images/scribo/icons/folder-git.svg +1 -0
  201. data/app/assets/images/scribo/icons/folder-github-open.svg +2 -0
  202. data/app/assets/images/scribo/icons/folder-github.svg +2 -0
  203. data/app/assets/images/scribo/icons/folder-gitlab-open.svg +2 -0
  204. data/app/assets/images/scribo/icons/folder-gitlab.svg +2 -0
  205. data/app/assets/images/scribo/icons/folder-global-open.svg +2 -0
  206. data/app/assets/images/scribo/icons/folder-global.svg +2 -0
  207. data/app/assets/images/scribo/icons/folder-gradle-open.svg +2 -0
  208. data/app/assets/images/scribo/icons/folder-gradle.svg +2 -0
  209. data/app/assets/images/scribo/icons/folder-graphql-open.svg +1 -0
  210. data/app/assets/images/scribo/icons/folder-graphql.svg +1 -0
  211. data/app/assets/images/scribo/icons/folder-guard-open.svg +1 -0
  212. data/app/assets/images/scribo/icons/folder-guard.svg +1 -0
  213. data/app/assets/images/scribo/icons/folder-helper-open.svg +1 -0
  214. data/app/assets/images/scribo/icons/folder-helper.svg +1 -0
  215. data/app/assets/images/scribo/icons/folder-hook-open.svg +1 -0
  216. data/app/assets/images/scribo/icons/folder-hook.svg +1 -0
  217. data/app/assets/images/scribo/icons/folder-i18n-open.svg +2 -0
  218. data/app/assets/images/scribo/icons/folder-i18n.svg +2 -0
  219. data/app/assets/images/scribo/icons/folder-images-open.svg +2 -0
  220. data/app/assets/images/scribo/icons/folder-images.svg +2 -0
  221. data/app/assets/images/scribo/icons/folder-import-open.svg +1 -0
  222. data/app/assets/images/scribo/icons/folder-import.svg +1 -0
  223. data/app/assets/images/scribo/icons/folder-include-open.svg +2 -0
  224. data/app/assets/images/scribo/icons/folder-include.svg +2 -0
  225. data/app/assets/images/scribo/icons/folder-ios-open.svg +1 -0
  226. data/app/assets/images/scribo/icons/folder-ios.svg +1 -0
  227. data/app/assets/images/scribo/icons/folder-javascript-open.svg +2 -0
  228. data/app/assets/images/scribo/icons/folder-javascript.svg +2 -0
  229. data/app/assets/images/scribo/icons/folder-jinja-open.svg +2 -0
  230. data/app/assets/images/scribo/icons/folder-jinja-open_light.svg +2 -0
  231. data/app/assets/images/scribo/icons/folder-jinja.svg +2 -0
  232. data/app/assets/images/scribo/icons/folder-jinja_light.svg +2 -0
  233. data/app/assets/images/scribo/icons/folder-job-open.svg +1 -0
  234. data/app/assets/images/scribo/icons/folder-job.svg +1 -0
  235. data/app/assets/images/scribo/icons/folder-keys-open.svg +1 -0
  236. data/app/assets/images/scribo/icons/folder-keys.svg +1 -0
  237. data/app/assets/images/scribo/icons/folder-kubernetes-open.svg +1 -0
  238. data/app/assets/images/scribo/icons/folder-kubernetes.svg +5 -0
  239. data/app/assets/images/scribo/icons/folder-layout-open.svg +1 -0
  240. data/app/assets/images/scribo/icons/folder-layout.svg +1 -0
  241. data/app/assets/images/scribo/icons/folder-less-open.svg +1 -0
  242. data/app/assets/images/scribo/icons/folder-less.svg +1 -0
  243. data/app/assets/images/scribo/icons/folder-lib-open.svg +2 -0
  244. data/app/assets/images/scribo/icons/folder-lib.svg +2 -0
  245. data/app/assets/images/scribo/icons/folder-log-open.svg +2 -0
  246. data/app/assets/images/scribo/icons/folder-log.svg +2 -0
  247. data/app/assets/images/scribo/icons/folder-mail-open.svg +1 -0
  248. data/app/assets/images/scribo/icons/folder-mail.svg +1 -0
  249. data/app/assets/images/scribo/icons/folder-mappings-open.svg +1 -0
  250. data/app/assets/images/scribo/icons/folder-mappings.svg +1 -0
  251. data/app/assets/images/scribo/icons/folder-markdown-open.svg +2 -0
  252. data/app/assets/images/scribo/icons/folder-markdown.svg +2 -0
  253. data/app/assets/images/scribo/icons/folder-messages-open.svg +1 -0
  254. data/app/assets/images/scribo/icons/folder-messages.svg +1 -0
  255. data/app/assets/images/scribo/icons/folder-meta-open.svg +1 -0
  256. data/app/assets/images/scribo/icons/folder-meta.svg +1 -0
  257. data/app/assets/images/scribo/icons/folder-middleware-open.svg +1 -0
  258. data/app/assets/images/scribo/icons/folder-middleware.svg +1 -0
  259. data/app/assets/images/scribo/icons/folder-mock-open.svg +1 -0
  260. data/app/assets/images/scribo/icons/folder-mock.svg +1 -0
  261. data/app/assets/images/scribo/icons/folder-ngrx-actions-open.svg +2 -0
  262. data/app/assets/images/scribo/icons/folder-ngrx-actions.svg +2 -0
  263. data/app/assets/images/scribo/icons/folder-ngrx-effects-open.svg +2 -0
  264. data/app/assets/images/scribo/icons/folder-ngrx-effects.svg +2 -0
  265. data/app/assets/images/scribo/icons/folder-ngrx-entities-open.svg +2 -0
  266. data/app/assets/images/scribo/icons/folder-ngrx-entities.svg +2 -0
  267. data/app/assets/images/scribo/icons/folder-ngrx-reducer-open.svg +2 -0
  268. data/app/assets/images/scribo/icons/folder-ngrx-reducer.svg +2 -0
  269. data/app/assets/images/scribo/icons/folder-ngrx-state-open.svg +1 -0
  270. data/app/assets/images/scribo/icons/folder-ngrx-state.svg +1 -0
  271. data/app/assets/images/scribo/icons/folder-ngrx-store-open.svg +1 -0
  272. data/app/assets/images/scribo/icons/folder-ngrx-store.svg +1 -0
  273. data/app/assets/images/scribo/icons/folder-node-open.svg +1 -0
  274. data/app/assets/images/scribo/icons/folder-node.svg +1 -0
  275. data/app/assets/images/scribo/icons/folder-nuxt-open.svg +1 -0
  276. data/app/assets/images/scribo/icons/folder-nuxt.svg +1 -0
  277. data/app/assets/images/scribo/icons/folder-open.svg +11 -0
  278. data/app/assets/images/scribo/icons/folder-other-open.svg +1 -0
  279. data/app/assets/images/scribo/icons/folder-other.svg +1 -0
  280. data/app/assets/images/scribo/icons/folder-packages-open.svg +1 -0
  281. data/app/assets/images/scribo/icons/folder-packages.svg +1 -0
  282. data/app/assets/images/scribo/icons/folder-php-open.svg +2 -0
  283. data/app/assets/images/scribo/icons/folder-php.svg +2 -0
  284. data/app/assets/images/scribo/icons/folder-phpmailer-open.svg +2 -0
  285. data/app/assets/images/scribo/icons/folder-phpmailer.svg +2 -0
  286. data/app/assets/images/scribo/icons/folder-pipe-open.svg +1 -0
  287. data/app/assets/images/scribo/icons/folder-pipe.svg +1 -0
  288. data/app/assets/images/scribo/icons/folder-plugin-open.svg +1 -0
  289. data/app/assets/images/scribo/icons/folder-plugin.svg +1 -0
  290. data/app/assets/images/scribo/icons/folder-prisma-open.svg +1 -0
  291. data/app/assets/images/scribo/icons/folder-prisma.svg +1 -0
  292. data/app/assets/images/scribo/icons/folder-private-open.svg +1 -0
  293. data/app/assets/images/scribo/icons/folder-private.svg +1 -0
  294. data/app/assets/images/scribo/icons/folder-public-open.svg +2 -0
  295. data/app/assets/images/scribo/icons/folder-public.svg +2 -0
  296. data/app/assets/images/scribo/icons/folder-python-open.svg +1 -0
  297. data/app/assets/images/scribo/icons/folder-python.svg +1 -0
  298. data/app/assets/images/scribo/icons/folder-react-components-open.svg +2 -0
  299. data/app/assets/images/scribo/icons/folder-react-components.svg +2 -0
  300. data/app/assets/images/scribo/icons/folder-redux-actions-open.svg +1 -0
  301. data/app/assets/images/scribo/icons/folder-redux-actions.svg +1 -0
  302. data/app/assets/images/scribo/icons/folder-redux-reducer-open.svg +2 -0
  303. data/app/assets/images/scribo/icons/folder-redux-reducer.svg +2 -0
  304. data/app/assets/images/scribo/icons/folder-redux-store-open.svg +2 -0
  305. data/app/assets/images/scribo/icons/folder-redux-store.svg +2 -0
  306. data/app/assets/images/scribo/icons/folder-resource-open.svg +2 -0
  307. data/app/assets/images/scribo/icons/folder-resource.svg +2 -0
  308. data/app/assets/images/scribo/icons/folder-review-open.svg +1 -0
  309. data/app/assets/images/scribo/icons/folder-review.svg +1 -0
  310. data/app/assets/images/scribo/icons/folder-routes-open.svg +1 -0
  311. data/app/assets/images/scribo/icons/folder-routes.svg +1 -0
  312. data/app/assets/images/scribo/icons/folder-rules-open.svg +1 -0
  313. data/app/assets/images/scribo/icons/folder-rules.svg +1 -0
  314. data/app/assets/images/scribo/icons/folder-sass-open.svg +1 -0
  315. data/app/assets/images/scribo/icons/folder-sass.svg +1 -0
  316. data/app/assets/images/scribo/icons/folder-scripts-open.svg +2 -0
  317. data/app/assets/images/scribo/icons/folder-scripts.svg +2 -0
  318. data/app/assets/images/scribo/icons/folder-secure-open.svg +1 -0
  319. data/app/assets/images/scribo/icons/folder-secure.svg +1 -0
  320. data/app/assets/images/scribo/icons/folder-server-open.svg +1 -0
  321. data/app/assets/images/scribo/icons/folder-server.svg +1 -0
  322. data/app/assets/images/scribo/icons/folder-serverless-open.svg +1 -0
  323. data/app/assets/images/scribo/icons/folder-serverless.svg +1 -0
  324. data/app/assets/images/scribo/icons/folder-shared-open.svg +1 -0
  325. data/app/assets/images/scribo/icons/folder-shared.svg +1 -0
  326. data/app/assets/images/scribo/icons/folder-src-open.svg +2 -0
  327. data/app/assets/images/scribo/icons/folder-src.svg +2 -0
  328. data/app/assets/images/scribo/icons/folder-stack-open.svg +1 -0
  329. data/app/assets/images/scribo/icons/folder-stack.svg +1 -0
  330. data/app/assets/images/scribo/icons/folder-stylus-open.svg +1 -0
  331. data/app/assets/images/scribo/icons/folder-stylus.svg +1 -0
  332. data/app/assets/images/scribo/icons/folder-sublime-open.svg +2 -0
  333. data/app/assets/images/scribo/icons/folder-sublime.svg +2 -0
  334. data/app/assets/images/scribo/icons/folder-svg-open.svg +1 -0
  335. data/app/assets/images/scribo/icons/folder-svg.svg +1 -0
  336. data/app/assets/images/scribo/icons/folder-syntax-open.svg +1 -0
  337. data/app/assets/images/scribo/icons/folder-syntax.svg +1 -0
  338. data/app/assets/images/scribo/icons/folder-tasks-open.svg +1 -0
  339. data/app/assets/images/scribo/icons/folder-tasks.svg +1 -0
  340. data/app/assets/images/scribo/icons/folder-temp-open.svg +2 -0
  341. data/app/assets/images/scribo/icons/folder-temp.svg +2 -0
  342. data/app/assets/images/scribo/icons/folder-template-open.svg +1 -0
  343. data/app/assets/images/scribo/icons/folder-template.svg +1 -0
  344. data/app/assets/images/scribo/icons/folder-test-open.svg +1 -0
  345. data/app/assets/images/scribo/icons/folder-test.svg +1 -0
  346. data/app/assets/images/scribo/icons/folder-theme-open.svg +2 -0
  347. data/app/assets/images/scribo/icons/folder-theme.svg +2 -0
  348. data/app/assets/images/scribo/icons/folder-tools-open.svg +1 -0
  349. data/app/assets/images/scribo/icons/folder-tools.svg +1 -0
  350. data/app/assets/images/scribo/icons/folder-typescript-open.svg +1 -0
  351. data/app/assets/images/scribo/icons/folder-typescript.svg +1 -0
  352. data/app/assets/images/scribo/icons/folder-upload-open.svg +1 -0
  353. data/app/assets/images/scribo/icons/folder-upload.svg +1 -0
  354. data/app/assets/images/scribo/icons/folder-utils-open.svg +1 -0
  355. data/app/assets/images/scribo/icons/folder-utils.svg +1 -0
  356. data/app/assets/images/scribo/icons/folder-video-open.svg +2 -0
  357. data/app/assets/images/scribo/icons/folder-video.svg +2 -0
  358. data/app/assets/images/scribo/icons/folder-views-open.svg +1 -0
  359. data/app/assets/images/scribo/icons/folder-views.svg +1 -0
  360. data/app/assets/images/scribo/icons/folder-vm-open.svg +1 -0
  361. data/app/assets/images/scribo/icons/folder-vm.svg +1 -0
  362. data/app/assets/images/scribo/icons/folder-vscode-open.svg +2 -0
  363. data/app/assets/images/scribo/icons/folder-vscode.svg +2 -0
  364. data/app/assets/images/scribo/icons/folder-vue-directives-open.svg +1 -0
  365. data/app/assets/images/scribo/icons/folder-vue-directives.svg +1 -0
  366. data/app/assets/images/scribo/icons/folder-vue-open.svg +1 -0
  367. data/app/assets/images/scribo/icons/folder-vue.svg +1 -0
  368. data/app/assets/images/scribo/icons/folder-vuex-store-open.svg +1 -0
  369. data/app/assets/images/scribo/icons/folder-vuex-store.svg +1 -0
  370. data/app/assets/images/scribo/icons/folder-wakatime-open.svg +2 -0
  371. data/app/assets/images/scribo/icons/folder-wakatime.svg +2 -0
  372. data/app/assets/images/scribo/icons/folder-webpack-open.svg +2 -0
  373. data/app/assets/images/scribo/icons/folder-webpack.svg +2 -0
  374. data/app/assets/images/scribo/icons/folder-wordpress-open.svg +2 -0
  375. data/app/assets/images/scribo/icons/folder-wordpress.svg +1 -0
  376. data/app/assets/images/scribo/icons/folder.svg +11 -0
  377. data/app/assets/images/scribo/icons/font.svg +3 -0
  378. data/app/assets/images/scribo/icons/foxpro.svg +1 -0
  379. data/app/assets/images/scribo/icons/fsharp.svg +7 -0
  380. data/app/assets/images/scribo/icons/fusebox.svg +20 -0
  381. data/app/assets/images/scribo/icons/gatsby.svg +5 -0
  382. data/app/assets/images/scribo/icons/gemfile.svg +1 -0
  383. data/app/assets/images/scribo/icons/git.svg +4 -0
  384. data/app/assets/images/scribo/icons/gitlab.svg +43 -0
  385. data/app/assets/images/scribo/icons/gitpod.svg +1 -0
  386. data/app/assets/images/scribo/icons/go-mod.svg +8 -0
  387. data/app/assets/images/scribo/icons/go.svg +8 -0
  388. data/app/assets/images/scribo/icons/go_gopher.svg +25 -0
  389. data/app/assets/images/scribo/icons/godot-assets.svg +1 -0
  390. data/app/assets/images/scribo/icons/godot.svg +1 -0
  391. data/app/assets/images/scribo/icons/gradle.svg +3 -0
  392. data/app/assets/images/scribo/icons/graphcool.svg +6 -0
  393. data/app/assets/images/scribo/icons/graphql.svg +11 -0
  394. data/app/assets/images/scribo/icons/groovy.svg +3 -0
  395. data/app/assets/images/scribo/icons/grunt.svg +1 -0
  396. data/app/assets/images/scribo/icons/gulp.svg +3 -0
  397. data/app/assets/images/scribo/icons/h.svg +6 -0
  398. data/app/assets/images/scribo/icons/hack.svg +2 -0
  399. data/app/assets/images/scribo/icons/haml.svg +5 -0
  400. data/app/assets/images/scribo/icons/handlebars.svg +3 -0
  401. data/app/assets/images/scribo/icons/haskell.svg +8 -0
  402. data/app/assets/images/scribo/icons/haxe.svg +17 -0
  403. data/app/assets/images/scribo/icons/hcl.svg +1 -0
  404. data/app/assets/images/scribo/icons/hcl_light.svg +1 -0
  405. data/app/assets/images/scribo/icons/helm.svg +1 -0
  406. data/app/assets/images/scribo/icons/heroku.svg +1 -0
  407. data/app/assets/images/scribo/icons/hpp.svg +7 -0
  408. data/app/assets/images/scribo/icons/html.svg +3 -0
  409. data/app/assets/images/scribo/icons/http.svg +3 -0
  410. data/app/assets/images/scribo/icons/i18n.svg +1 -0
  411. data/app/assets/images/scribo/icons/image.svg +3 -0
  412. data/app/assets/images/scribo/icons/ionic.svg +1 -0
  413. data/app/assets/images/scribo/icons/istanbul.svg +1 -0
  414. data/app/assets/images/scribo/icons/java.svg +3 -0
  415. data/app/assets/images/scribo/icons/javascript-map.svg +6 -0
  416. data/app/assets/images/scribo/icons/javascript.svg +3 -0
  417. data/app/assets/images/scribo/icons/jenkins.svg +1 -0
  418. data/app/assets/images/scribo/icons/jest.svg +1 -0
  419. data/app/assets/images/scribo/icons/jinja.svg +17 -0
  420. data/app/assets/images/scribo/icons/jinja_light.svg +17 -0
  421. data/app/assets/images/scribo/icons/json.svg +1 -0
  422. data/app/assets/images/scribo/icons/julia.svg +9 -0
  423. data/app/assets/images/scribo/icons/jupyter.svg +1 -0
  424. data/app/assets/images/scribo/icons/karma.svg +8 -0
  425. data/app/assets/images/scribo/icons/key.svg +3 -0
  426. data/app/assets/images/scribo/icons/kivy.svg +9 -0
  427. data/app/assets/images/scribo/icons/kl.svg +8 -0
  428. data/app/assets/images/scribo/icons/kotlin.svg +14 -0
  429. data/app/assets/images/scribo/icons/laravel.svg +5 -0
  430. data/app/assets/images/scribo/icons/less.svg +1 -0
  431. data/app/assets/images/scribo/icons/lib.svg +3 -0
  432. data/app/assets/images/scribo/icons/livescript.svg +18 -0
  433. data/app/assets/images/scribo/icons/lock.svg +3 -0
  434. data/app/assets/images/scribo/icons/log.svg +4 -0
  435. data/app/assets/images/scribo/icons/lua.svg +7 -0
  436. data/app/assets/images/scribo/icons/makefile.svg +1 -0
  437. data/app/assets/images/scribo/icons/markdown.svg +3 -0
  438. data/app/assets/images/scribo/icons/markojs.svg +12 -0
  439. data/app/assets/images/scribo/icons/mathematica.svg +3 -0
  440. data/app/assets/images/scribo/icons/matlab.svg +8 -0
  441. data/app/assets/images/scribo/icons/mdx.svg +1 -0
  442. data/app/assets/images/scribo/icons/merlin.svg +5 -0
  443. data/app/assets/images/scribo/icons/mint.svg +1 -0
  444. data/app/assets/images/scribo/icons/mjml.svg +4 -0
  445. data/app/assets/images/scribo/icons/mocha.svg +2 -0
  446. data/app/assets/images/scribo/icons/moonscript.svg +1 -0
  447. data/app/assets/images/scribo/icons/mxml.svg +3 -0
  448. data/app/assets/images/scribo/icons/nest-controller.svg +8 -0
  449. data/app/assets/images/scribo/icons/nest-decorator.svg +8 -0
  450. data/app/assets/images/scribo/icons/nest-filter.svg +8 -0
  451. data/app/assets/images/scribo/icons/nest-gateway.svg +8 -0
  452. data/app/assets/images/scribo/icons/nest-guard.svg +8 -0
  453. data/app/assets/images/scribo/icons/nest-middleware.svg +8 -0
  454. data/app/assets/images/scribo/icons/nest-module.svg +8 -0
  455. data/app/assets/images/scribo/icons/nest-pipe.svg +8 -0
  456. data/app/assets/images/scribo/icons/nest-service.svg +8 -0
  457. data/app/assets/images/scribo/icons/nest.svg +8 -0
  458. data/app/assets/images/scribo/icons/netlify.svg +1 -0
  459. data/app/assets/images/scribo/icons/ngrx-actions.svg +4 -0
  460. data/app/assets/images/scribo/icons/ngrx-effects.svg +4 -0
  461. data/app/assets/images/scribo/icons/ngrx-entity.svg +4 -0
  462. data/app/assets/images/scribo/icons/ngrx-reducer.svg +4 -0
  463. data/app/assets/images/scribo/icons/ngrx-state.svg +4 -0
  464. data/app/assets/images/scribo/icons/nim.svg +1 -0
  465. data/app/assets/images/scribo/icons/nix.svg +6 -0
  466. data/app/assets/images/scribo/icons/nodejs.svg +3 -0
  467. data/app/assets/images/scribo/icons/nodejs_alt.svg +1 -0
  468. data/app/assets/images/scribo/icons/nodemon.svg +7 -0
  469. data/app/assets/images/scribo/icons/now.svg +1 -0
  470. data/app/assets/images/scribo/icons/now_light.svg +1 -0
  471. data/app/assets/images/scribo/icons/npm.svg +8 -0
  472. data/app/assets/images/scribo/icons/nunjucks.svg +3 -0
  473. data/app/assets/images/scribo/icons/nuxt.svg +1 -0
  474. data/app/assets/images/scribo/icons/ocaml.svg +1 -0
  475. data/app/assets/images/scribo/icons/pdf.svg +1 -0
  476. data/app/assets/images/scribo/icons/percy.svg +1 -0
  477. data/app/assets/images/scribo/icons/perl.svg +3 -0
  478. data/app/assets/images/scribo/icons/php.svg +1 -0
  479. data/app/assets/images/scribo/icons/php_elephant.svg +4 -0
  480. data/app/assets/images/scribo/icons/postcss.svg +9 -0
  481. data/app/assets/images/scribo/icons/powerpoint.svg +3 -0
  482. data/app/assets/images/scribo/icons/powershell.svg +1 -0
  483. data/app/assets/images/scribo/icons/prettier.svg +35 -0
  484. data/app/assets/images/scribo/icons/prisma.svg +1 -0
  485. data/app/assets/images/scribo/icons/processing.svg +5 -0
  486. data/app/assets/images/scribo/icons/processing_light.svg +5 -0
  487. data/app/assets/images/scribo/icons/protractor.svg +1 -0
  488. data/app/assets/images/scribo/icons/pug.svg +22 -0
  489. data/app/assets/images/scribo/icons/puppet.svg +13 -0
  490. data/app/assets/images/scribo/icons/purescript.svg +1 -0
  491. data/app/assets/images/scribo/icons/python-misc.svg +1 -0
  492. data/app/assets/images/scribo/icons/python.svg +8 -0
  493. data/app/assets/images/scribo/icons/r.svg +4 -0
  494. data/app/assets/images/scribo/icons/racket.svg +1 -0
  495. data/app/assets/images/scribo/icons/raml.svg +1 -0
  496. data/app/assets/images/scribo/icons/razor.svg +1 -0
  497. data/app/assets/images/scribo/icons/react.svg +3 -0
  498. data/app/assets/images/scribo/icons/react_ts.svg +1 -0
  499. data/app/assets/images/scribo/icons/readme.svg +3 -0
  500. data/app/assets/images/scribo/icons/reason.svg +3 -0
  501. data/app/assets/images/scribo/icons/red.svg +8 -0
  502. data/app/assets/images/scribo/icons/redux-action.svg +1 -0
  503. data/app/assets/images/scribo/icons/redux-reducer.svg +1 -0
  504. data/app/assets/images/scribo/icons/redux-store.svg +1 -0
  505. data/app/assets/images/scribo/icons/restql.svg +60 -0
  506. data/app/assets/images/scribo/icons/riot.svg +1 -0
  507. data/app/assets/images/scribo/icons/robot.svg +1 -0
  508. data/app/assets/images/scribo/icons/rollup.svg +50 -0
  509. data/app/assets/images/scribo/icons/routing.svg +3 -0
  510. data/app/assets/images/scribo/icons/ruby.svg +3 -0
  511. data/app/assets/images/scribo/icons/rust.svg +3 -0
  512. data/app/assets/images/scribo/icons/san.svg +1 -0
  513. data/app/assets/images/scribo/icons/sass.svg +1 -0
  514. data/app/assets/images/scribo/icons/sbt.svg +6 -0
  515. data/app/assets/images/scribo/icons/scala.svg +1 -0
  516. data/app/assets/images/scribo/icons/scheme.svg +1 -0
  517. data/app/assets/images/scribo/icons/semantic-release.svg +1 -0
  518. data/app/assets/images/scribo/icons/semantic-release_light.svg +1 -0
  519. data/app/assets/images/scribo/icons/sequelize.svg +31 -0
  520. data/app/assets/images/scribo/icons/settings.svg +3 -0
  521. data/app/assets/images/scribo/icons/shaderlab.svg +3 -0
  522. data/app/assets/images/scribo/icons/silverstripe.svg +1 -0
  523. data/app/assets/images/scribo/icons/slim.svg +4 -0
  524. data/app/assets/images/scribo/icons/smarty.svg +3 -0
  525. data/app/assets/images/scribo/icons/snyk.svg +23 -0
  526. data/app/assets/images/scribo/icons/solidity.svg +7 -0
  527. data/app/assets/images/scribo/icons/stencil.svg +1 -0
  528. data/app/assets/images/scribo/icons/stencil_light.svg +1 -0
  529. data/app/assets/images/scribo/icons/storybook.svg +1 -0
  530. data/app/assets/images/scribo/icons/stylelint.svg +12 -0
  531. data/app/assets/images/scribo/icons/stylelint_light.svg +12 -0
  532. data/app/assets/images/scribo/icons/stylus.svg +1 -0
  533. data/app/assets/images/scribo/icons/sublime.svg +1 -0
  534. data/app/assets/images/scribo/icons/svelte.svg +1 -0
  535. data/app/assets/images/scribo/icons/svg.svg +1 -0
  536. data/app/assets/images/scribo/icons/swc.svg +12 -0
  537. data/app/assets/images/scribo/icons/swift.svg +1 -0
  538. data/app/assets/images/scribo/icons/table.svg +3 -0
  539. data/app/assets/images/scribo/icons/tailwindcss.svg +1 -0
  540. data/app/assets/images/scribo/icons/terraform.svg +12 -0
  541. data/app/assets/images/scribo/icons/test-js.svg +1 -0
  542. data/app/assets/images/scribo/icons/test-jsx.svg +4 -0
  543. data/app/assets/images/scribo/icons/test-ts.svg +1 -0
  544. data/app/assets/images/scribo/icons/tex.svg +1 -0
  545. data/app/assets/images/scribo/icons/todo.svg +1 -0
  546. data/app/assets/images/scribo/icons/travis.svg +13 -0
  547. data/app/assets/images/scribo/icons/tune.svg +7 -0
  548. data/app/assets/images/scribo/icons/twig.svg +3 -0
  549. data/app/assets/images/scribo/icons/typescript-def.svg +6 -0
  550. data/app/assets/images/scribo/icons/typescript.svg +3 -0
  551. data/app/assets/images/scribo/icons/url.svg +3 -0
  552. data/app/assets/images/scribo/icons/vagrant.svg +1 -0
  553. data/app/assets/images/scribo/icons/velocity.svg +1 -0
  554. data/app/assets/images/scribo/icons/verilog.svg +3 -0
  555. data/app/assets/images/scribo/icons/vfl.svg +16 -0
  556. data/app/assets/images/scribo/icons/video.svg +4 -0
  557. data/app/assets/images/scribo/icons/vim.svg +1 -0
  558. data/app/assets/images/scribo/icons/virtual.svg +1 -0
  559. data/app/assets/images/scribo/icons/visualstudio.svg +4 -0
  560. data/app/assets/images/scribo/icons/vscode.svg +9 -0
  561. data/app/assets/images/scribo/icons/vue-config.svg +1 -0
  562. data/app/assets/images/scribo/icons/vue.svg +1 -0
  563. data/app/assets/images/scribo/icons/vuex-store.svg +1 -0
  564. data/app/assets/images/scribo/icons/wakatime.svg +21 -0
  565. data/app/assets/images/scribo/icons/wakatime_light.svg +21 -0
  566. data/app/assets/images/scribo/icons/wallaby.svg +1 -0
  567. data/app/assets/images/scribo/icons/watchman.svg +4 -0
  568. data/app/assets/images/scribo/icons/webassembly.svg +1 -0
  569. data/app/assets/images/scribo/icons/webhint.svg +5 -0
  570. data/app/assets/images/scribo/icons/webpack.svg +6 -0
  571. data/app/assets/images/scribo/icons/wepy.svg +1 -0
  572. data/app/assets/images/scribo/icons/wolframlanguage.svg +13 -0
  573. data/app/assets/images/scribo/icons/word.svg +3 -0
  574. data/app/assets/images/scribo/icons/xaml.svg +3 -0
  575. data/app/assets/images/scribo/icons/xml.svg +4 -0
  576. data/app/assets/images/scribo/icons/yaml.svg +1 -0
  577. data/app/assets/images/scribo/icons/yang.svg +1 -0
  578. data/app/assets/images/scribo/icons/yarn.svg +3 -0
  579. data/app/assets/images/scribo/icons/zip.svg +3 -0
  580. data/app/assets/stylesheets/scribo/application.css +108 -0
  581. data/app/assets/stylesheets/scribo/components/file-icons.css +158 -0
  582. data/app/assets/stylesheets/scribo/components/open-editors.css +83 -0
  583. data/app/assets/stylesheets/scribo/components/tree-view.css +312 -0
  584. data/app/javascript/scribo/application.js +2 -0
  585. data/app/javascript/scribo/controllers/application.js +12 -0
  586. data/app/javascript/scribo/controllers/image_editor_controller.js +72 -0
  587. data/app/javascript/scribo/controllers/index.js +4 -0
  588. data/app/javascript/scribo/controllers/open_editors_controller.js +291 -0
  589. data/app/javascript/scribo/controllers/text_editor_controller.js +39 -0
  590. data/app/javascript/scribo/controllers/tree_view_controller.js +378 -0
  591. data/app/javascript/scribo/controllers/upload_controller.js +81 -0
  592. data/app/views/scribo/admin/sites/contents/_form.html.slim +11 -12
  593. data/app/views/scribo/shared/_ide.html.slim +1 -1
  594. data/app/views/scribo/shared/_tree-view.html.slim +3 -3
  595. data/bin/importmap +4 -0
  596. data/bin/rails +14 -0
  597. data/bin/rake +29 -0
  598. data/bin/rubocop +29 -0
  599. data/cli/.gitignore +2 -0
  600. data/cli/scribo.cr +103 -0
  601. data/cli/shard.lock +6 -0
  602. data/cli/shard.yml +18 -0
  603. data/config/importmap.rb +8 -0
  604. data/docs/content.md +33 -0
  605. data/docs/editor.png +0 -0
  606. data/docs/features.md +71 -0
  607. data/docs/ide.md +17 -0
  608. data/docs/import_export.md +7 -0
  609. data/docs/liquid.md +59 -0
  610. data/favicon.ico +0 -0
  611. data/frontend/images/.DS_Store +0 -0
  612. data/icon.png +0 -0
  613. data/lib/generators/scribo/install_generator.rb +22 -0
  614. data/lib/generators/scribo/tailwind_config_generator.rb +24 -0
  615. data/lib/generators/scribo/templates/config/initializers/scribo.rb +16 -0
  616. data/lib/scribo/engine.rb +19 -8
  617. data/lib/scribo/version.rb +1 -1
  618. data/lib/tasks/scribo_tasks.rake +13 -0
  619. data/logo.svg +1 -0
  620. data/scribo.gemspec +54 -0
  621. data/vendor/javascript/@hotwired--stimulus.js +2 -0
  622. data/vendor/javascript/painterro.js +2 -0
  623. data/vendor/javascript/sortablejs.js +134 -0
  624. data/yarn.lock +6775 -0
  625. metadata +683 -15
  626. data/app/assets/javascripts/scribo/scribo.js +0 -1
  627. data/app/assets/stylesheets/scribo/scribo.css +0 -1
  628. data/lib/scribo/liquid/tags/editable_url_tag.rb +0 -19
data/lib/scribo/engine.rb CHANGED
@@ -1,24 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'i18n'
4
+ require 'slim'
5
+ require 'tailwindcss-rails'
6
+ require "importmap-rails"
7
+ require "turbo-rails"
8
+ require "stimulus-rails"
4
9
 
5
10
  module Scribo
6
11
  class Engine < ::Rails::Engine
7
12
  isolate_namespace Scribo
8
13
 
14
+ initializer 'scribo.assets' do |app|
15
+ app.config.assets.paths << root.join("app/javascript")
16
+ app.config.assets.paths << root.join("app/components")
17
+ app.config.assets.paths << Scribo::Engine.root.join("vendor/javascript")
18
+ app.config.assets.precompile += %w[scribo_manifest]
19
+ end
20
+
21
+ initializer 'scribo.importmap', before: "importmap" do |app|
22
+ app.config.importmap.paths << root.join("config/importmap.rb")
23
+ app.config.importmap.cache_sweepers << root.join("app/javascript")
24
+ app.config.importmap.cache_sweepers << root.join("app/components")
25
+ app.config.importmap.cache_sweepers << Scribo::Engine.root.join("vendor/javascript")
26
+ end
27
+
9
28
  initializer 'scribo.config' do |_app|
10
29
  path = File.expand_path(File.join(File.dirname(__FILE__), '.', 'liquid', '{tags,filters}', '*.rb'))
11
30
  Dir.glob(path).each do |c|
12
31
  require_dependency(c)
13
32
  end
14
33
  end
15
-
16
- initializer :append_migrations do |app|
17
- unless app.root.to_s.match? root.to_s
18
- config.paths['db/migrate'].expanded.each do |expanded_path|
19
- app.config.paths['db/migrate'] << expanded_path
20
- end
21
- end
22
- end
23
34
  end
24
35
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scribo
4
- VERSION = '1.0.38'
4
+ VERSION = '1.0.40'
5
5
  end
@@ -25,4 +25,17 @@ namespace :scribo do
25
25
 
26
26
  `rm -rf jekyllthemes`
27
27
  end
28
+
29
+ namespace :tailwindcss do
30
+ desc "Configure your Tailwind CSS"
31
+ task :config do
32
+ Rails::Generators.invoke("scribo:tailwind_config", ["--force"])
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ if Rake::Task.task_defined?("tailwindcss:build")
39
+ Rake::Task["tailwindcss:build"].enhance(["scribo:tailwindcss:config"])
40
+ Rake::Task["tailwindcss:watch"].enhance(["scribo:tailwindcss:config"])
28
41
  end
data/logo.svg ADDED
@@ -0,0 +1 @@
1
+ <?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path d="M324.8,163.7c31.5-13.8,70.6-23.7,105.8-30.7C464.1,33.7,512,3.8,512,3.8C457.6-1.5,409.5-1.1,366.9,4 c-24.1,21.4-51,48.9-65.2,76.1c0,0,3.2-29.5,15.5-67.6c-39.8,9-73.9,22.5-103.1,39.1c-17.1,37-40.2,91.3-46.4,126 c0,0-10.6-42.2-13.7-81.6c-39.9,37.6-65.7,82.2-82.4,125.9c-1.4,27.9-1.7,61.7,3.2,78.8c0,0-8.2-13.7-18-32 c-20.2,79.2-14,145.2-14,145.2c58.2,39,122.7,44.6,181.3,26.8c-23.2-32.7-56.3-62.9-56.3-62.9c29.6,0.1,68,27,93.5,48.1 c36.7-18.3,69.6-46,95.3-80.3c-40.3-46.6-141.6-60.3-141.6-60.3c43.1-12.9,126.7-12.3,180-10.3c6.1-16.5,10.7-33.6,13.6-51.4 c3.2-19.7,7-37.7,11.2-54.2C375.7,163.1,324.8,163.7,324.8,163.7z" fill="#0676B7"/><path d="M304.9,116.6c-6.3,3.5-14.1,7.8-22.9,12.7c-9,4.7-18,11.8-28.5,18.5c-10.3,7-21.8,14.2-32.6,23.6 c-5.6,4.5-11.3,9.1-17.2,13.8c-5.9,4.6-11.9,9.5-17.4,15.1c-5.7,5.4-11.5,10.9-17.3,16.4l-8.8,8.4c-2.9,2.9-5.5,6-8.3,9 c-10.9,12.3-22.8,24.2-32.7,37.8l-15.5,19.8c-4.9,6.8-9.5,13.7-14.2,20.5c-9.7,13.4-17.7,27.6-25.8,41.2 C55.9,367,49,380.7,42.5,393.6c-6,13.2-12,25.5-16.5,37.4c-4.9,11.7-8.8,22.7-12.2,32.4c-3.3,9.8-6,18.4-8,25.6 c-2,7.2-3.5,12.9-4.4,17c-0.9,3.9-1.3,6-1.3,6l34.3-46.7c0,0,0,0,0,0c2.6-8.5,5.4-17.7,9.2-27.6c3.9-11.7,9.2-23.9,14.5-37 c5.8-12.9,12-26.4,19.1-40.1c7.4-13.5,14.6-27.8,23.5-41.3c4.3-6.8,8.5-13.9,13-20.7l14.4-20c9.2-13.7,20.3-25.9,30.6-38.5 c2.6-3.1,5.1-6.3,7.8-9.3l8.4-8.6c5.5-5.7,11-11.4,16.4-16.9c5.2-5.7,10.9-10.8,16.6-15.6c5.6-4.9,11.1-9.7,16.4-14.4 c10.4-9.8,21.4-17.4,31.4-24.8c10.1-7.2,18.8-14.6,27.6-19.6c8.6-5.3,16.1-9.8,22.3-13.6c12.4-7.6,19.4-11.9,19.4-11.9 S317.6,109.6,304.9,116.6z" fill="#122B47"/></g></svg>
data/scribo.gemspec ADDED
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+
5
+ # Maintain your gem's version:
6
+ require 'scribo/version'
7
+
8
+ # Describe your gem and declare its dependencies:
9
+ Gem::Specification.new do |s|
10
+ s.name = 'scribo'
11
+ s.version = Scribo::VERSION
12
+ s.authors = ['Tom de Grunt']
13
+ s.email = ['tom@degrunt.nl']
14
+ s.homepage = 'https://gitlab.com/tdegrunt/scribo'
15
+ s.summary = 'An easy to use, embeddable CMS for Ruby on Rails'
16
+ s.description = 'Scribo is designed to work with your models and renders your content inside customer designed layouts.'
17
+ s.license = 'MIT'
18
+
19
+ s.files = Dir.chdir(File.expand_path("..", __FILE__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
22
+
23
+ s.add_dependency 'ancestry'
24
+ s.add_dependency 'babel-transpiler', '~> 0.7'
25
+ s.add_dependency 'down', '~> 5.2'
26
+ s.add_dependency 'kaminari'
27
+ s.add_dependency 'key_path'
28
+ s.add_dependency 'liquidum', '~> 1'
29
+ s.add_dependency 'mimemagic'
30
+ s.add_dependency 'mime-types'
31
+ s.add_dependency 'pg'
32
+ s.add_dependency 'rails', '> 7'
33
+ s.add_dependency 'rouge', '~> 3'
34
+ s.add_dependency 'rubyzip', '> 1.1'
35
+ s.add_dependency 'slim-rails', '~> 3'
36
+
37
+ s.add_dependency 'tailwindcss-rails'
38
+ s.add_dependency 'importmap-rails'
39
+ s.add_dependency 'turbo-rails'
40
+ s.add_dependency 'stimulus-rails'
41
+
42
+ s.add_development_dependency 'auxilium', '~> 0'
43
+ s.add_development_dependency 'capybara'
44
+ s.add_development_dependency 'cuprite'
45
+ s.add_development_dependency 'jbuilder'
46
+ s.add_development_dependency 'minitest', '~> 5.11'
47
+ s.add_development_dependency 'minitest-reporters', '~> 1.1'
48
+ s.add_development_dependency 'pry'
49
+ s.add_development_dependency 'pry-byebug', '~> 3'
50
+ s.add_development_dependency 'pry-rails', '~> 0.3'
51
+ s.add_development_dependency 'puma'
52
+ s.add_development_dependency 'rubocop', '~> 0.60'
53
+ s.add_development_dependency 'selenium-webdriver'
54
+ end
@@ -0,0 +1,2 @@
1
+ class EventListener{constructor(e,t,r){this.eventTarget=e;this.eventName=t;this.eventOptions=r;this.unorderedBindings=new Set}connect(){this.eventTarget.addEventListener(this.eventName,this,this.eventOptions)}disconnect(){this.eventTarget.removeEventListener(this.eventName,this,this.eventOptions)}bindingConnected(e){this.unorderedBindings.add(e)}bindingDisconnected(e){this.unorderedBindings.delete(e)}handleEvent(e){const t=extendEvent(e);for(const e of this.bindings){if(t.immediatePropagationStopped)break;e.handleEvent(t)}}hasBindings(){return this.unorderedBindings.size>0}get bindings(){return Array.from(this.unorderedBindings).sort(((e,t)=>{const r=e.index,s=t.index;return r<s?-1:r>s?1:0}))}}function extendEvent(e){if("immediatePropagationStopped"in e)return e;{const{stopImmediatePropagation:t}=e;return Object.assign(e,{immediatePropagationStopped:false,stopImmediatePropagation(){this.immediatePropagationStopped=true;t.call(this)}})}}class Dispatcher{constructor(e){this.application=e;this.eventListenerMaps=new Map;this.started=false}start(){if(!this.started){this.started=true;this.eventListeners.forEach((e=>e.connect()))}}stop(){if(this.started){this.started=false;this.eventListeners.forEach((e=>e.disconnect()))}}get eventListeners(){return Array.from(this.eventListenerMaps.values()).reduce(((e,t)=>e.concat(Array.from(t.values()))),[])}bindingConnected(e){this.fetchEventListenerForBinding(e).bindingConnected(e)}bindingDisconnected(e,t=false){this.fetchEventListenerForBinding(e).bindingDisconnected(e);t&&this.clearEventListenersForBinding(e)}handleError(e,t,r={}){this.application.handleError(e,`Error ${t}`,r)}clearEventListenersForBinding(e){const t=this.fetchEventListenerForBinding(e);if(!t.hasBindings()){t.disconnect();this.removeMappedEventListenerFor(e)}}removeMappedEventListenerFor(e){const{eventTarget:t,eventName:r,eventOptions:s}=e;const n=this.fetchEventListenerMapForEventTarget(t);const i=this.cacheKey(r,s);n.delete(i);0==n.size&&this.eventListenerMaps.delete(t)}fetchEventListenerForBinding(e){const{eventTarget:t,eventName:r,eventOptions:s}=e;return this.fetchEventListener(t,r,s)}fetchEventListener(e,t,r){const s=this.fetchEventListenerMapForEventTarget(e);const n=this.cacheKey(t,r);let i=s.get(n);if(!i){i=this.createEventListener(e,t,r);s.set(n,i)}return i}createEventListener(e,t,r){const s=new EventListener(e,t,r);this.started&&s.connect();return s}fetchEventListenerMapForEventTarget(e){let t=this.eventListenerMaps.get(e);if(!t){t=new Map;this.eventListenerMaps.set(e,t)}return t}cacheKey(e,t){const r=[e];Object.keys(t).sort().forEach((e=>{r.push(`${t[e]?"":"!"}${e}`)}));return r.join(":")}}const e={stop({event:e,value:t}){t&&e.stopPropagation();return true},prevent({event:e,value:t}){t&&e.preventDefault();return true},self({event:e,value:t,element:r}){return!t||r===e.target}};const t=/^(?:(?:([^.]+?)\+)?(.+?)(?:\.(.+?))?(?:@(window|document))?->)?(.+?)(?:#([^:]+?))(?::(.+))?$/;function parseActionDescriptorString(e){const r=e.trim();const s=r.match(t)||[];let n=s[2];let i=s[3];if(i&&!["keydown","keyup","keypress"].includes(n)){n+=`.${i}`;i=""}return{eventTarget:parseEventTarget(s[4]),eventName:n,eventOptions:s[7]?parseEventOptions(s[7]):{},identifier:s[5],methodName:s[6],keyFilter:s[1]||i}}function parseEventTarget(e){return"window"==e?window:"document"==e?document:void 0}function parseEventOptions(e){return e.split(":").reduce(((e,t)=>Object.assign(e,{[t.replace(/^!/,"")]:!/^!/.test(t)})),{})}function stringifyEventTarget(e){return e==window?"window":e==document?"document":void 0}function camelize(e){return e.replace(/(?:[_-])([a-z0-9])/g,((e,t)=>t.toUpperCase()))}function namespaceCamelize(e){return camelize(e.replace(/--/g,"-").replace(/__/g,"_"))}function capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}function dasherize(e){return e.replace(/([A-Z])/g,((e,t)=>`-${t.toLowerCase()}`))}function tokenize(e){return e.match(/[^\s]+/g)||[]}function isSomething(e){return null!==e&&void 0!==e}function hasProperty(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const r=["meta","ctrl","alt","shift"];class Action{constructor(e,t,r,s){this.element=e;this.index=t;this.eventTarget=r.eventTarget||e;this.eventName=r.eventName||getDefaultEventNameForElement(e)||error("missing event name");this.eventOptions=r.eventOptions||{};this.identifier=r.identifier||error("missing identifier");this.methodName=r.methodName||error("missing method name");this.keyFilter=r.keyFilter||"";this.schema=s}static forToken(e,t){return new this(e.element,e.index,parseActionDescriptorString(e.content),t)}toString(){const e=this.keyFilter?`.${this.keyFilter}`:"";const t=this.eventTargetName?`@${this.eventTargetName}`:"";return`${this.eventName}${e}${t}->${this.identifier}#${this.methodName}`}shouldIgnoreKeyboardEvent(e){if(!this.keyFilter)return false;const t=this.keyFilter.split("+");if(this.keyFilterDissatisfied(e,t))return true;const s=t.filter((e=>!r.includes(e)))[0];if(!s)return false;hasProperty(this.keyMappings,s)||error(`contains unknown key filter: ${this.keyFilter}`);return this.keyMappings[s].toLowerCase()!==e.key.toLowerCase()}shouldIgnoreMouseEvent(e){if(!this.keyFilter)return false;const t=[this.keyFilter];return!!this.keyFilterDissatisfied(e,t)}get params(){const e={};const t=new RegExp(`^data-${this.identifier}-(.+)-param$`,"i");for(const{name:r,value:s}of Array.from(this.element.attributes)){const n=r.match(t);const i=n&&n[1];i&&(e[camelize(i)]=typecast(s))}return e}get eventTargetName(){return stringifyEventTarget(this.eventTarget)}get keyMappings(){return this.schema.keyMappings}keyFilterDissatisfied(e,t){const[s,n,i,o]=r.map((e=>t.includes(e)));return e.metaKey!==s||e.ctrlKey!==n||e.altKey!==i||e.shiftKey!==o}}const s={a:()=>"click",button:()=>"click",form:()=>"submit",details:()=>"toggle",input:e=>"submit"==e.getAttribute("type")?"click":"input",select:()=>"change",textarea:()=>"input"};function getDefaultEventNameForElement(e){const t=e.tagName.toLowerCase();if(t in s)return s[t](e)}function error(e){throw new Error(e)}function typecast(e){try{return JSON.parse(e)}catch(t){return e}}class Binding{constructor(e,t){this.context=e;this.action=t}get index(){return this.action.index}get eventTarget(){return this.action.eventTarget}get eventOptions(){return this.action.eventOptions}get identifier(){return this.context.identifier}handleEvent(e){const t=this.prepareActionEvent(e);this.willBeInvokedByEvent(e)&&this.applyEventModifiers(t)&&this.invokeWithEvent(t)}get eventName(){return this.action.eventName}get method(){const e=this.controller[this.methodName];if("function"==typeof e)return e;throw new Error(`Action "${this.action}" references undefined method "${this.methodName}"`)}applyEventModifiers(e){const{element:t}=this.action;const{actionDescriptorFilters:r}=this.context.application;const{controller:s}=this.context;let n=true;for(const[i,o]of Object.entries(this.eventOptions))if(i in r){const c=r[i];n=n&&c({name:i,value:o,event:e,element:t,controller:s})}return n}prepareActionEvent(e){return Object.assign(e,{params:this.action.params})}invokeWithEvent(e){const{target:t,currentTarget:r}=e;try{this.method.call(this.controller,e);this.context.logDebugActivity(this.methodName,{event:e,target:t,currentTarget:r,action:this.methodName})}catch(t){const{identifier:r,controller:s,element:n,index:i}=this;const o={identifier:r,controller:s,element:n,index:i,event:e};this.context.handleError(t,`invoking action "${this.action}"`,o)}}willBeInvokedByEvent(e){const t=e.target;return!(e instanceof KeyboardEvent&&this.action.shouldIgnoreKeyboardEvent(e))&&(!(e instanceof MouseEvent&&this.action.shouldIgnoreMouseEvent(e))&&(this.element===t||(t instanceof Element&&this.element.contains(t)?this.scope.containsElement(t):this.scope.containsElement(this.action.element))))}get controller(){return this.context.controller}get methodName(){return this.action.methodName}get element(){return this.scope.element}get scope(){return this.context.scope}}class ElementObserver{constructor(e,t){this.mutationObserverInit={attributes:true,childList:true,subtree:true};this.element=e;this.started=false;this.delegate=t;this.elements=new Set;this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){if(!this.started){this.started=true;this.mutationObserver.observe(this.element,this.mutationObserverInit);this.refresh()}}pause(e){if(this.started){this.mutationObserver.disconnect();this.started=false}e();if(!this.started){this.mutationObserver.observe(this.element,this.mutationObserverInit);this.started=true}}stop(){if(this.started){this.mutationObserver.takeRecords();this.mutationObserver.disconnect();this.started=false}}refresh(){if(this.started){const e=new Set(this.matchElementsInTree());for(const t of Array.from(this.elements))e.has(t)||this.removeElement(t);for(const t of Array.from(e))this.addElement(t)}}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){if("attributes"==e.type)this.processAttributeChange(e.target,e.attributeName);else if("childList"==e.type){this.processRemovedNodes(e.removedNodes);this.processAddedNodes(e.addedNodes)}}processAttributeChange(e,t){this.elements.has(e)?this.delegate.elementAttributeChanged&&this.matchElement(e)?this.delegate.elementAttributeChanged(e,t):this.removeElement(e):this.matchElement(e)&&this.addElement(e)}processRemovedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.processTree(e,this.removeElement)}}processAddedNodes(e){for(const t of Array.from(e)){const e=this.elementFromNode(t);e&&this.elementIsActive(e)&&this.processTree(e,this.addElement)}}matchElement(e){return this.delegate.matchElement(e)}matchElementsInTree(e=this.element){return this.delegate.matchElementsInTree(e)}processTree(e,t){for(const r of this.matchElementsInTree(e))t.call(this,r)}elementFromNode(e){if(e.nodeType==Node.ELEMENT_NODE)return e}elementIsActive(e){return e.isConnected==this.element.isConnected&&this.element.contains(e)}addElement(e){if(!this.elements.has(e)&&this.elementIsActive(e)){this.elements.add(e);this.delegate.elementMatched&&this.delegate.elementMatched(e)}}removeElement(e){if(this.elements.has(e)){this.elements.delete(e);this.delegate.elementUnmatched&&this.delegate.elementUnmatched(e)}}}class AttributeObserver{constructor(e,t,r){this.attributeName=t;this.delegate=r;this.elementObserver=new ElementObserver(e,this)}get element(){return this.elementObserver.element}get selector(){return`[${this.attributeName}]`}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get started(){return this.elementObserver.started}matchElement(e){return e.hasAttribute(this.attributeName)}matchElementsInTree(e){const t=this.matchElement(e)?[e]:[];const r=Array.from(e.querySelectorAll(this.selector));return t.concat(r)}elementMatched(e){this.delegate.elementMatchedAttribute&&this.delegate.elementMatchedAttribute(e,this.attributeName)}elementUnmatched(e){this.delegate.elementUnmatchedAttribute&&this.delegate.elementUnmatchedAttribute(e,this.attributeName)}elementAttributeChanged(e,t){this.delegate.elementAttributeValueChanged&&this.attributeName==t&&this.delegate.elementAttributeValueChanged(e,t)}}function add(e,t,r){fetch(e,t).add(r)}function del(e,t,r){fetch(e,t).delete(r);prune(e,t)}function fetch(e,t){let r=e.get(t);if(!r){r=new Set;e.set(t,r)}return r}function prune(e,t){const r=e.get(t);null!=r&&0==r.size&&e.delete(t)}class Multimap{constructor(){this.valuesByKey=new Map}get keys(){return Array.from(this.valuesByKey.keys())}get values(){const e=Array.from(this.valuesByKey.values());return e.reduce(((e,t)=>e.concat(Array.from(t))),[])}get size(){const e=Array.from(this.valuesByKey.values());return e.reduce(((e,t)=>e+t.size),0)}add(e,t){add(this.valuesByKey,e,t)}delete(e,t){del(this.valuesByKey,e,t)}has(e,t){const r=this.valuesByKey.get(e);return null!=r&&r.has(t)}hasKey(e){return this.valuesByKey.has(e)}hasValue(e){const t=Array.from(this.valuesByKey.values());return t.some((t=>t.has(e)))}getValuesForKey(e){const t=this.valuesByKey.get(e);return t?Array.from(t):[]}getKeysForValue(e){return Array.from(this.valuesByKey).filter((([t,r])=>r.has(e))).map((([e,t])=>e))}}class IndexedMultimap extends Multimap{constructor(){super();this.keysByValue=new Map}get values(){return Array.from(this.keysByValue.keys())}add(e,t){super.add(e,t);add(this.keysByValue,t,e)}delete(e,t){super.delete(e,t);del(this.keysByValue,t,e)}hasValue(e){return this.keysByValue.has(e)}getKeysForValue(e){const t=this.keysByValue.get(e);return t?Array.from(t):[]}}class SelectorObserver{constructor(e,t,r,s){this._selector=t;this.details=s;this.elementObserver=new ElementObserver(e,this);this.delegate=r;this.matchesByElement=new Multimap}get started(){return this.elementObserver.started}get selector(){return this._selector}set selector(e){this._selector=e;this.refresh()}start(){this.elementObserver.start()}pause(e){this.elementObserver.pause(e)}stop(){this.elementObserver.stop()}refresh(){this.elementObserver.refresh()}get element(){return this.elementObserver.element}matchElement(e){const{selector:t}=this;if(t){const r=e.matches(t);return this.delegate.selectorMatchElement?r&&this.delegate.selectorMatchElement(e,this.details):r}return false}matchElementsInTree(e){const{selector:t}=this;if(t){const r=this.matchElement(e)?[e]:[];const s=Array.from(e.querySelectorAll(t)).filter((e=>this.matchElement(e)));return r.concat(s)}return[]}elementMatched(e){const{selector:t}=this;t&&this.selectorMatched(e,t)}elementUnmatched(e){const t=this.matchesByElement.getKeysForValue(e);for(const r of t)this.selectorUnmatched(e,r)}elementAttributeChanged(e,t){const{selector:r}=this;if(r){const t=this.matchElement(e);const s=this.matchesByElement.has(r,e);t&&!s?this.selectorMatched(e,r):!t&&s&&this.selectorUnmatched(e,r)}}selectorMatched(e,t){this.delegate.selectorMatched(e,t,this.details);this.matchesByElement.add(t,e)}selectorUnmatched(e,t){this.delegate.selectorUnmatched(e,t,this.details);this.matchesByElement.delete(t,e)}}class StringMapObserver{constructor(e,t){this.element=e;this.delegate=t;this.started=false;this.stringMap=new Map;this.mutationObserver=new MutationObserver((e=>this.processMutations(e)))}start(){if(!this.started){this.started=true;this.mutationObserver.observe(this.element,{attributes:true,attributeOldValue:true});this.refresh()}}stop(){if(this.started){this.mutationObserver.takeRecords();this.mutationObserver.disconnect();this.started=false}}refresh(){if(this.started)for(const e of this.knownAttributeNames)this.refreshAttribute(e,null)}processMutations(e){if(this.started)for(const t of e)this.processMutation(t)}processMutation(e){const t=e.attributeName;t&&this.refreshAttribute(t,e.oldValue)}refreshAttribute(e,t){const r=this.delegate.getStringMapKeyForAttribute(e);if(null!=r){this.stringMap.has(e)||this.stringMapKeyAdded(r,e);const s=this.element.getAttribute(e);this.stringMap.get(e)!=s&&this.stringMapValueChanged(s,r,t);if(null==s){const t=this.stringMap.get(e);this.stringMap.delete(e);t&&this.stringMapKeyRemoved(r,e,t)}else this.stringMap.set(e,s)}}stringMapKeyAdded(e,t){this.delegate.stringMapKeyAdded&&this.delegate.stringMapKeyAdded(e,t)}stringMapValueChanged(e,t,r){this.delegate.stringMapValueChanged&&this.delegate.stringMapValueChanged(e,t,r)}stringMapKeyRemoved(e,t,r){this.delegate.stringMapKeyRemoved&&this.delegate.stringMapKeyRemoved(e,t,r)}get knownAttributeNames(){return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)))}get currentAttributeNames(){return Array.from(this.element.attributes).map((e=>e.name))}get recordedAttributeNames(){return Array.from(this.stringMap.keys())}}class TokenListObserver{constructor(e,t,r){this.attributeObserver=new AttributeObserver(e,t,this);this.delegate=r;this.tokensByElement=new Multimap}get started(){return this.attributeObserver.started}start(){this.attributeObserver.start()}pause(e){this.attributeObserver.pause(e)}stop(){this.attributeObserver.stop()}refresh(){this.attributeObserver.refresh()}get element(){return this.attributeObserver.element}get attributeName(){return this.attributeObserver.attributeName}elementMatchedAttribute(e){this.tokensMatched(this.readTokensForElement(e))}elementAttributeValueChanged(e){const[t,r]=this.refreshTokensForElement(e);this.tokensUnmatched(t);this.tokensMatched(r)}elementUnmatchedAttribute(e){this.tokensUnmatched(this.tokensByElement.getValuesForKey(e))}tokensMatched(e){e.forEach((e=>this.tokenMatched(e)))}tokensUnmatched(e){e.forEach((e=>this.tokenUnmatched(e)))}tokenMatched(e){this.delegate.tokenMatched(e);this.tokensByElement.add(e.element,e)}tokenUnmatched(e){this.delegate.tokenUnmatched(e);this.tokensByElement.delete(e.element,e)}refreshTokensForElement(e){const t=this.tokensByElement.getValuesForKey(e);const r=this.readTokensForElement(e);const s=zip(t,r).findIndex((([e,t])=>!tokensAreEqual(e,t)));return-1==s?[[],[]]:[t.slice(s),r.slice(s)]}readTokensForElement(e){const t=this.attributeName;const r=e.getAttribute(t)||"";return parseTokenString(r,e,t)}}function parseTokenString(e,t,r){return e.trim().split(/\s+/).filter((e=>e.length)).map(((e,s)=>({element:t,attributeName:r,content:e,index:s})))}function zip(e,t){const r=Math.max(e.length,t.length);return Array.from({length:r},((r,s)=>[e[s],t[s]]))}function tokensAreEqual(e,t){return e&&t&&e.index==t.index&&e.content==t.content}class ValueListObserver{constructor(e,t,r){this.tokenListObserver=new TokenListObserver(e,t,this);this.delegate=r;this.parseResultsByToken=new WeakMap;this.valuesByTokenByElement=new WeakMap}get started(){return this.tokenListObserver.started}start(){this.tokenListObserver.start()}stop(){this.tokenListObserver.stop()}refresh(){this.tokenListObserver.refresh()}get element(){return this.tokenListObserver.element}get attributeName(){return this.tokenListObserver.attributeName}tokenMatched(e){const{element:t}=e;const{value:r}=this.fetchParseResultForToken(e);if(r){this.fetchValuesByTokenForElement(t).set(e,r);this.delegate.elementMatchedValue(t,r)}}tokenUnmatched(e){const{element:t}=e;const{value:r}=this.fetchParseResultForToken(e);if(r){this.fetchValuesByTokenForElement(t).delete(e);this.delegate.elementUnmatchedValue(t,r)}}fetchParseResultForToken(e){let t=this.parseResultsByToken.get(e);if(!t){t=this.parseToken(e);this.parseResultsByToken.set(e,t)}return t}fetchValuesByTokenForElement(e){let t=this.valuesByTokenByElement.get(e);if(!t){t=new Map;this.valuesByTokenByElement.set(e,t)}return t}parseToken(e){try{const t=this.delegate.parseValueForToken(e);return{value:t}}catch(e){return{error:e}}}}class BindingObserver{constructor(e,t){this.context=e;this.delegate=t;this.bindingsByAction=new Map}start(){if(!this.valueListObserver){this.valueListObserver=new ValueListObserver(this.element,this.actionAttribute,this);this.valueListObserver.start()}}stop(){if(this.valueListObserver){this.valueListObserver.stop();delete this.valueListObserver;this.disconnectAllActions()}}get element(){return this.context.element}get identifier(){return this.context.identifier}get actionAttribute(){return this.schema.actionAttribute}get schema(){return this.context.schema}get bindings(){return Array.from(this.bindingsByAction.values())}connectAction(e){const t=new Binding(this.context,e);this.bindingsByAction.set(e,t);this.delegate.bindingConnected(t)}disconnectAction(e){const t=this.bindingsByAction.get(e);if(t){this.bindingsByAction.delete(e);this.delegate.bindingDisconnected(t)}}disconnectAllActions(){this.bindings.forEach((e=>this.delegate.bindingDisconnected(e,true)));this.bindingsByAction.clear()}parseValueForToken(e){const t=Action.forToken(e,this.schema);if(t.identifier==this.identifier)return t}elementMatchedValue(e,t){this.connectAction(t)}elementUnmatchedValue(e,t){this.disconnectAction(t)}}class ValueObserver{constructor(e,t){this.context=e;this.receiver=t;this.stringMapObserver=new StringMapObserver(this.element,this);this.valueDescriptorMap=this.controller.valueDescriptorMap}start(){this.stringMapObserver.start();this.invokeChangedCallbacksForDefaultValues()}stop(){this.stringMapObserver.stop()}get element(){return this.context.element}get controller(){return this.context.controller}getStringMapKeyForAttribute(e){if(e in this.valueDescriptorMap)return this.valueDescriptorMap[e].name}stringMapKeyAdded(e,t){const r=this.valueDescriptorMap[t];this.hasValue(e)||this.invokeChangedCallback(e,r.writer(this.receiver[e]),r.writer(r.defaultValue))}stringMapValueChanged(e,t,r){const s=this.valueDescriptorNameMap[t];if(null!==e){null===r&&(r=s.writer(s.defaultValue));this.invokeChangedCallback(t,e,r)}}stringMapKeyRemoved(e,t,r){const s=this.valueDescriptorNameMap[e];this.hasValue(e)?this.invokeChangedCallback(e,s.writer(this.receiver[e]),r):this.invokeChangedCallback(e,s.writer(s.defaultValue),r)}invokeChangedCallbacksForDefaultValues(){for(const{key:e,name:t,defaultValue:r,writer:s}of this.valueDescriptors)void 0==r||this.controller.data.has(e)||this.invokeChangedCallback(t,s(r),void 0)}invokeChangedCallback(e,t,r){const s=`${e}Changed`;const n=this.receiver[s];if("function"==typeof n){const s=this.valueDescriptorNameMap[e];try{const e=s.reader(t);let i=r;r&&(i=s.reader(r));n.call(this.receiver,e,i)}catch(e){e instanceof TypeError&&(e.message=`Stimulus Value "${this.context.identifier}.${s.name}" - ${e.message}`);throw e}}}get valueDescriptors(){const{valueDescriptorMap:e}=this;return Object.keys(e).map((t=>e[t]))}get valueDescriptorNameMap(){const e={};Object.keys(this.valueDescriptorMap).forEach((t=>{const r=this.valueDescriptorMap[t];e[r.name]=r}));return e}hasValue(e){const t=this.valueDescriptorNameMap[e];const r=`has${capitalize(t.name)}`;return this.receiver[r]}}class TargetObserver{constructor(e,t){this.context=e;this.delegate=t;this.targetsByName=new Multimap}start(){if(!this.tokenListObserver){this.tokenListObserver=new TokenListObserver(this.element,this.attributeName,this);this.tokenListObserver.start()}}stop(){if(this.tokenListObserver){this.disconnectAllTargets();this.tokenListObserver.stop();delete this.tokenListObserver}}tokenMatched({element:e,content:t}){this.scope.containsElement(e)&&this.connectTarget(e,t)}tokenUnmatched({element:e,content:t}){this.disconnectTarget(e,t)}connectTarget(e,t){var r;if(!this.targetsByName.has(t,e)){this.targetsByName.add(t,e);null===(r=this.tokenListObserver)||void 0===r?void 0:r.pause((()=>this.delegate.targetConnected(e,t)))}}disconnectTarget(e,t){var r;if(this.targetsByName.has(t,e)){this.targetsByName.delete(t,e);null===(r=this.tokenListObserver)||void 0===r?void 0:r.pause((()=>this.delegate.targetDisconnected(e,t)))}}disconnectAllTargets(){for(const e of this.targetsByName.keys)for(const t of this.targetsByName.getValuesForKey(e))this.disconnectTarget(t,e)}get attributeName(){return`data-${this.context.identifier}-target`}get element(){return this.context.element}get scope(){return this.context.scope}}function readInheritableStaticArrayValues(e,t){const r=getAncestorsForConstructor(e);return Array.from(r.reduce(((e,r)=>{getOwnStaticArrayValues(r,t).forEach((t=>e.add(t)));return e}),new Set))}function readInheritableStaticObjectPairs(e,t){const r=getAncestorsForConstructor(e);return r.reduce(((e,r)=>{e.push(...getOwnStaticObjectPairs(r,t));return e}),[])}function getAncestorsForConstructor(e){const t=[];while(e){t.push(e);e=Object.getPrototypeOf(e)}return t.reverse()}function getOwnStaticArrayValues(e,t){const r=e[t];return Array.isArray(r)?r:[]}function getOwnStaticObjectPairs(e,t){const r=e[t];return r?Object.keys(r).map((e=>[e,r[e]])):[]}class OutletObserver{constructor(e,t){this.started=false;this.context=e;this.delegate=t;this.outletsByName=new Multimap;this.outletElementsByName=new Multimap;this.selectorObserverMap=new Map;this.attributeObserverMap=new Map}start(){if(!this.started){this.outletDefinitions.forEach((e=>{this.setupSelectorObserverForOutlet(e);this.setupAttributeObserverForOutlet(e)}));this.started=true;this.dependentContexts.forEach((e=>e.refresh()))}}refresh(){this.selectorObserverMap.forEach((e=>e.refresh()));this.attributeObserverMap.forEach((e=>e.refresh()))}stop(){if(this.started){this.started=false;this.disconnectAllOutlets();this.stopSelectorObservers();this.stopAttributeObservers()}}stopSelectorObservers(){if(this.selectorObserverMap.size>0){this.selectorObserverMap.forEach((e=>e.stop()));this.selectorObserverMap.clear()}}stopAttributeObservers(){if(this.attributeObserverMap.size>0){this.attributeObserverMap.forEach((e=>e.stop()));this.attributeObserverMap.clear()}}selectorMatched(e,t,{outletName:r}){const s=this.getOutlet(e,r);s&&this.connectOutlet(s,e,r)}selectorUnmatched(e,t,{outletName:r}){const s=this.getOutletFromMap(e,r);s&&this.disconnectOutlet(s,e,r)}selectorMatchElement(e,{outletName:t}){const r=this.selector(t);const s=this.hasOutlet(e,t);const n=e.matches(`[${this.schema.controllerAttribute}~=${t}]`);return!!r&&(s&&n&&e.matches(r))}elementMatchedAttribute(e,t){const r=this.getOutletNameFromOutletAttributeName(t);r&&this.updateSelectorObserverForOutlet(r)}elementAttributeValueChanged(e,t){const r=this.getOutletNameFromOutletAttributeName(t);r&&this.updateSelectorObserverForOutlet(r)}elementUnmatchedAttribute(e,t){const r=this.getOutletNameFromOutletAttributeName(t);r&&this.updateSelectorObserverForOutlet(r)}connectOutlet(e,t,r){var s;if(!this.outletElementsByName.has(r,t)){this.outletsByName.add(r,e);this.outletElementsByName.add(r,t);null===(s=this.selectorObserverMap.get(r))||void 0===s?void 0:s.pause((()=>this.delegate.outletConnected(e,t,r)))}}disconnectOutlet(e,t,r){var s;if(this.outletElementsByName.has(r,t)){this.outletsByName.delete(r,e);this.outletElementsByName.delete(r,t);null===(s=this.selectorObserverMap.get(r))||void 0===s?void 0:s.pause((()=>this.delegate.outletDisconnected(e,t,r)))}}disconnectAllOutlets(){for(const e of this.outletElementsByName.keys)for(const t of this.outletElementsByName.getValuesForKey(e))for(const r of this.outletsByName.getValuesForKey(e))this.disconnectOutlet(r,t,e)}updateSelectorObserverForOutlet(e){const t=this.selectorObserverMap.get(e);t&&(t.selector=this.selector(e))}setupSelectorObserverForOutlet(e){const t=this.selector(e);const r=new SelectorObserver(document.body,t,this,{outletName:e});this.selectorObserverMap.set(e,r);r.start()}setupAttributeObserverForOutlet(e){const t=this.attributeNameForOutletName(e);const r=new AttributeObserver(this.scope.element,t,this);this.attributeObserverMap.set(e,r);r.start()}selector(e){return this.scope.outlets.getSelectorForOutletName(e)}attributeNameForOutletName(e){return this.scope.schema.outletAttributeForScope(this.identifier,e)}getOutletNameFromOutletAttributeName(e){return this.outletDefinitions.find((t=>this.attributeNameForOutletName(t)===e))}get outletDependencies(){const e=new Multimap;this.router.modules.forEach((t=>{const r=t.definition.controllerConstructor;const s=readInheritableStaticArrayValues(r,"outlets");s.forEach((r=>e.add(r,t.identifier)))}));return e}get outletDefinitions(){return this.outletDependencies.getKeysForValue(this.identifier)}get dependentControllerIdentifiers(){return this.outletDependencies.getValuesForKey(this.identifier)}get dependentContexts(){const e=this.dependentControllerIdentifiers;return this.router.contexts.filter((t=>e.includes(t.identifier)))}hasOutlet(e,t){return!!this.getOutlet(e,t)||!!this.getOutletFromMap(e,t)}getOutlet(e,t){return this.application.getControllerForElementAndIdentifier(e,t)}getOutletFromMap(e,t){return this.outletsByName.getValuesForKey(t).find((t=>t.element===e))}get scope(){return this.context.scope}get schema(){return this.context.schema}get identifier(){return this.context.identifier}get application(){return this.context.application}get router(){return this.application.router}}class Context{constructor(e,t){this.logDebugActivity=(e,t={})=>{const{identifier:r,controller:s,element:n}=this;t=Object.assign({identifier:r,controller:s,element:n},t);this.application.logDebugActivity(this.identifier,e,t)};this.module=e;this.scope=t;this.controller=new e.controllerConstructor(this);this.bindingObserver=new BindingObserver(this,this.dispatcher);this.valueObserver=new ValueObserver(this,this.controller);this.targetObserver=new TargetObserver(this,this);this.outletObserver=new OutletObserver(this,this);try{this.controller.initialize();this.logDebugActivity("initialize")}catch(e){this.handleError(e,"initializing controller")}}connect(){this.bindingObserver.start();this.valueObserver.start();this.targetObserver.start();this.outletObserver.start();try{this.controller.connect();this.logDebugActivity("connect")}catch(e){this.handleError(e,"connecting controller")}}refresh(){this.outletObserver.refresh()}disconnect(){try{this.controller.disconnect();this.logDebugActivity("disconnect")}catch(e){this.handleError(e,"disconnecting controller")}this.outletObserver.stop();this.targetObserver.stop();this.valueObserver.stop();this.bindingObserver.stop()}get application(){return this.module.application}get identifier(){return this.module.identifier}get schema(){return this.application.schema}get dispatcher(){return this.application.dispatcher}get element(){return this.scope.element}get parentElement(){return this.element.parentElement}handleError(e,t,r={}){const{identifier:s,controller:n,element:i}=this;r=Object.assign({identifier:s,controller:n,element:i},r);this.application.handleError(e,`Error ${t}`,r)}targetConnected(e,t){this.invokeControllerMethod(`${t}TargetConnected`,e)}targetDisconnected(e,t){this.invokeControllerMethod(`${t}TargetDisconnected`,e)}outletConnected(e,t,r){this.invokeControllerMethod(`${namespaceCamelize(r)}OutletConnected`,e,t)}outletDisconnected(e,t,r){this.invokeControllerMethod(`${namespaceCamelize(r)}OutletDisconnected`,e,t)}invokeControllerMethod(e,...t){const r=this.controller;"function"==typeof r[e]&&r[e](...t)}}function bless(e){return shadow(e,getBlessedProperties(e))}function shadow(e,t){const r=i(e);const s=getShadowProperties(e.prototype,t);Object.defineProperties(r.prototype,s);return r}function getBlessedProperties(e){const t=readInheritableStaticArrayValues(e,"blessings");return t.reduce(((t,r)=>{const s=r(e);for(const e in s){const r=t[e]||{};t[e]=Object.assign(r,s[e])}return t}),{})}function getShadowProperties(e,t){return n(t).reduce(((r,s)=>{const n=getShadowedDescriptor(e,t,s);n&&Object.assign(r,{[s]:n});return r}),{})}function getShadowedDescriptor(e,t,r){const s=Object.getOwnPropertyDescriptor(e,r);const n=s&&"value"in s;if(!n){const e=Object.getOwnPropertyDescriptor(t,r).value;if(s){e.get=s.get||e.get;e.set=s.set||e.set}return e}}const n=(()=>"function"==typeof Object.getOwnPropertySymbols?e=>[...Object.getOwnPropertyNames(e),...Object.getOwnPropertySymbols(e)]:Object.getOwnPropertyNames)();const i=(()=>{function extendWithReflect(e){function extended(){return Reflect.construct(e,arguments,new.target)}extended.prototype=Object.create(e.prototype,{constructor:{value:extended}});Reflect.setPrototypeOf(extended,e);return extended}function testReflectExtension(){const a=function(){this.a.call(this)};const e=extendWithReflect(a);e.prototype.a=function(){};return new e}try{testReflectExtension();return extendWithReflect}catch(e){return e=>class extended extends e{}}})();function blessDefinition(e){return{identifier:e.identifier,controllerConstructor:bless(e.controllerConstructor)}}class Module{constructor(e,t){this.application=e;this.definition=blessDefinition(t);this.contextsByScope=new WeakMap;this.connectedContexts=new Set}get identifier(){return this.definition.identifier}get controllerConstructor(){return this.definition.controllerConstructor}get contexts(){return Array.from(this.connectedContexts)}connectContextForScope(e){const t=this.fetchContextForScope(e);this.connectedContexts.add(t);t.connect()}disconnectContextForScope(e){const t=this.contextsByScope.get(e);if(t){this.connectedContexts.delete(t);t.disconnect()}}fetchContextForScope(e){let t=this.contextsByScope.get(e);if(!t){t=new Context(this,e);this.contextsByScope.set(e,t)}return t}}class ClassMap{constructor(e){this.scope=e}has(e){return this.data.has(this.getDataKey(e))}get(e){return this.getAll(e)[0]}getAll(e){const t=this.data.get(this.getDataKey(e))||"";return tokenize(t)}getAttributeName(e){return this.data.getAttributeNameForKey(this.getDataKey(e))}getDataKey(e){return`${e}-class`}get data(){return this.scope.data}}class DataMap{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get(e){const t=this.getAttributeNameForKey(e);return this.element.getAttribute(t)}set(e,t){const r=this.getAttributeNameForKey(e);this.element.setAttribute(r,t);return this.get(e)}has(e){const t=this.getAttributeNameForKey(e);return this.element.hasAttribute(t)}delete(e){if(this.has(e)){const t=this.getAttributeNameForKey(e);this.element.removeAttribute(t);return true}return false}getAttributeNameForKey(e){return`data-${this.identifier}-${dasherize(e)}`}}class Guide{constructor(e){this.warnedKeysByObject=new WeakMap;this.logger=e}warn(e,t,r){let s=this.warnedKeysByObject.get(e);if(!s){s=new Set;this.warnedKeysByObject.set(e,s)}if(!s.has(t)){s.add(t);this.logger.warn(r,e)}}}function attributeValueContainsToken(e,t){return`[${e}~="${t}"]`}class TargetSet{constructor(e){this.scope=e}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findTarget(t)||this.findLegacyTarget(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllTargets(t),...this.findAllLegacyTargets(t)]),[])}findTarget(e){const t=this.getSelectorForTargetName(e);return this.scope.findElement(t)}findAllTargets(e){const t=this.getSelectorForTargetName(e);return this.scope.findAllElements(t)}getSelectorForTargetName(e){const t=this.schema.targetAttributeForScope(this.identifier);return attributeValueContainsToken(t,e)}findLegacyTarget(e){const t=this.getLegacySelectorForTargetName(e);return this.deprecate(this.scope.findElement(t),e)}findAllLegacyTargets(e){const t=this.getLegacySelectorForTargetName(e);return this.scope.findAllElements(t).map((t=>this.deprecate(t,e)))}getLegacySelectorForTargetName(e){const t=`${this.identifier}.${e}`;return attributeValueContainsToken(this.schema.targetAttribute,t)}deprecate(e,t){if(e){const{identifier:r}=this;const s=this.schema.targetAttribute;const n=this.schema.targetAttributeForScope(r);this.guide.warn(e,`target:${t}`,`Please replace ${s}="${r}.${t}" with ${n}="${t}". The ${s} attribute is deprecated and will be removed in a future version of Stimulus.`)}return e}get guide(){return this.scope.guide}}class OutletSet{constructor(e,t){this.scope=e;this.controllerElement=t}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get schema(){return this.scope.schema}has(e){return null!=this.find(e)}find(...e){return e.reduce(((e,t)=>e||this.findOutlet(t)),void 0)}findAll(...e){return e.reduce(((e,t)=>[...e,...this.findAllOutlets(t)]),[])}getSelectorForOutletName(e){const t=this.schema.outletAttributeForScope(this.identifier,e);return this.controllerElement.getAttribute(t)}findOutlet(e){const t=this.getSelectorForOutletName(e);if(t)return this.findElement(t,e)}findAllOutlets(e){const t=this.getSelectorForOutletName(e);return t?this.findAllElements(t,e):[]}findElement(e,t){const r=this.scope.queryElements(e);return r.filter((r=>this.matchesElement(r,e,t)))[0]}findAllElements(e,t){const r=this.scope.queryElements(e);return r.filter((r=>this.matchesElement(r,e,t)))}matchesElement(e,t,r){const s=e.getAttribute(this.scope.schema.controllerAttribute)||"";return e.matches(t)&&s.split(" ").includes(r)}}class Scope{constructor(e,t,r,s){this.targets=new TargetSet(this);this.classes=new ClassMap(this);this.data=new DataMap(this);this.containsElement=e=>e.closest(this.controllerSelector)===this.element;this.schema=e;this.element=t;this.identifier=r;this.guide=new Guide(s);this.outlets=new OutletSet(this.documentScope,t)}findElement(e){return this.element.matches(e)?this.element:this.queryElements(e).find(this.containsElement)}findAllElements(e){return[...this.element.matches(e)?[this.element]:[],...this.queryElements(e).filter(this.containsElement)]}queryElements(e){return Array.from(this.element.querySelectorAll(e))}get controllerSelector(){return attributeValueContainsToken(this.schema.controllerAttribute,this.identifier)}get isDocumentScope(){return this.element===document.documentElement}get documentScope(){return this.isDocumentScope?this:new Scope(this.schema,document.documentElement,this.identifier,this.guide.logger)}}class ScopeObserver{constructor(e,t,r){this.element=e;this.schema=t;this.delegate=r;this.valueListObserver=new ValueListObserver(this.element,this.controllerAttribute,this);this.scopesByIdentifierByElement=new WeakMap;this.scopeReferenceCounts=new WeakMap}start(){this.valueListObserver.start()}stop(){this.valueListObserver.stop()}get controllerAttribute(){return this.schema.controllerAttribute}parseValueForToken(e){const{element:t,content:r}=e;return this.parseValueForElementAndIdentifier(t,r)}parseValueForElementAndIdentifier(e,t){const r=this.fetchScopesByIdentifierForElement(e);let s=r.get(t);if(!s){s=this.delegate.createScopeForElementAndIdentifier(e,t);r.set(t,s)}return s}elementMatchedValue(e,t){const r=(this.scopeReferenceCounts.get(t)||0)+1;this.scopeReferenceCounts.set(t,r);1==r&&this.delegate.scopeConnected(t)}elementUnmatchedValue(e,t){const r=this.scopeReferenceCounts.get(t);if(r){this.scopeReferenceCounts.set(t,r-1);1==r&&this.delegate.scopeDisconnected(t)}}fetchScopesByIdentifierForElement(e){let t=this.scopesByIdentifierByElement.get(e);if(!t){t=new Map;this.scopesByIdentifierByElement.set(e,t)}return t}}class Router{constructor(e){this.application=e;this.scopeObserver=new ScopeObserver(this.element,this.schema,this);this.scopesByIdentifier=new Multimap;this.modulesByIdentifier=new Map}get element(){return this.application.element}get schema(){return this.application.schema}get logger(){return this.application.logger}get controllerAttribute(){return this.schema.controllerAttribute}get modules(){return Array.from(this.modulesByIdentifier.values())}get contexts(){return this.modules.reduce(((e,t)=>e.concat(t.contexts)),[])}start(){this.scopeObserver.start()}stop(){this.scopeObserver.stop()}loadDefinition(e){this.unloadIdentifier(e.identifier);const t=new Module(this.application,e);this.connectModule(t);const r=e.controllerConstructor.afterLoad;r&&r.call(e.controllerConstructor,e.identifier,this.application)}unloadIdentifier(e){const t=this.modulesByIdentifier.get(e);t&&this.disconnectModule(t)}getContextForElementAndIdentifier(e,t){const r=this.modulesByIdentifier.get(t);if(r)return r.contexts.find((t=>t.element==e))}proposeToConnectScopeForElementAndIdentifier(e,t){const r=this.scopeObserver.parseValueForElementAndIdentifier(e,t);r?this.scopeObserver.elementMatchedValue(r.element,r):console.error(`Couldn't find or create scope for identifier: "${t}" and element:`,e)}handleError(e,t,r){this.application.handleError(e,t,r)}createScopeForElementAndIdentifier(e,t){return new Scope(this.schema,e,t,this.logger)}scopeConnected(e){this.scopesByIdentifier.add(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.connectContextForScope(e)}scopeDisconnected(e){this.scopesByIdentifier.delete(e.identifier,e);const t=this.modulesByIdentifier.get(e.identifier);t&&t.disconnectContextForScope(e)}connectModule(e){this.modulesByIdentifier.set(e.identifier,e);const t=this.scopesByIdentifier.getValuesForKey(e.identifier);t.forEach((t=>e.connectContextForScope(t)))}disconnectModule(e){this.modulesByIdentifier.delete(e.identifier);const t=this.scopesByIdentifier.getValuesForKey(e.identifier);t.forEach((t=>e.disconnectContextForScope(t)))}}const o={controllerAttribute:"data-controller",actionAttribute:"data-action",targetAttribute:"data-target",targetAttributeForScope:e=>`data-${e}-target`,outletAttributeForScope:(e,t)=>`data-${e}-${t}-outlet`,keyMappings:Object.assign(Object.assign({enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End",page_up:"PageUp",page_down:"PageDown"},objectFromEntries("abcdefghijklmnopqrstuvwxyz".split("").map((e=>[e,e])))),objectFromEntries("0123456789".split("").map((e=>[e,e]))))};function objectFromEntries(e){return e.reduce(((e,[t,r])=>Object.assign(Object.assign({},e),{[t]:r})),{})}class Application{constructor(t=document.documentElement,r=o){this.logger=console;this.debug=false;this.logDebugActivity=(e,t,r={})=>{this.debug&&this.logFormattedMessage(e,t,r)};this.element=t;this.schema=r;this.dispatcher=new Dispatcher(this);this.router=new Router(this);this.actionDescriptorFilters=Object.assign({},e)}static start(e,t){const r=new this(e,t);r.start();return r}async start(){await domReady();this.logDebugActivity("application","starting");this.dispatcher.start();this.router.start();this.logDebugActivity("application","start")}stop(){this.logDebugActivity("application","stopping");this.dispatcher.stop();this.router.stop();this.logDebugActivity("application","stop")}register(e,t){this.load({identifier:e,controllerConstructor:t})}registerActionOption(e,t){this.actionDescriptorFilters[e]=t}load(e,...t){const r=Array.isArray(e)?e:[e,...t];r.forEach((e=>{e.controllerConstructor.shouldLoad&&this.router.loadDefinition(e)}))}unload(e,...t){const r=Array.isArray(e)?e:[e,...t];r.forEach((e=>this.router.unloadIdentifier(e)))}get controllers(){return this.router.contexts.map((e=>e.controller))}getControllerForElementAndIdentifier(e,t){const r=this.router.getContextForElementAndIdentifier(e,t);return r?r.controller:null}handleError(e,t,r){var s;this.logger.error("%s\n\n%o\n\n%o",t,e,r);null===(s=window.onerror)||void 0===s?void 0:s.call(window,t,"",0,0,e)}logFormattedMessage(e,t,r={}){r=Object.assign({application:this},r);this.logger.groupCollapsed(`${e} #${t}`);this.logger.log("details:",Object.assign({},r));this.logger.groupEnd()}}function domReady(){return new Promise((e=>{"loading"==document.readyState?document.addEventListener("DOMContentLoaded",(()=>e())):e()}))}function ClassPropertiesBlessing(e){const t=readInheritableStaticArrayValues(e,"classes");return t.reduce(((e,t)=>Object.assign(e,propertiesForClassDefinition(t))),{})}function propertiesForClassDefinition(e){return{[`${e}Class`]:{get(){const{classes:t}=this;if(t.has(e))return t.get(e);{const r=t.getAttributeName(e);throw new Error(`Missing attribute "${r}"`)}}},[`${e}Classes`]:{get(){return this.classes.getAll(e)}},[`has${capitalize(e)}Class`]:{get(){return this.classes.has(e)}}}}function OutletPropertiesBlessing(e){const t=readInheritableStaticArrayValues(e,"outlets");return t.reduce(((e,t)=>Object.assign(e,propertiesForOutletDefinition(t))),{})}function getOutletController(e,t,r){return e.application.getControllerForElementAndIdentifier(t,r)}function getControllerAndEnsureConnectedScope(e,t,r){let s=getOutletController(e,t,r);if(s)return s;e.application.router.proposeToConnectScopeForElementAndIdentifier(t,r);s=getOutletController(e,t,r);return s||void 0}function propertiesForOutletDefinition(e){const t=namespaceCamelize(e);return{[`${t}Outlet`]:{get(){const t=this.outlets.find(e);const r=this.outlets.getSelectorForOutletName(e);if(t){const r=getControllerAndEnsureConnectedScope(this,t,e);if(r)return r;throw new Error(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`)}throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${r}".`)}},[`${t}Outlets`]:{get(){const t=this.outlets.findAll(e);return t.length>0?t.map((t=>{const r=getControllerAndEnsureConnectedScope(this,t,e);if(r)return r;console.warn(`The provided outlet element is missing an outlet controller "${e}" instance for host controller "${this.identifier}"`,t)})).filter((e=>e)):[]}},[`${t}OutletElement`]:{get(){const t=this.outlets.find(e);const r=this.outlets.getSelectorForOutletName(e);if(t)return t;throw new Error(`Missing outlet element "${e}" for host controller "${this.identifier}". Stimulus couldn't find a matching outlet element using selector "${r}".`)}},[`${t}OutletElements`]:{get(){return this.outlets.findAll(e)}},[`has${capitalize(t)}Outlet`]:{get(){return this.outlets.has(e)}}}}function TargetPropertiesBlessing(e){const t=readInheritableStaticArrayValues(e,"targets");return t.reduce(((e,t)=>Object.assign(e,propertiesForTargetDefinition(t))),{})}function propertiesForTargetDefinition(e){return{[`${e}Target`]:{get(){const t=this.targets.find(e);if(t)return t;throw new Error(`Missing target element "${e}" for "${this.identifier}" controller`)}},[`${e}Targets`]:{get(){return this.targets.findAll(e)}},[`has${capitalize(e)}Target`]:{get(){return this.targets.has(e)}}}}function ValuePropertiesBlessing(e){const t=readInheritableStaticObjectPairs(e,"values");const r={valueDescriptorMap:{get(){return t.reduce(((e,t)=>{const r=parseValueDefinitionPair(t,this.identifier);const s=this.data.getAttributeNameForKey(r.key);return Object.assign(e,{[s]:r})}),{})}}};return t.reduce(((e,t)=>Object.assign(e,propertiesForValueDefinitionPair(t))),r)}function propertiesForValueDefinitionPair(e,t){const r=parseValueDefinitionPair(e,t);const{key:s,name:n,reader:i,writer:o}=r;return{[n]:{get(){const e=this.data.get(s);return null!==e?i(e):r.defaultValue},set(e){void 0===e?this.data.delete(s):this.data.set(s,o(e))}},[`has${capitalize(n)}`]:{get(){return this.data.has(s)||r.hasCustomDefaultValue}}}}function parseValueDefinitionPair([e,t],r){return valueDescriptorForTokenAndTypeDefinition({controller:r,token:e,typeDefinition:t})}function parseValueTypeConstant(e){switch(e){case Array:return"array";case Boolean:return"boolean";case Number:return"number";case Object:return"object";case String:return"string"}}function parseValueTypeDefault(e){switch(typeof e){case"boolean":return"boolean";case"number":return"number";case"string":return"string"}return Array.isArray(e)?"array":"[object Object]"===Object.prototype.toString.call(e)?"object":void 0}function parseValueTypeObject(e){const{controller:t,token:r,typeObject:s}=e;const n=isSomething(s.type);const i=isSomething(s.default);const o=n&&i;const c=n&&!i;const l=!n&&i;const h=parseValueTypeConstant(s.type);const u=parseValueTypeDefault(e.typeObject.default);if(c)return h;if(l)return u;if(h!==u){const e=t?`${t}.${r}`:r;throw new Error(`The specified default value for the Stimulus Value "${e}" must match the defined type "${h}". The provided default value of "${s.default}" is of type "${u}".`)}return o?h:void 0}function parseValueTypeDefinition(e){const{controller:t,token:r,typeDefinition:s}=e;const n={controller:t,token:r,typeObject:s};const i=parseValueTypeObject(n);const o=parseValueTypeDefault(s);const c=parseValueTypeConstant(s);const l=i||o||c;if(l)return l;const h=t?`${t}.${s}`:r;throw new Error(`Unknown value type "${h}" for "${r}" value`)}function defaultValueForDefinition(e){const t=parseValueTypeConstant(e);if(t)return c[t];const r=hasProperty(e,"default");const s=hasProperty(e,"type");const n=e;if(r)return n.default;if(s){const{type:e}=n;const t=parseValueTypeConstant(e);if(t)return c[t]}return e}function valueDescriptorForTokenAndTypeDefinition(e){const{token:t,typeDefinition:r}=e;const s=`${dasherize(t)}-value`;const n=parseValueTypeDefinition(e);return{type:n,key:s,name:camelize(s),get defaultValue(){return defaultValueForDefinition(r)},get hasCustomDefaultValue(){return void 0!==parseValueTypeDefault(r)},reader:l[n],writer:h[n]||h.default}}const c={get array(){return[]},boolean:false,number:0,get object(){return{}},string:""};const l={array(e){const t=JSON.parse(e);if(!Array.isArray(t))throw new TypeError(`expected value of type "array" but instead got value "${e}" of type "${parseValueTypeDefault(t)}"`);return t},boolean(e){return!("0"==e||"false"==String(e).toLowerCase())},number(e){return Number(e.replace(/_/g,""))},object(e){const t=JSON.parse(e);if(null===t||"object"!=typeof t||Array.isArray(t))throw new TypeError(`expected value of type "object" but instead got value "${e}" of type "${parseValueTypeDefault(t)}"`);return t},string(e){return e}};const h={default:writeString,array:writeJSON,object:writeJSON};function writeJSON(e){return JSON.stringify(e)}function writeString(e){return`${e}`}class Controller{constructor(e){this.context=e}static get shouldLoad(){return true}static afterLoad(e,t){}get application(){return this.context.application}get scope(){return this.context.scope}get element(){return this.scope.element}get identifier(){return this.scope.identifier}get targets(){return this.scope.targets}get outlets(){return this.scope.outlets}get classes(){return this.scope.classes}get data(){return this.scope.data}initialize(){}connect(){}disconnect(){}dispatch(e,{target:t=this.element,detail:r={},prefix:s=this.identifier,bubbles:n=true,cancelable:i=true}={}){const o=s?`${s}:${e}`:e;const c=new CustomEvent(o,{detail:r,bubbles:n,cancelable:i});t.dispatchEvent(c);return c}}Controller.blessings=[ClassPropertiesBlessing,TargetPropertiesBlessing,ValuePropertiesBlessing,OutletPropertiesBlessing];Controller.targets=[];Controller.outlets=[];Controller.values={};export{Application,AttributeObserver,Context,Controller,ElementObserver,IndexedMultimap,Multimap,SelectorObserver,StringMapObserver,TokenListObserver,ValueListObserver,add,o as defaultSchema,del,fetch,prune};
2
+