isomorfeus-preact 10.9.0 → 22.9.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (263) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +14 -3
  3. data/README.md +23 -39
  4. data/lib/browser/delegate_native.rb +94 -72
  5. data/lib/browser/document.rb +38 -0
  6. data/lib/browser/element.rb +160 -176
  7. data/lib/browser/event.rb +99 -94
  8. data/lib/browser/history.rb +40 -20
  9. data/lib/browser/location.rb +59 -0
  10. data/lib/browser/window.rb +58 -0
  11. data/lib/data_uri/open_uri.rb +18 -0
  12. data/lib/data_uri/uri.rb +61 -0
  13. data/lib/data_uri.rb +4 -0
  14. data/lib/isomorfeus/preact/config.rb +42 -54
  15. data/lib/isomorfeus/preact/imports.rb +5 -20
  16. data/lib/isomorfeus/preact/ssr.rb +34 -0
  17. data/lib/isomorfeus/preact/thread_local_component_cache.rb +9 -11
  18. data/lib/isomorfeus/preact/version.rb +5 -0
  19. data/lib/isomorfeus/preact/view_helper.rb +72 -0
  20. data/lib/isomorfeus/props/validator.rb +19 -11
  21. data/lib/isomorfeus/top_level.rb +55 -33
  22. data/lib/isomorfeus-preact.rb +78 -103
  23. data/lib/link.rb +52 -0
  24. data/lib/lucid_app.rb +117 -0
  25. data/lib/lucid_component.rb +154 -0
  26. data/lib/nano_css.rb +282 -465
  27. data/lib/preact/component.rb +222 -0
  28. data/lib/preact/component_resolution.rb +49 -83
  29. data/lib/preact/context.rb +68 -0
  30. data/lib/preact/elements.rb +2 -9
  31. data/lib/preact/module_component_resolution.rb +50 -0
  32. data/lib/preact/prop_declaration_mixin.rb +73 -0
  33. data/lib/preact.rb +1548 -257
  34. data/lib/redirect.rb +34 -0
  35. data/lib/route.rb +15 -0
  36. data/lib/router.rb +145 -0
  37. data/lib/switch.rb +70 -0
  38. metadata +42 -309
  39. data/lib/isomorfeus/preact/memcached_component_cache.rb +0 -19
  40. data/lib/isomorfeus/preact/redis_component_cache.rb +0 -19
  41. data/lib/isomorfeus/preact/ssr/history.rb +0 -23
  42. data/lib/isomorfeus/preact/ssr/render_core.rb +0 -117
  43. data/lib/isomorfeus/preact/ssr/top_level.rb +0 -37
  44. data/lib/isomorfeus/preact_view_helper.rb +0 -129
  45. data/lib/isomorfeus_preact/lucid_app/api.rb +0 -38
  46. data/lib/isomorfeus_preact/lucid_app/base.rb +0 -7
  47. data/lib/isomorfeus_preact/lucid_app/mixin.rb +0 -14
  48. data/lib/isomorfeus_preact/lucid_app/native_component_constructor.rb +0 -101
  49. data/lib/isomorfeus_preact/lucid_component/api.rb +0 -123
  50. data/lib/isomorfeus_preact/lucid_component/app_store_proxy.rb +0 -32
  51. data/lib/isomorfeus_preact/lucid_component/base.rb +0 -7
  52. data/lib/isomorfeus_preact/lucid_component/class_store_proxy.rb +0 -37
  53. data/lib/isomorfeus_preact/lucid_component/initializer.rb +0 -9
  54. data/lib/isomorfeus_preact/lucid_component/mixin.rb +0 -13
  55. data/lib/isomorfeus_preact/lucid_component/native_component_constructor.rb +0 -87
  56. data/lib/isomorfeus_preact/lucid_component/styles_wrapper.rb +0 -40
  57. data/lib/isomorfeus_preact/lucid_func/base.rb +0 -7
  58. data/lib/isomorfeus_preact/lucid_func/initializer.rb +0 -8
  59. data/lib/isomorfeus_preact/lucid_func/mixin.rb +0 -10
  60. data/lib/isomorfeus_preact/lucid_func/native_component_constructor.rb +0 -56
  61. data/lib/isomorfeus_preact/preact/function_component/api.rb +0 -164
  62. data/lib/isomorfeus_preact/preact/function_component/base.rb +0 -7
  63. data/lib/isomorfeus_preact/preact/function_component/initializer.rb +0 -6
  64. data/lib/isomorfeus_preact/preact/function_component/mixin.rb +0 -8
  65. data/lib/isomorfeus_preact/preact/function_component/native_component_constructor.rb +0 -47
  66. data/lib/lucid_app/context.rb +0 -24
  67. data/lib/lucid_prop_declaration/mixin.rb +0 -126
  68. data/lib/preact/component/api.rb +0 -137
  69. data/lib/preact/component/base.rb +0 -7
  70. data/lib/preact/component/callbacks.rb +0 -111
  71. data/lib/preact/component/initializer.rb +0 -7
  72. data/lib/preact/component/mixin.rb +0 -11
  73. data/lib/preact/component/native_component_constructor.rb +0 -77
  74. data/lib/preact/context_wrapper.rb +0 -48
  75. data/lib/preact/native_constant_wrapper.rb +0 -29
  76. data/lib/preact/option_hooks.rb +0 -98
  77. data/lib/preact/params.rb +0 -16
  78. data/lib/preact/props.rb +0 -69
  79. data/lib/preact/ref.rb +0 -17
  80. data/lib/preact/state.rb +0 -87
  81. data/lib/preact/version.rb +0 -3
  82. data/node_modules/.package-lock.json +0 -38
  83. data/node_modules/preact/LICENSE +0 -21
  84. data/node_modules/preact/README.md +0 -188
  85. data/node_modules/preact/compat/LICENSE +0 -21
  86. data/node_modules/preact/compat/client.js +0 -19
  87. data/node_modules/preact/compat/client.mjs +0 -17
  88. data/node_modules/preact/compat/dist/compat.js +0 -2
  89. data/node_modules/preact/compat/dist/compat.js.map +0 -1
  90. data/node_modules/preact/compat/dist/compat.mjs +0 -2
  91. data/node_modules/preact/compat/dist/compat.module.js +0 -2
  92. data/node_modules/preact/compat/dist/compat.module.js.map +0 -1
  93. data/node_modules/preact/compat/dist/compat.umd.js +0 -2
  94. data/node_modules/preact/compat/dist/compat.umd.js.map +0 -1
  95. data/node_modules/preact/compat/jsx-dev-runtime.js +0 -3
  96. data/node_modules/preact/compat/jsx-dev-runtime.mjs +0 -3
  97. data/node_modules/preact/compat/jsx-runtime.js +0 -3
  98. data/node_modules/preact/compat/jsx-runtime.mjs +0 -3
  99. data/node_modules/preact/compat/package.json +0 -49
  100. data/node_modules/preact/compat/scheduler.js +0 -15
  101. data/node_modules/preact/compat/scheduler.mjs +0 -23
  102. data/node_modules/preact/compat/server.browser.js +0 -4
  103. data/node_modules/preact/compat/server.js +0 -15
  104. data/node_modules/preact/compat/server.mjs +0 -4
  105. data/node_modules/preact/compat/src/Children.js +0 -21
  106. data/node_modules/preact/compat/src/PureComponent.js +0 -15
  107. data/node_modules/preact/compat/src/forwardRef.js +0 -44
  108. data/node_modules/preact/compat/src/index.d.ts +0 -164
  109. data/node_modules/preact/compat/src/index.js +0 -223
  110. data/node_modules/preact/compat/src/internal.d.ts +0 -47
  111. data/node_modules/preact/compat/src/memo.js +0 -34
  112. data/node_modules/preact/compat/src/portals.js +0 -82
  113. data/node_modules/preact/compat/src/render.js +0 -238
  114. data/node_modules/preact/compat/src/suspense-list.d.ts +0 -14
  115. data/node_modules/preact/compat/src/suspense-list.js +0 -126
  116. data/node_modules/preact/compat/src/suspense.d.ts +0 -15
  117. data/node_modules/preact/compat/src/suspense.js +0 -270
  118. data/node_modules/preact/compat/src/util.js +0 -28
  119. data/node_modules/preact/compat/test-utils.js +0 -1
  120. data/node_modules/preact/debug/LICENSE +0 -21
  121. data/node_modules/preact/debug/dist/debug.js +0 -2
  122. data/node_modules/preact/debug/dist/debug.js.map +0 -1
  123. data/node_modules/preact/debug/dist/debug.mjs +0 -2
  124. data/node_modules/preact/debug/dist/debug.module.js +0 -2
  125. data/node_modules/preact/debug/dist/debug.module.js.map +0 -1
  126. data/node_modules/preact/debug/dist/debug.umd.js +0 -2
  127. data/node_modules/preact/debug/dist/debug.umd.js.map +0 -1
  128. data/node_modules/preact/debug/package.json +0 -26
  129. data/node_modules/preact/debug/src/check-props.js +0 -54
  130. data/node_modules/preact/debug/src/component-stack.js +0 -146
  131. data/node_modules/preact/debug/src/constants.js +0 -3
  132. data/node_modules/preact/debug/src/debug.js +0 -437
  133. data/node_modules/preact/debug/src/index.js +0 -6
  134. data/node_modules/preact/debug/src/internal.d.ts +0 -82
  135. data/node_modules/preact/debug/src/util.js +0 -11
  136. data/node_modules/preact/devtools/LICENSE +0 -21
  137. data/node_modules/preact/devtools/dist/devtools.js +0 -2
  138. data/node_modules/preact/devtools/dist/devtools.js.map +0 -1
  139. data/node_modules/preact/devtools/dist/devtools.mjs +0 -2
  140. data/node_modules/preact/devtools/dist/devtools.module.js +0 -2
  141. data/node_modules/preact/devtools/dist/devtools.module.js.map +0 -1
  142. data/node_modules/preact/devtools/dist/devtools.umd.js +0 -2
  143. data/node_modules/preact/devtools/dist/devtools.umd.js.map +0 -1
  144. data/node_modules/preact/devtools/package.json +0 -25
  145. data/node_modules/preact/devtools/src/devtools.js +0 -10
  146. data/node_modules/preact/devtools/src/index.d.ts +0 -8
  147. data/node_modules/preact/devtools/src/index.js +0 -15
  148. data/node_modules/preact/dist/preact.js +0 -2
  149. data/node_modules/preact/dist/preact.js.map +0 -1
  150. data/node_modules/preact/dist/preact.min.js +0 -2
  151. data/node_modules/preact/dist/preact.min.js.map +0 -1
  152. data/node_modules/preact/dist/preact.mjs +0 -2
  153. data/node_modules/preact/dist/preact.module.js +0 -2
  154. data/node_modules/preact/dist/preact.module.js.map +0 -1
  155. data/node_modules/preact/dist/preact.umd.js +0 -2
  156. data/node_modules/preact/dist/preact.umd.js.map +0 -1
  157. data/node_modules/preact/hooks/LICENSE +0 -21
  158. data/node_modules/preact/hooks/dist/hooks.js +0 -2
  159. data/node_modules/preact/hooks/dist/hooks.js.map +0 -1
  160. data/node_modules/preact/hooks/dist/hooks.mjs +0 -2
  161. data/node_modules/preact/hooks/dist/hooks.module.js +0 -2
  162. data/node_modules/preact/hooks/dist/hooks.module.js.map +0 -1
  163. data/node_modules/preact/hooks/dist/hooks.umd.js +0 -2
  164. data/node_modules/preact/hooks/dist/hooks.umd.js.map +0 -1
  165. data/node_modules/preact/hooks/package.json +0 -35
  166. data/node_modules/preact/hooks/src/index.d.ts +0 -139
  167. data/node_modules/preact/hooks/src/index.js +0 -417
  168. data/node_modules/preact/hooks/src/internal.d.ts +0 -78
  169. data/node_modules/preact/jsx-runtime/LICENSE +0 -21
  170. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.js +0 -2
  171. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.js.map +0 -1
  172. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs +0 -2
  173. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js +0 -2
  174. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js.map +0 -1
  175. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js +0 -2
  176. data/node_modules/preact/jsx-runtime/dist/jsxRuntime.umd.js.map +0 -1
  177. data/node_modules/preact/jsx-runtime/package.json +0 -28
  178. data/node_modules/preact/jsx-runtime/src/index.d.ts +0 -50
  179. data/node_modules/preact/jsx-runtime/src/index.js +0 -77
  180. data/node_modules/preact/package.json +0 -304
  181. data/node_modules/preact/src/cjs.js +0 -3
  182. data/node_modules/preact/src/clone-element.js +0 -34
  183. data/node_modules/preact/src/component.js +0 -225
  184. data/node_modules/preact/src/constants.js +0 -3
  185. data/node_modules/preact/src/create-context.js +0 -68
  186. data/node_modules/preact/src/create-element.js +0 -98
  187. data/node_modules/preact/src/diff/catch-error.js +0 -40
  188. data/node_modules/preact/src/diff/children.js +0 -335
  189. data/node_modules/preact/src/diff/index.js +0 -533
  190. data/node_modules/preact/src/diff/props.js +0 -158
  191. data/node_modules/preact/src/index.d.ts +0 -317
  192. data/node_modules/preact/src/index.js +0 -13
  193. data/node_modules/preact/src/internal.d.ts +0 -155
  194. data/node_modules/preact/src/jsx.d.ts +0 -1014
  195. data/node_modules/preact/src/options.js +0 -16
  196. data/node_modules/preact/src/render.js +0 -75
  197. data/node_modules/preact/src/util.js +0 -27
  198. data/node_modules/preact/test-utils/dist/testUtils.js +0 -2
  199. data/node_modules/preact/test-utils/dist/testUtils.js.map +0 -1
  200. data/node_modules/preact/test-utils/dist/testUtils.mjs +0 -2
  201. data/node_modules/preact/test-utils/dist/testUtils.module.js +0 -2
  202. data/node_modules/preact/test-utils/dist/testUtils.module.js.map +0 -1
  203. data/node_modules/preact/test-utils/dist/testUtils.umd.js +0 -2
  204. data/node_modules/preact/test-utils/dist/testUtils.umd.js.map +0 -1
  205. data/node_modules/preact/test-utils/package.json +0 -28
  206. data/node_modules/preact/test-utils/src/index.d.ts +0 -3
  207. data/node_modules/preact/test-utils/src/index.js +0 -118
  208. data/node_modules/preact-render-to-string/LICENSE +0 -21
  209. data/node_modules/preact-render-to-string/README.md +0 -102
  210. data/node_modules/preact-render-to-string/dist/commonjs.js +0 -2
  211. data/node_modules/preact-render-to-string/dist/commonjs.js.map +0 -1
  212. data/node_modules/preact-render-to-string/dist/index.d.ts +0 -16
  213. data/node_modules/preact-render-to-string/dist/index.js +0 -1
  214. data/node_modules/preact-render-to-string/dist/index.js.map +0 -1
  215. data/node_modules/preact-render-to-string/dist/index.mjs +0 -2
  216. data/node_modules/preact-render-to-string/dist/index.module.js +0 -2
  217. data/node_modules/preact-render-to-string/dist/index.module.js.map +0 -1
  218. data/node_modules/preact-render-to-string/dist/jsx-entry.js +0 -2
  219. data/node_modules/preact-render-to-string/dist/jsx-entry.js.map +0 -1
  220. data/node_modules/preact-render-to-string/dist/jsx.d.ts +0 -13
  221. data/node_modules/preact-render-to-string/dist/jsx.js +0 -1
  222. data/node_modules/preact-render-to-string/dist/jsx.js.map +0 -1
  223. data/node_modules/preact-render-to-string/dist/jsx.mjs +0 -2
  224. data/node_modules/preact-render-to-string/dist/jsx.modern.js +0 -2
  225. data/node_modules/preact-render-to-string/dist/jsx.modern.js.map +0 -1
  226. data/node_modules/preact-render-to-string/dist/jsx.module.js +0 -2
  227. data/node_modules/preact-render-to-string/dist/jsx.module.js.map +0 -1
  228. data/node_modules/preact-render-to-string/dist/preact-render-to-string-tests.d.ts +0 -1
  229. data/node_modules/preact-render-to-string/jsx.js +0 -1
  230. data/node_modules/preact-render-to-string/package.json +0 -142
  231. data/node_modules/preact-render-to-string/src/index.d.ts +0 -16
  232. data/node_modules/preact-render-to-string/src/index.js +0 -462
  233. data/node_modules/preact-render-to-string/src/jsx.d.ts +0 -13
  234. data/node_modules/preact-render-to-string/src/jsx.js +0 -76
  235. data/node_modules/preact-render-to-string/src/polyfills.js +0 -8
  236. data/node_modules/preact-render-to-string/src/preact-render-to-string-tests.d.ts +0 -1
  237. data/node_modules/preact-render-to-string/src/util.js +0 -78
  238. data/node_modules/preact-render-to-string/typings.json +0 -5
  239. data/node_modules/pretty-format/.npmignore +0 -3
  240. data/node_modules/pretty-format/LICENSE.md +0 -15
  241. data/node_modules/pretty-format/README.md +0 -94
  242. data/node_modules/pretty-format/index.js +0 -343
  243. data/node_modules/pretty-format/package.json +0 -26
  244. data/node_modules/pretty-format/plugins/ReactElement.js +0 -74
  245. data/node_modules/pretty-format/plugins/ReactTestComponent.js +0 -58
  246. data/node_modules/pretty-format/printString.js +0 -7
  247. data/node_modules/wouter-preact/cjs/index.js +0 -180
  248. data/node_modules/wouter-preact/cjs/matcher.js +0 -72
  249. data/node_modules/wouter-preact/cjs/package.json +0 -1
  250. data/node_modules/wouter-preact/cjs/react-deps.js +0 -75
  251. data/node_modules/wouter-preact/cjs/static-location.js +0 -21
  252. data/node_modules/wouter-preact/cjs/use-location.js +0 -94
  253. data/node_modules/wouter-preact/index.d.ts +0 -110
  254. data/node_modules/wouter-preact/index.js +0 -178
  255. data/node_modules/wouter-preact/matcher.d.ts +0 -30
  256. data/node_modules/wouter-preact/matcher.js +0 -66
  257. data/node_modules/wouter-preact/package.json +0 -33
  258. data/node_modules/wouter-preact/react-deps.js +0 -15
  259. data/node_modules/wouter-preact/static-location.d.ts +0 -16
  260. data/node_modules/wouter-preact/static-location.js +0 -17
  261. data/node_modules/wouter-preact/use-location.d.ts +0 -43
  262. data/node_modules/wouter-preact/use-location.js +0 -86
  263. data/package.json +0 -8
data/lib/redirect.rb ADDED
@@ -0,0 +1,34 @@
1
+ class Redirect < Preact::Component
2
+ EVENT_PUSH_STATE = "pushState"
3
+ EVENT_REPLACE_STATE = "replaceState"
4
+
5
+ def initialize(props, context)
6
+ super(props, context)
7
+ if RUBY_ENGINE == 'opal'
8
+ @history = if `typeof window !== "undefined"`
9
+ `window.history`
10
+ else
11
+ `{ length: 1, state: null, scrollRestoration: "auto", pushState: function(e,t,n){}, replaceState: function(e,t,n){} }`
12
+ end
13
+ @base = ''
14
+ end
15
+ end
16
+
17
+ def navigate
18
+ if RUBY_ENGINE == 'opal'
19
+ to = props[:to] || props[:href]
20
+ m = props[:replace] ? EVENT_REPLACE_STATE : EVENT_PUSH_STATE
21
+ `#@history[m](null, "", to[0] === "~" ? to.slice(1) : #@base + to)`
22
+ context[:router][:callback].call if context[:router].key?(:callback)
23
+ end
24
+ end
25
+
26
+ render do
27
+ if RUBY_ENGINE == 'opal'
28
+ @base = context[:router][:base] if context[:router].key?(:base)
29
+ navigate
30
+ end
31
+ nil
32
+ end
33
+ end
34
+ Redirect.context_type = RouterContext
data/lib/route.rb ADDED
@@ -0,0 +1,15 @@
1
+ class Route < Preact::Component
2
+ render do
3
+ route_match = @context[:router][:matcher].call(props[:path], @context[:location])
4
+ matches, params = props[:match] || route_match
5
+ return unless matches
6
+ component = props[:component]
7
+ if component
8
+ component = component.constantize if component.is_a?(String)
9
+ Preact.create_element(component, { params: params })
10
+ else
11
+ props[:children]
12
+ end
13
+ end
14
+ end
15
+ Route.context_type = RouterContext
data/lib/router.rb ADDED
@@ -0,0 +1,145 @@
1
+ class Router < Preact::Component
2
+ EVENT_POP_STATE = "popstate"
3
+ EVENT_PUSH_STATE = "pushState"
4
+ EVENT_REPLACE_STATE = "replaceState"
5
+ EVENTS = [EVENT_POP_STATE, EVENT_PUSH_STATE, EVENT_REPLACE_STATE]
6
+
7
+ def initialize(props, context)
8
+ super(props, context)
9
+ @state = { update: 0 }
10
+ @router = nil
11
+ if RUBY_ENGINE == 'opal'
12
+ @browser = `typeof window !== "undefined"` ? true : false
13
+ rtr = self
14
+ @check_for_updates_n = `function() { #{rtr.call(:check_for_updates).call}; }`
15
+ else
16
+ @browser = false
17
+ end
18
+ @rbase = nil
19
+ @original_location = nil
20
+ @prev_hash = nil
21
+ end
22
+
23
+ def build_router(props, values)
24
+ { base: "",
25
+ matcher: make_matcher(),
26
+ original_location: "/",
27
+ callback: call(:check_for_updates)
28
+ }.merge(props, values)
29
+ end
30
+
31
+ def check_for_updates
32
+ pathname = @browser ? current_pathname(@rbase) : current_pathname(@rbase, @original_location)
33
+ search = @browser ? `location.search` : ""
34
+ hash = pathname + search;
35
+ if @prev_hash != hash
36
+ @prev_hash = hash
37
+ set_state({ update: state[:update] + 1 })
38
+ end
39
+ end
40
+
41
+ def current_pathname(base, path)
42
+ unless path
43
+ path = @browser ? `location.pathname` : ""
44
+ end
45
+ base = "" unless base
46
+ path.downcase.start_with?(base.downcase) ? (path[base.size..-1] || "/") : "~" + path
47
+ end
48
+
49
+ def escape_rx(str)
50
+ str.gsub(/([.+*?=^!:${}()\[\]\|\/\\])/, "\\1")
51
+ end
52
+
53
+ # returns a segment representation in Regexp based on flags
54
+ # adapted and simplified version from path-to-regexp sources
55
+ def rx_for_segment(repeat, optional, prefix)
56
+ capture = repeat ? "((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*)" : "([^\\/]+?)"
57
+ capture = "(?:\\/" + capture + ")" if (optional && prefix)
58
+ capture + (optional ? "?" : "")
59
+ end
60
+
61
+ def path_to_regexp(pattern)
62
+ group_rx = /:([A-Za-z0-9_]+)([?+*]?)/
63
+
64
+ pos = 0
65
+ keys = []
66
+ result = ""
67
+
68
+ while (match = group_rx.match(pattern, pos))
69
+ mod = match[2]
70
+ segment = match[1]
71
+
72
+ # :foo [1] ( )
73
+ # :foo? [0 - 1] ( o)
74
+ # :foo+ [1 - ∞] (r )
75
+ # :foo* [0 - ∞] (ro)
76
+ repeat = mod === "+" || mod === "*"
77
+ optional = mod === "?" || mod === "*"
78
+ prefix = optional && pattern[match.begin(0) - 1] == "/" ? 1 : 0
79
+
80
+ prev = pattern[pos...(match.begin(0) - prefix)]
81
+ keys.push({ name: segment.to_sym })
82
+ pos = match.end(0)
83
+ if RUBY_ENGINE == 'opal'
84
+ result += "#{escape_rx(prev)}#{rx_for_segment(repeat, optional, prefix)}"
85
+ else
86
+ result << "#{escape_rx(prev)}#{rx_for_segment(repeat, optional, prefix)}"
87
+ end
88
+ end
89
+
90
+ if RUBY_ENGINE == 'opal'
91
+ result += escape_rx(pattern[pos..-1])
92
+ else
93
+ result << escape_rx(pattern[pos..-1])
94
+ end
95
+ [ Regexp.new("^" + result + "(?:\\/)?$", Regexp::IGNORECASE), keys]
96
+ end
97
+
98
+ def get_regexp(cache, pattern)
99
+ # obtains a cached regexp version of the pattern
100
+ cache[pattern] || (cache[pattern] = path_to_regexp(pattern))
101
+ end
102
+
103
+ def make_matcher
104
+ cache = {}
105
+
106
+ proc do |pattern, path|
107
+ regexp, keys = get_regexp(cache, pattern || "")
108
+ out = regexp.match(path)
109
+ if !out
110
+ [false, nil]
111
+ else
112
+ # formats an object with matched params
113
+ i = 0
114
+ params = keys.reduce({}) do |p, key|
115
+ p[key[:name]] = out[i += 1]
116
+ p
117
+ end
118
+ [true, params]
119
+ end
120
+ end
121
+ end
122
+
123
+ render do
124
+ @router = build_router(props, { original_location: @context[:iso_location] }) if !@router
125
+ @rbase = @router[:base]
126
+ @original_location = @router[:original_location]
127
+ loc = @browser ? current_pathname(@rbase) : current_pathname(@rbase, @original_location)
128
+ @prev_hash = @browser ? loc + `location.search` : loc
129
+ Preact.create_element(RouterContext.Provider, { value: { router: @router, location: loc }, children: props[:children] })
130
+ end
131
+
132
+ component_did_mount do
133
+ EVENTS.each do |event|
134
+ `window`.JS.addEventListener(event, @check_for_updates_n)
135
+ end
136
+ check_for_updates
137
+ end
138
+
139
+ component_will_unmount do
140
+ EVENTS.each do |event|
141
+ `window`.JS.removeEventListener(event, @check_for_updates_n)
142
+ end
143
+ end
144
+ end
145
+ Router.context_type = LucidApplicationContext
data/lib/switch.rb ADDED
@@ -0,0 +1,70 @@
1
+ class Switch < Preact::Component
2
+ def initialize(props, context)
3
+ super(props, context)
4
+ if RUBY_ENGINE == 'opal'
5
+ @browser = `typeof window !== "undefined"` ? true : false
6
+ else
7
+ @browser = false
8
+ end
9
+ end
10
+
11
+ def flatten(children)
12
+ if children.is_a?(Array)
13
+ children.compact!
14
+ children.map! do |child|
15
+ if RUBY_ENGINE == 'opal'
16
+ if child.is_a?(Array)
17
+ flatten(child)
18
+ elsif `child.type === Opal.Fragment`
19
+ flatten(child.JS[:props][:children])
20
+ else
21
+ child
22
+ end
23
+ else
24
+ if child.is_a?(Array)
25
+ flatten(child)
26
+ elsif child.type == ::Fragment
27
+ flatten(child.JS[:props][:children])
28
+ else
29
+ child
30
+ end
31
+ end
32
+ end
33
+ else
34
+ [children]
35
+ end
36
+ end
37
+
38
+ render do
39
+ router = @context[:router]
40
+ base = router[:base]
41
+ matcher = router[:matcher]
42
+ originalLocation = router[:originalLocation]
43
+ children = flatten(props[:children])
44
+ location = props[:location]
45
+ child = nil
46
+ if RUBY_ENGINE == 'opal'
47
+ children.each do |vnode|
48
+ match = nil
49
+ # we don't require an element to be of type Route,
50
+ # but we do require it to contain a truthy `path` prop.
51
+ # this allows to use different components that wrap Route
52
+ # inside of a switch, for example <AnimatedRoute />.
53
+ if vnode.is_a?(VNode) && (match = (p = vnode.JS[:props][:path]) ? matcher.call(p, location || @context[:location]) : [true, {}])[0]
54
+ child = Preact.clone_element(vnode, { match: match })
55
+ break
56
+ end
57
+ end
58
+ else
59
+ children.each do |vnode|
60
+ match = nil
61
+ if vnode.is_a?(VNode) && (match = (p = vnode.props[:path]) ? matcher.call(p, location || @context[:location]) : [true, {}])[0]
62
+ child = Preact.clone_element(vnode, { match: match })
63
+ break
64
+ end
65
+ end
66
+ end
67
+ child
68
+ end
69
+ end
70
+ Switch.context_type = RouterContext