mayu-live 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +661 -0
  3. data/README.md +598 -0
  4. data/exe/mayu +33 -0
  5. data/lib/mayu/app_metrics.rb +93 -0
  6. data/lib/mayu/banner.rb +12 -0
  7. data/lib/mayu/client/README.md +17 -0
  8. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js +1 -0
  9. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.br +0 -0
  10. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.map +1 -0
  11. data/lib/mayu/client/dist/DecompressionStreamPolyfill-3ceba43e.js.map.br +0 -0
  12. data/lib/mayu/client/dist/custom-elements/mayu-alert-cd7ad2a4.js +1 -0
  13. data/lib/mayu/client/dist/custom-elements/mayu-alert-cd7ad2a4.js.map +1 -0
  14. data/lib/mayu/client/dist/custom-elements/mayu-disconnected-9f349f46.js +1 -0
  15. data/lib/mayu/client/dist/custom-elements/mayu-disconnected-9f349f46.js.map +1 -0
  16. data/lib/mayu/client/dist/custom-elements/mayu-exception-63df4e8c.js +1 -0
  17. data/lib/mayu/client/dist/custom-elements/mayu-exception-63df4e8c.js.map +1 -0
  18. data/lib/mayu/client/dist/custom-elements/mayu-ping-c498c2a6.js +1 -0
  19. data/lib/mayu/client/dist/custom-elements/mayu-ping-c498c2a6.js.map +1 -0
  20. data/lib/mayu/client/dist/custom-elements/mayu-progress-bar-eb3e1ac8.js +1 -0
  21. data/lib/mayu/client/dist/custom-elements/mayu-progress-bar-eb3e1ac8.js.map +1 -0
  22. data/lib/mayu/client/dist/entries.json +3 -0
  23. data/lib/mayu/client/dist/main-4b49dbc4.js +1 -0
  24. data/lib/mayu/client/dist/main-4b49dbc4.js.br +0 -0
  25. data/lib/mayu/client/dist/main-4b49dbc4.js.map +1 -0
  26. data/lib/mayu/client/dist/main-4b49dbc4.js.map.br +0 -0
  27. data/lib/mayu/client/package.json +39 -0
  28. data/lib/mayu/client/rollup.config.js +81 -0
  29. data/lib/mayu/client/src/DecompressionStream.ts +15 -0
  30. data/lib/mayu/client/src/DecompressionStreamPolyfill.ts +43 -0
  31. data/lib/mayu/client/src/MimeTypes.ts +4 -0
  32. data/lib/mayu/client/src/NodeTree.ts +445 -0
  33. data/lib/mayu/client/src/custom-elements/mayu-alert.html +137 -0
  34. data/lib/mayu/client/src/custom-elements/mayu-alert.ts +62 -0
  35. data/lib/mayu/client/src/custom-elements/mayu-disconnected.html +134 -0
  36. data/lib/mayu/client/src/custom-elements/mayu-disconnected.ts +51 -0
  37. data/lib/mayu/client/src/custom-elements/mayu-exception.html +79 -0
  38. data/lib/mayu/client/src/custom-elements/mayu-exception.ts +28 -0
  39. data/lib/mayu/client/src/custom-elements/mayu-log.html +70 -0
  40. data/lib/mayu/client/src/custom-elements/mayu-log.ts +42 -0
  41. data/lib/mayu/client/src/custom-elements/mayu-ping.html +36 -0
  42. data/lib/mayu/client/src/custom-elements/mayu-ping.ts +53 -0
  43. data/lib/mayu/client/src/custom-elements/mayu-progress-bar.html +44 -0
  44. data/lib/mayu/client/src/custom-elements/mayu-progress-bar.ts +40 -0
  45. data/lib/mayu/client/src/custom-elements/types.d.ts +4 -0
  46. data/lib/mayu/client/src/global.d.ts +26 -0
  47. data/lib/mayu/client/src/h.ts +27 -0
  48. data/lib/mayu/client/src/logger.ts +56 -0
  49. data/lib/mayu/client/src/main.ts +271 -0
  50. data/lib/mayu/client/src/serializeEvent.ts +90 -0
  51. data/lib/mayu/client/src/stream.ts +175 -0
  52. data/lib/mayu/client/src/types.ts +1 -0
  53. data/lib/mayu/client/src/utils.ts +71 -0
  54. data/lib/mayu/client/tsconfig.json +18 -0
  55. data/lib/mayu/colors.rb +34 -0
  56. data/lib/mayu/commands/base.rb +22 -0
  57. data/lib/mayu/commands/build.rb +82 -0
  58. data/lib/mayu/commands.rb +53 -0
  59. data/lib/mayu/component/base.rb +177 -0
  60. data/lib/mayu/component/handler_ref.rb +99 -0
  61. data/lib/mayu/component/helpers.rb +93 -0
  62. data/lib/mayu/component/interface.rb +18 -0
  63. data/lib/mayu/component/wrapper.rb +165 -0
  64. data/lib/mayu/component.rb +54 -0
  65. data/lib/mayu/configuration.rb +195 -0
  66. data/lib/mayu/disable_sorbet.rb +23 -0
  67. data/lib/mayu/environment.rb +151 -0
  68. data/lib/mayu/event_stream.rb +158 -0
  69. data/lib/mayu/fetch.rb +88 -0
  70. data/lib/mayu/html.rb +53 -0
  71. data/lib/mayu/html.yaml +767 -0
  72. data/lib/mayu/message_cipher.rb +172 -0
  73. data/lib/mayu/message_cipher.test.rb +16 -0
  74. data/lib/mayu/metrics/collector.rb +161 -0
  75. data/lib/mayu/metrics/exporter.rb +47 -0
  76. data/lib/mayu/metrics/reporter.rb +187 -0
  77. data/lib/mayu/metrics.rb +82 -0
  78. data/lib/mayu/ref_counter.rb +57 -0
  79. data/lib/mayu/resources/README.md +14 -0
  80. data/lib/mayu/resources/asset.rb +71 -0
  81. data/lib/mayu/resources/assets.rb +76 -0
  82. data/lib/mayu/resources/dependency_graph.rb +306 -0
  83. data/lib/mayu/resources/dot_exporter.rb +167 -0
  84. data/lib/mayu/resources/generators/base.rb +18 -0
  85. data/lib/mayu/resources/generators/copy_file.rb +26 -0
  86. data/lib/mayu/resources/generators/image.rb +106 -0
  87. data/lib/mayu/resources/generators/write_file.rb +39 -0
  88. data/lib/mayu/resources/hot_swap/file_watcher.rb +69 -0
  89. data/lib/mayu/resources/hot_swap.rb +46 -0
  90. data/lib/mayu/resources/mermaid_exporter.rb +210 -0
  91. data/lib/mayu/resources/registry.rb +190 -0
  92. data/lib/mayu/resources/resolver/base.rb +32 -0
  93. data/lib/mayu/resources/resolver/filesystem.rb +94 -0
  94. data/lib/mayu/resources/resolver/static.rb +27 -0
  95. data/lib/mayu/resources/resolver.rb +13 -0
  96. data/lib/mayu/resources/resource.rb +150 -0
  97. data/lib/mayu/resources/transformers/__test__/css/adjacent_selectors.in.css +3 -0
  98. data/lib/mayu/resources/transformers/__test__/css/adjacent_selectors.out.css +6 -0
  99. data/lib/mayu/resources/transformers/__test__/css/attributes.in.css +3 -0
  100. data/lib/mayu/resources/transformers/__test__/css/attributes.out.css +6 -0
  101. data/lib/mayu/resources/transformers/__test__/css/composes.in.css +6 -0
  102. data/lib/mayu/resources/transformers/__test__/css/composes.out.css +10 -0
  103. data/lib/mayu/resources/transformers/__test__/css/element_selectors.in.css +3 -0
  104. data/lib/mayu/resources/transformers/__test__/css/element_selectors.out.css +6 -0
  105. data/lib/mayu/resources/transformers/__test__/css/has.in.css +7 -0
  106. data/lib/mayu/resources/transformers/__test__/css/has.out.css +10 -0
  107. data/lib/mayu/resources/transformers/__test__/css/media_queries.in.css +8 -0
  108. data/lib/mayu/resources/transformers/__test__/css/media_queries.out.css +12 -0
  109. data/lib/mayu/resources/transformers/__test__/css/pseudo_classes.in.css +5 -0
  110. data/lib/mayu/resources/transformers/__test__/css/pseudo_classes.out.css +6 -0
  111. data/lib/mayu/resources/transformers/__test__/haml/README.md +10 -0
  112. data/lib/mayu/resources/transformers/__test__/haml/case.haml +8 -0
  113. data/lib/mayu/resources/transformers/__test__/haml/case.rb +15 -0
  114. data/lib/mayu/resources/transformers/__test__/haml/class_names.haml +13 -0
  115. data/lib/mayu/resources/transformers/__test__/haml/class_names.rb +26 -0
  116. data/lib/mayu/resources/transformers/__test__/haml/comments.haml +5 -0
  117. data/lib/mayu/resources/transformers/__test__/haml/comments.rb +5 -0
  118. data/lib/mayu/resources/transformers/__test__/haml/css.haml +3 -0
  119. data/lib/mayu/resources/transformers/__test__/haml/css.rb +11 -0
  120. data/lib/mayu/resources/transformers/__test__/haml/dashes.haml +3 -0
  121. data/lib/mayu/resources/transformers/__test__/haml/dashes.rb +11 -0
  122. data/lib/mayu/resources/transformers/__test__/haml/early_return.haml +4 -0
  123. data/lib/mayu/resources/transformers/__test__/haml/early_return.rb +9 -0
  124. data/lib/mayu/resources/transformers/__test__/haml/early_return2.haml +3 -0
  125. data/lib/mayu/resources/transformers/__test__/haml/early_return2.rb +6 -0
  126. data/lib/mayu/resources/transformers/__test__/haml/handlers.haml +6 -0
  127. data/lib/mayu/resources/transformers/__test__/haml/handlers.rb +12 -0
  128. data/lib/mayu/resources/transformers/__test__/haml/if_else.haml +6 -0
  129. data/lib/mayu/resources/transformers/__test__/haml/if_else.rb +12 -0
  130. data/lib/mayu/resources/transformers/__test__/haml/interpolation.haml +8 -0
  131. data/lib/mayu/resources/transformers/__test__/haml/interpolation.rb +11 -0
  132. data/lib/mayu/resources/transformers/__test__/haml/object_ref_as_key.haml +1 -0
  133. data/lib/mayu/resources/transformers/__test__/haml/object_ref_as_key.rb +5 -0
  134. data/lib/mayu/resources/transformers/__test__/haml/props.haml +4 -0
  135. data/lib/mayu/resources/transformers/__test__/haml/props.rb +11 -0
  136. data/lib/mayu/resources/transformers/__test__/haml/slots.haml +5 -0
  137. data/lib/mayu/resources/transformers/__test__/haml/slots.rb +9 -0
  138. data/lib/mayu/resources/transformers/__test__/haml/slots_dynamic.haml +3 -0
  139. data/lib/mayu/resources/transformers/__test__/haml/slots_dynamic.rb +9 -0
  140. data/lib/mayu/resources/transformers/__test__/haml/slots_fallback.haml +3 -0
  141. data/lib/mayu/resources/transformers/__test__/haml/slots_fallback.rb +5 -0
  142. data/lib/mayu/resources/transformers/__test__/haml/spacing.haml +5 -0
  143. data/lib/mayu/resources/transformers/__test__/haml/spacing.rb +14 -0
  144. data/lib/mayu/resources/transformers/__test__/haml/spacing2.haml +10 -0
  145. data/lib/mayu/resources/transformers/__test__/haml/spacing2.rb +11 -0
  146. data/lib/mayu/resources/transformers/__test__/haml/spacing3.haml +3 -0
  147. data/lib/mayu/resources/transformers/__test__/haml/spacing3.rb +10 -0
  148. data/lib/mayu/resources/transformers/css/rouge_lexer.rb +841 -0
  149. data/lib/mayu/resources/transformers/css.rb +100 -0
  150. data/lib/mayu/resources/transformers/css.test.rb +87 -0
  151. data/lib/mayu/resources/transformers/haml.rb +984 -0
  152. data/lib/mayu/resources/transformers/haml.test.rb +114 -0
  153. data/lib/mayu/resources/types/README.md +36 -0
  154. data/lib/mayu/resources/types/base.rb +35 -0
  155. data/lib/mayu/resources/types/component.rb +198 -0
  156. data/lib/mayu/resources/types/image.rb +169 -0
  157. data/lib/mayu/resources/types/javascript.rb +50 -0
  158. data/lib/mayu/resources/types/nil.rb +23 -0
  159. data/lib/mayu/resources/types/stylesheet.rb +119 -0
  160. data/lib/mayu/resources/types/svg.rb +69 -0
  161. data/lib/mayu/resources/types.rb +37 -0
  162. data/lib/mayu/routes.rb +170 -0
  163. data/lib/mayu/routing/builder.rb +108 -0
  164. data/lib/mayu/routing/matcher.rb +58 -0
  165. data/lib/mayu/routing/routes.rb +85 -0
  166. data/lib/mayu/routing.rb +17 -0
  167. data/lib/mayu/server/app.rb +494 -0
  168. data/lib/mayu/server/controller.rb +152 -0
  169. data/lib/mayu/server/errors.rb +110 -0
  170. data/lib/mayu/server/file_server.rb +140 -0
  171. data/lib/mayu/server.rb +63 -0
  172. data/lib/mayu/session.rb +358 -0
  173. data/lib/mayu/state/README.md +6 -0
  174. data/lib/mayu/state/action_creator.rb +191 -0
  175. data/lib/mayu/state/action_wrapper.rb +30 -0
  176. data/lib/mayu/state/loader.rb +220 -0
  177. data/lib/mayu/state/store.rb +82 -0
  178. data/lib/mayu/state.rb +8 -0
  179. data/lib/mayu/state.test.rb +97 -0
  180. data/lib/mayu/utils.rb +114 -0
  181. data/lib/mayu/vdom/children.rb +117 -0
  182. data/lib/mayu/vdom/component_marshaler.rb +53 -0
  183. data/lib/mayu/vdom/css_attributes.rb +131 -0
  184. data/lib/mayu/vdom/descriptor.rb +151 -0
  185. data/lib/mayu/vdom/descriptor.test.rb +26 -0
  186. data/lib/mayu/vdom/dom.rb +239 -0
  187. data/lib/mayu/vdom/h.rb +22 -0
  188. data/lib/mayu/vdom/id_generator.rb +55 -0
  189. data/lib/mayu/vdom/interfaces.rb +186 -0
  190. data/lib/mayu/vdom/marshalling.rb +78 -0
  191. data/lib/mayu/vdom/reconciliation.rb +205 -0
  192. data/lib/mayu/vdom/reconciliation.test.rb +56 -0
  193. data/lib/mayu/vdom/special_elements.rb +108 -0
  194. data/lib/mayu/vdom/update_context.rb +180 -0
  195. data/lib/mayu/vdom/vdom.perf.test.rb +146 -0
  196. data/lib/mayu/vdom/vnode.rb +266 -0
  197. data/lib/mayu/vdom/vtree.rb +672 -0
  198. data/lib/mayu/vdom/vtree.test.rb +68 -0
  199. data/lib/mayu/vdom.rb +8 -0
  200. data/lib/mayu/vdom.test.rb +73 -0
  201. data/lib/mayu/version.rb +6 -0
  202. data/lib/mayu.rb +8 -0
  203. data/mayu-live.gemspec +70 -0
  204. metadata +612 -0
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Mayu
5
+ module Resources
6
+ module Resolver
7
+ class Base
8
+ class ResolveError < StandardError
9
+ end
10
+
11
+ extend T::Sig
12
+ extend T::Helpers
13
+ abstract!
14
+
15
+ sig { returns(T::Hash[String, String]) }
16
+ attr_reader :resolved_paths
17
+
18
+ sig { void }
19
+ def initialize
20
+ @resolved_paths = T.let({}, T::Hash[String, String])
21
+ end
22
+
23
+ sig do
24
+ overridable.params(path: String, source_dir: String).returns(String)
25
+ end
26
+ def resolve(path, source_dir = "/")
27
+ raise ResolveError, "Could not resolve #{path} from #{source_dir}"
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require_relative "base"
5
+
6
+ module Mayu
7
+ module Resources
8
+ module Resolver
9
+ class Filesystem < Base
10
+ sig { params(root: String, extensions: T::Array[String]).void }
11
+ def initialize(root, extensions: [""])
12
+ super()
13
+ @root = root
14
+ @extensions = extensions
15
+ end
16
+
17
+ sig do
18
+ override.params(path: String, source_dir: String).returns(String)
19
+ end
20
+ def resolve(path, source_dir = "/")
21
+ # TODO: Fix this!!
22
+ # if path.start_with?("/")
23
+ # return resolve(".#{path}", "/")
24
+ # end
25
+ #
26
+ # if !path.match(/\A\.\.?\//)
27
+ # return resolve("./#{path}", "/components")
28
+ # end
29
+
30
+ relative_to_root = File.absolute_path(path, source_dir)
31
+
32
+ if found = @resolved_paths[relative_to_root]
33
+ return found
34
+ end
35
+
36
+ absolute_path = File.join(@root, relative_to_root)
37
+
38
+ resolve_with_extensions(absolute_path) do |extension|
39
+ return(
40
+ @resolved_paths.store(
41
+ relative_to_root,
42
+ relative_to_root + extension
43
+ )
44
+ )
45
+ end
46
+
47
+ if File.directory?(absolute_path)
48
+ basename = File.basename(absolute_path)
49
+
50
+ resolve_with_extensions(
51
+ File.join(absolute_path, basename)
52
+ ) do |extension|
53
+ return(
54
+ @resolved_paths.store(
55
+ relative_to_root,
56
+ File.join(relative_to_root, basename) + extension
57
+ )
58
+ )
59
+ end
60
+ end
61
+
62
+ raise ResolveError,
63
+ "Could not resolve #{path} from #{source_dir} (app root: #{@root})"
64
+ end
65
+
66
+ private
67
+
68
+ sig do
69
+ params(
70
+ absolute_path: String,
71
+ block: T.proc.params(arg0: String).void
72
+ ).void
73
+ end
74
+ def resolve_with_extensions(absolute_path, &block)
75
+ @extensions.find do |extension|
76
+ absolute_path_with_extension = absolute_path + extension
77
+
78
+ if File.file?(absolute_path_with_extension)
79
+ puts "\e[1mFound #{absolute_path_with_extension}\e[0m"
80
+ yield extension
81
+ else
82
+ puts "\e[2mTried #{absolute_path_with_extension}\e[0m"
83
+ end
84
+ end
85
+ end
86
+
87
+ sig { params(path: String).returns(T::Boolean) }
88
+ def exist?(path)
89
+ File.exist?(path)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require_relative "base"
5
+
6
+ module Mayu
7
+ module Resources
8
+ module Resolver
9
+ class Static < Base
10
+ sig { params(paths: T::Hash[String, String]).void }
11
+ def initialize(paths)
12
+ super()
13
+ @resolved_paths = paths
14
+ # Console.logger.info(self, *@resolved_paths.map { "#{_1} => #{_2}" })
15
+ end
16
+
17
+ sig do
18
+ override.params(path: String, source_dir: String).returns(String)
19
+ end
20
+ def resolve(path, source_dir = "/")
21
+ relative_to_root = File.absolute_path(path, source_dir)
22
+ @resolved_paths[relative_to_root] || relative_to_root
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module Mayu
5
+ module Resources
6
+ module Resolver
7
+ # https://bugs.ruby-lang.org/issues/15330
8
+ # https://bugs.ruby-lang.org/issues/18841
9
+ autoload :Static, File.join(__dir__, "resolver", "static")
10
+ autoload :Filesystem, File.join(__dir__, "resolver", "filesystem")
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ require "digest"
5
+
6
+ module Mayu
7
+ module Resources
8
+ class Resource < Module
9
+ class Wrapper < BasicObject
10
+ extend ::T::Sig
11
+
12
+ sig { params(impl: ::T.untyped).void }
13
+ def initialize(impl)
14
+ @impl = impl
15
+ end
16
+
17
+ sig do
18
+ params(
19
+ meth: ::Symbol,
20
+ args: ::T.untyped,
21
+ kwargs: ::T.untyped,
22
+ block: ::T.untyped
23
+ ).returns(::T.untyped)
24
+ end
25
+ def method_missing(meth, *args, **kwargs, &block)
26
+ @impl.send(meth, *args, **kwargs, &block)
27
+ end
28
+
29
+ sig { params(impl: ::T.untyped).returns(::T.untyped) }
30
+ def __replace_impl!(impl)
31
+ @impl = impl
32
+ end
33
+
34
+ sig { returns(::String) }
35
+ def inspect
36
+ "#<Resource::Wrapper @impl=#{@impl.inspect}>"
37
+ end
38
+ end
39
+
40
+ extend T::Sig
41
+
42
+ Impl = T.type_alias { T.untyped }
43
+
44
+ sig { returns(Registry) }
45
+ attr_reader :registry
46
+ sig { returns(String) }
47
+ attr_reader :path
48
+ sig { returns(String) }
49
+ attr_reader :path_hash
50
+ sig { returns(T.untyped) }
51
+ attr_reader :wrapper
52
+
53
+ sig { params(registry: Registry, path: String).void }
54
+ def initialize(registry:, path:)
55
+ @registry = registry
56
+ @path = path
57
+ @path_hash = T.let(Digest::SHA256.hexdigest(path), String)
58
+ @type = T.let(nil, T.untyped)
59
+ @wrapper = T.let(Wrapper.new(nil), T.untyped)
60
+ @content_hash = T.let(nil, T.nilable(String))
61
+ end
62
+
63
+ sig { params(encoding: String).returns(String) }
64
+ def read(encoding: "binary")
65
+ File.read(absolute_path)
66
+ end
67
+
68
+ sig { returns(T::Boolean) }
69
+ def exists?
70
+ File.exist?(absolute_path)
71
+ end
72
+
73
+ sig { returns(String) }
74
+ def content_hash
75
+ @content_hash ||= calculate_content_hash
76
+ end
77
+
78
+ sig { returns(String) }
79
+ def calculate_content_hash
80
+ Digest::SHA256.file(absolute_path).digest
81
+ end
82
+
83
+ sig { returns(T::Array[Asset]) }
84
+ def assets
85
+ self.type&.assets || []
86
+ end
87
+
88
+ sig { params(assets_dir: String).returns(T::Array[Asset]) }
89
+ def generate_assets(assets_dir)
90
+ if type = self.type
91
+ type.generate_assets(assets_dir)
92
+ else
93
+ []
94
+ end
95
+ end
96
+
97
+ sig { returns(String) }
98
+ def app_root = @registry.root
99
+
100
+ sig { returns(String) }
101
+ def absolute_path = @registry.absolute_path(@path)
102
+
103
+ sig { returns(T.untyped) }
104
+ def type
105
+ @type || load_type
106
+ end
107
+
108
+ sig { returns(T.untyped) }
109
+ def load_type
110
+ @content_hash = nil
111
+ @wrapper.__replace_impl!(
112
+ @type =
113
+ if exists?
114
+ Types.for_path(self.path).new(self)
115
+ else
116
+ Types::Nil.new(self)
117
+ end
118
+ )
119
+ end
120
+
121
+ sig { params(path: String).returns(T.untyped) }
122
+ def import(path)
123
+ resource = self.registry.load_resource(path, File.dirname(self.path))
124
+ self.registry.dependency_graph.add_dependency(self.path, resource.path)
125
+ resource.type
126
+ end
127
+
128
+ MarshalFormat =
129
+ T.type_alias do
130
+ [String, String, T.nilable(String), Resources::Types::Base]
131
+ end
132
+
133
+ sig { returns(MarshalFormat) }
134
+ def marshal_dump
135
+ if exists?
136
+ [path, path_hash, content_hash, type]
137
+ else
138
+ [path, path_hash, nil, type]
139
+ end
140
+ end
141
+
142
+ sig { params(args: MarshalFormat).void }
143
+ def marshal_load(args)
144
+ @path, @path_hash, @content_hash, @type = args
145
+ @type.instance_variable_set(:@resource, self)
146
+ @wrapper = Wrapper.new(@type)
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,3 @@
1
+ a + .b {
2
+ color: #fff;
3
+ }
@@ -0,0 +1,6 @@
1
+ @layer app\/components\/MyComponent\?SCXjFuB8 {
2
+ .app\/components\/MyComponent_a\?GgZETqNB + .app\/components\/MyComponent\.b\?GgZETqNB {
3
+ color: #fff;
4
+ }
5
+
6
+ }
@@ -0,0 +1,3 @@
1
+ .page[aria-current="page"] {
2
+ background: var(--blue);
3
+ }
@@ -0,0 +1,6 @@
1
+ @layer app\/components\/MyComponent\?MiWQFWcF {
2
+ .app\/components\/MyComponent\.page\?-eWE5yiJ[aria-current="page"] {
3
+ background: var(--blue);
4
+ }
5
+
6
+ }
@@ -0,0 +1,6 @@
1
+ .foo {
2
+ color: #f0f;
3
+ }
4
+ .bar {
5
+ composes: foo;
6
+ }
@@ -0,0 +1,10 @@
1
+ @layer app\/components\/MyComponent\?ugAGryRB {
2
+ .app\/components\/MyComponent\.foo\?aiQioe1q {
3
+ color: #f0f;
4
+ }
5
+
6
+ .app\/components\/MyComponent\.bar\?aiQioe1q {
7
+ composes: foo;
8
+ }
9
+
10
+ }
@@ -0,0 +1,3 @@
1
+ p {
2
+ color: fuchsia;
3
+ }
@@ -0,0 +1,6 @@
1
+ @layer app\/components\/MyComponent\?GK5pcDZq {
2
+ .app\/components\/MyComponent_p\?GiigLbAS {
3
+ color: #f0f;
4
+ }
5
+
6
+ }
@@ -0,0 +1,7 @@
1
+ .formGroup:has(:invalid) {
2
+ --color: var(--invalid);
3
+ }
4
+
5
+ .formGroup:has(:invalid:not(:focus)) {
6
+ animation: shake 0.25s;
7
+ }
@@ -0,0 +1,10 @@
1
+ @layer app\/components\/MyComponent\?tjLaPD8V {
2
+ .app\/components\/MyComponent\.formGroup\?vNHgJWqX:has(:invalid) {
3
+ --color: var(--invalid);
4
+ }
5
+
6
+ .app\/components\/MyComponent\.formGroup\?vNHgJWqX:has(:invalid:not(:focus)) {
7
+ animation: .25s shake;
8
+ }
9
+
10
+ }
@@ -0,0 +1,8 @@
1
+ @media (min-width: 8em) and (max-width: 32em) {
2
+ .foo {
3
+ color: fuchsia;
4
+ }
5
+ }
6
+ .bar {
7
+ color: blue;
8
+ }
@@ -0,0 +1,12 @@
1
+ @layer app\/components\/MyComponent\?zQoPHO29 {
2
+ @media (min-width: 8em) and (max-width: 32em) {
3
+ .app\/components\/MyComponent\.foo\?Ef7fDeuq {
4
+ color: #f0f;
5
+ }
6
+ }
7
+
8
+ .app\/components\/MyComponent\.bar\?Ef7fDeuq {
9
+ color: #00f;
10
+ }
11
+
12
+ }
@@ -0,0 +1,5 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ }
@@ -0,0 +1,6 @@
1
+ @layer app\/components\/MyComponent\?8Y3SjNF9 {
2
+ *, :before, :after {
3
+ box-sizing: border-box;
4
+ }
5
+
6
+ }
@@ -0,0 +1,10 @@
1
+ # Haml transformer tests
2
+
3
+ Structure:
4
+
5
+ - `test-name.haml`: Haml input.
6
+ - `test-name.rb`: Expected Ruby output.
7
+
8
+ Skipped tests:
9
+
10
+ `test-name.skip` contains the reason.
@@ -0,0 +1,8 @@
1
+ %div
2
+ = case props[:value]
3
+ = when "foo"
4
+ %p Foo
5
+ = when "bar"
6
+ %p Bar
7
+ = else
8
+ %p Other
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ Mayu::VDOM::H[
5
+ :div,
6
+ case props[:value]
7
+ when "foo"
8
+ Mayu::VDOM::H[:p, "Foo"]
9
+ when "bar"
10
+ Mayu::VDOM::H[:p, "Bar"]
11
+ else
12
+ Mayu::VDOM::H[:p, "Other"]
13
+ end
14
+ ]
15
+ end
@@ -0,0 +1,13 @@
1
+ :ruby
2
+ lol = "lol"
3
+ id = "check123"
4
+ props = { label: "label", asd: "asd" }
5
+
6
+ %div.foo(class="bar" asdd=lol){class: "baz"}
7
+ = "hello"
8
+ %input(id=id){
9
+ class: classname,
10
+ type: "checkbox",
11
+ placeholder: props[:label],
12
+ **props.except(:label),
13
+ }
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ begin
4
+ lol = "lol"
5
+ id = "check123"
6
+ props = { label: "label", asd: "asd" }
7
+ end
8
+ public def render
9
+ Mayu::VDOM::H[
10
+ :div,
11
+ "hello",
12
+ Mayu::VDOM::H[
13
+ :input,
14
+ **mayu.merge_props(
15
+ {
16
+ class: classname,
17
+ type: "checkbox",
18
+ placeholder: props[:label],
19
+ **props.except(:label)
20
+ },
21
+ { id: id }
22
+ )
23
+ ],
24
+ **mayu.merge_props({ class: %i[foo bar] }, { class: "baz" }, { asdd: lol })
25
+ ]
26
+ end
@@ -0,0 +1,5 @@
1
+ %div
2
+ %foo
3
+ -#
4
+ Comments get cleaned out...
5
+ %bar
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ Mayu::VDOM::H[:div, Mayu::VDOM::H[:foo], Mayu::VDOM::H[:bar]]
5
+ end
@@ -0,0 +1,3 @@
1
+ :css
2
+ .button { color: #f0f; }
3
+ %button.button Click me
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ Self =
3
+ setup_component(
4
+ assets: ["rKxGn-R511h2m1nlvs18PwsPwrzW-iGCNVojf-x0LRg=.css"],
5
+ styles: {
6
+ button: "app/components/MyComponent.button?dhhHwAZl"
7
+ }
8
+ )
9
+ public def render
10
+ Mayu::VDOM::H[:button, "Click me", **mayu.merge_props({ class: :button })]
11
+ end
@@ -0,0 +1,3 @@
1
+ %div
2
+ %svg
3
+ %line(stroke-width=2)
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ Mayu::VDOM::H[
5
+ :div,
6
+ Mayu::VDOM::H[
7
+ :svg,
8
+ Mayu::VDOM::H[:line, **mayu.merge_props({ stroke_width: 2 })]
9
+ ]
10
+ ]
11
+ end
@@ -0,0 +1,4 @@
1
+ - if true
2
+ - return
3
+ .foo
4
+ .bar
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ begin
5
+ return Mayu::VDOM::H[:div, **mayu.merge_props({ class: :foo })] if true
6
+ nil
7
+ end
8
+ Mayu::VDOM::H[:div, **mayu.merge_props({ class: :bar })]
9
+ end
@@ -0,0 +1,3 @@
1
+ = return if props[:foo]
2
+ .foo
3
+ .bar
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ return Mayu::VDOM::H[:div, **mayu.merge_props({ class: :foo })] if props[:foo]
5
+ Mayu::VDOM::H[:div, **mayu.merge_props({ class: :bar })]
6
+ end
@@ -0,0 +1,6 @@
1
+ :ruby
2
+ def handle_click(e)
3
+ Console.logger.info(self, e)
4
+ end
5
+
6
+ %button(onclick=handle_click) Click me
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ def handle_click(e)
4
+ Console.logger.info(self, e)
5
+ end
6
+ public def render
7
+ Mayu::VDOM::H[
8
+ :button,
9
+ "Click me",
10
+ **mayu.merge_props({ onclick: mayu.handler(:handle_click) })
11
+ ]
12
+ end
@@ -0,0 +1,6 @@
1
+ :ruby
2
+ # setup
3
+ = if true
4
+ .foo
5
+ = else
6
+ .bar
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ begin
4
+ # setup
5
+ end
6
+ public def render
7
+ if true
8
+ Mayu::VDOM::H[:div, **mayu.merge_props({ class: :foo })]
9
+ else
10
+ Mayu::VDOM::H[:div, **mayu.merge_props({ class: :bar })]
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ %div
2
+ %div
3
+ foo #{bar} baz
4
+ %div foo #{bar} baz
5
+ %div= "foo #{bar} baz"
6
+ %div
7
+ = if bar
8
+ = "lol #{boll} polle"
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ Mayu::VDOM::H[
5
+ :div,
6
+ Mayu::VDOM::H[:div, "foo #{bar} baz"],
7
+ Mayu::VDOM::H[:div, "foo #{bar} baz"],
8
+ Mayu::VDOM::H[:div, "foo #{bar} baz"],
9
+ Mayu::VDOM::H[:div, ("lol #{boll} polle" if bar)]
10
+ ]
11
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ Self = setup_component(assets: [], styles: {})
3
+ public def render
4
+ Mayu::VDOM::H[:div, **mayu.merge_props({ key: ["hello"] })]
5
+ end