funicular 0.0.1 → 0.2.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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -0
  3. data/README.md +66 -20
  4. data/Rakefile +103 -2
  5. data/demo/keymap_editor.html +582 -0
  6. data/demo/test_cable.html +179 -0
  7. data/demo/test_chartjs.html +235 -0
  8. data/demo/test_component.html +201 -0
  9. data/demo/test_diff_patch.html +146 -0
  10. data/demo/test_error_boundary.html +284 -0
  11. data/demo/test_router.html +257 -0
  12. data/demo/test_vdom.html +100 -0
  13. data/demo/tic-tac-toe.html +201 -0
  14. data/docs/architecture.md +118 -0
  15. data/exe/funicular +32 -0
  16. data/lib/funicular/assets/funicular.css +23 -0
  17. data/lib/funicular/assets/funicular.rb +21 -0
  18. data/lib/funicular/assets/funicular_debug.css +73 -0
  19. data/lib/funicular/assets/funicular_debug.js +183 -0
  20. data/lib/funicular/commands/routes.rb +69 -0
  21. data/lib/funicular/compiler.rb +143 -0
  22. data/lib/funicular/configuration.rb +76 -0
  23. data/lib/funicular/helpers/picoruby_helper.rb +112 -0
  24. data/lib/funicular/middleware.rb +123 -0
  25. data/lib/funicular/plugin.rb +147 -0
  26. data/lib/funicular/railtie.rb +26 -0
  27. data/lib/funicular/route_parser.rb +137 -0
  28. data/lib/funicular/schema.rb +167 -0
  29. data/lib/funicular/ssr/runtime.rb +101 -0
  30. data/lib/funicular/ssr.rb +51 -0
  31. data/lib/funicular/testing/node_runner.mjs +293 -0
  32. data/lib/funicular/testing/node_runner.rb +190 -0
  33. data/lib/funicular/testing.rb +22 -0
  34. data/lib/funicular/vendor/picorbc/VERSION +1 -0
  35. data/lib/funicular/vendor/picorbc/picorbc.js +5283 -0
  36. data/lib/funicular/vendor/picorbc/picorbc.wasm +0 -0
  37. data/lib/funicular/vendor/picoruby/VERSION +1 -0
  38. data/lib/funicular/vendor/picoruby/debug/init.iife.js +130 -0
  39. data/lib/funicular/vendor/picoruby/debug/picoruby.js +6423 -0
  40. data/lib/funicular/vendor/picoruby/debug/picoruby.wasm +0 -0
  41. data/lib/funicular/vendor/picoruby/dist/init.iife.js +130 -0
  42. data/lib/funicular/vendor/picoruby/dist/picoruby.js +2 -0
  43. data/lib/funicular/vendor/picoruby/dist/picoruby.wasm +0 -0
  44. data/lib/funicular/vendor/picoruby-test-node/VERSION +1 -0
  45. data/lib/funicular/vendor/picoruby-test-node/picoruby.js +6885 -0
  46. data/lib/funicular/vendor/picoruby-test-node/picoruby.wasm +0 -0
  47. data/lib/funicular/vendor/picoruby-test-node/picoruby.wasm.map +1 -0
  48. data/lib/funicular/version.rb +1 -1
  49. data/lib/funicular.rb +32 -1
  50. data/lib/generators/funicular/chat/chat_generator.rb +104 -0
  51. data/lib/generators/funicular/chat/templates/application_cable_channel.rb.tt +4 -0
  52. data/lib/generators/funicular/chat/templates/application_cable_connection.rb.tt +4 -0
  53. data/lib/generators/funicular/chat/templates/create_funicular_chat_messages.rb.tt +10 -0
  54. data/lib/generators/funicular/chat/templates/funicular_chat.css.tt +141 -0
  55. data/lib/generators/funicular/chat/templates/funicular_chat_channel.rb.tt +5 -0
  56. data/lib/generators/funicular/chat/templates/funicular_chat_component.rb.tt +135 -0
  57. data/lib/generators/funicular/chat/templates/funicular_chat_component_picotest.rb.tt +64 -0
  58. data/lib/generators/funicular/chat/templates/funicular_chat_controller.rb.tt +4 -0
  59. data/lib/generators/funicular/chat/templates/funicular_chat_message.rb.tt +13 -0
  60. data/lib/generators/funicular/chat/templates/funicular_chat_messages_controller.rb.tt +23 -0
  61. data/lib/generators/funicular/chat/templates/initializer.rb.tt +4 -0
  62. data/lib/generators/funicular/chat/templates/show.html.erb.tt +6 -0
  63. data/lib/tasks/funicular.rake +218 -0
  64. data/minitest/fixtures/funicular_app/components/greeting_component.rb +16 -0
  65. data/minitest/fixtures/funicular_app/initializer.rb +5 -0
  66. data/minitest/funicular_test.rb +13 -0
  67. data/minitest/hydration_test.rb +87 -0
  68. data/minitest/plugin_test.rb +51 -0
  69. data/minitest/schema_test.rb +106 -0
  70. data/minitest/ssr_test.rb +94 -0
  71. data/minitest/test_helper.rb +7 -0
  72. data/minitest/validations_test.rb +183 -0
  73. data/mrbgem.rake +16 -0
  74. data/mrblib/0_validations.rb +206 -0
  75. data/mrblib/1_validators.rb +180 -0
  76. data/mrblib/cable.rb +432 -0
  77. data/mrblib/component.rb +1050 -0
  78. data/mrblib/debug.rb +208 -0
  79. data/mrblib/differ.rb +254 -0
  80. data/mrblib/environment_inquirer.rb +34 -0
  81. data/mrblib/error_boundary.rb +125 -0
  82. data/mrblib/file_upload.rb +192 -0
  83. data/mrblib/form_builder.rb +300 -0
  84. data/mrblib/funicular.rb +245 -0
  85. data/mrblib/html_serializer.rb +121 -0
  86. data/mrblib/http.rb +183 -0
  87. data/mrblib/model.rb +196 -0
  88. data/mrblib/patcher.rb +269 -0
  89. data/mrblib/router.rb +266 -0
  90. data/mrblib/store.rb +304 -0
  91. data/mrblib/store_collection.rb +171 -0
  92. data/mrblib/store_singleton.rb +79 -0
  93. data/mrblib/styles.rb +83 -0
  94. data/mrblib/vdom.rb +273 -0
  95. data/sig/cable.rbs +66 -0
  96. data/sig/component.rbs +149 -0
  97. data/sig/debug.rbs +28 -0
  98. data/sig/differ.rbs +18 -0
  99. data/sig/environment_iquirer.rbs +10 -0
  100. data/sig/error_boundary.rbs +14 -0
  101. data/sig/file_upload.rbs +18 -0
  102. data/sig/form_builder.rbs +29 -0
  103. data/sig/funicular.rbs +24 -1
  104. data/sig/html_serializer.rbs +20 -0
  105. data/sig/http.rbs +37 -0
  106. data/sig/model.rbs +28 -0
  107. data/sig/patcher.rbs +18 -0
  108. data/sig/router.rbs +44 -0
  109. data/sig/store.rbs +89 -0
  110. data/sig/store_collection.rbs +43 -0
  111. data/sig/store_singleton.rbs +19 -0
  112. data/sig/styles.rbs +25 -0
  113. data/sig/validations.rbs +103 -0
  114. data/sig/vdom.rbs +59 -0
  115. metadata +154 -8
@@ -0,0 +1,103 @@
1
+ module Funicular
2
+ class Model
3
+ # Validation error collection (a small slice of ActiveModel::Errors).
4
+ class Errors
5
+ @messages: Hash[Symbol, Array[String]]
6
+
7
+ def initialize: () -> void
8
+ def add: (Symbol | String attribute, String message) -> String
9
+ def []: (Symbol | String attribute) -> Array[String]
10
+ def added?: (Symbol | String attribute) -> bool
11
+ def messages: () -> Hash[Symbol, Array[String]]
12
+ def full_messages: () -> Array[String]
13
+ def clear: () -> void
14
+ def empty?: () -> bool
15
+ def any?: () -> bool
16
+
17
+ private
18
+ def humanize: (Symbol | String attribute) -> String
19
+ end
20
+
21
+ # ActiveModel-style validation, mixed into Model.
22
+ module Validations
23
+ def self.included: (untyped base) -> void
24
+
25
+ # Base class for attribute validators.
26
+ class EachValidator
27
+ @attributes: Array[Symbol]
28
+ @options: Hash[Symbol, untyped]
29
+
30
+ attr_reader attributes: Array[Symbol]
31
+ attr_reader options: Hash[Symbol, untyped]
32
+
33
+ def initialize: (attributes: Array[Symbol], **untyped options) -> void
34
+ def kind: () -> Symbol
35
+ def validate: (untyped record) -> void
36
+ def validate_each: (untyped record, Symbol attribute, untyped value) -> void
37
+
38
+ private
39
+ def blank?: (untyped value) -> bool
40
+ def present?: (untyped value) -> bool
41
+ end
42
+
43
+ module ClassMethods
44
+ @validators: Array[EachValidator]
45
+
46
+ SHARED_OPTIONS: Array[Symbol]
47
+
48
+ def validators: () -> Array[EachValidator]
49
+ def validators_on: (Symbol | String attribute) -> Array[EachValidator]
50
+ def validates: (*Symbol | String attributes, **untyped options) -> void
51
+ def add_schema_validator: (Symbol | String attribute, Symbol | String kind, untyped opts) -> void
52
+
53
+ private
54
+ def validator_class_for: (Symbol | String key) -> singleton(EachValidator)?
55
+ def symbolize_keys: (untyped hash) -> Hash[Symbol, untyped]
56
+ end
57
+
58
+ # Instance API (mixed into Model).
59
+ @errors: Errors
60
+ def errors: () -> Errors
61
+ def read_attribute_for_validation: (Symbol attribute) -> untyped
62
+ def valid?: () -> bool
63
+ def invalid?: () -> bool
64
+
65
+ # --- concrete validators ---
66
+
67
+ class PresenceValidator < EachValidator
68
+ end
69
+
70
+ class AbsenceValidator < EachValidator
71
+ end
72
+
73
+ class LengthValidator < EachValidator
74
+ private
75
+ def range_include?: (untyped range, Integer length) -> bool
76
+ end
77
+
78
+ class FormatValidator < EachValidator
79
+ end
80
+
81
+ class NumericalityValidator < EachValidator
82
+ CHECKS: Hash[Symbol, String]
83
+
84
+ private
85
+ def compare: (Numeric number, Symbol option, untyped target) -> bool
86
+ def message_for: (Symbol option, untyped target) -> String
87
+ def to_number: (untyped value) -> (Numeric | nil)
88
+ end
89
+
90
+ class InclusionValidator < EachValidator
91
+ end
92
+
93
+ class ExclusionValidator < EachValidator
94
+ end
95
+
96
+ class AcceptanceValidator < EachValidator
97
+ end
98
+
99
+ class ConfirmationValidator < EachValidator
100
+ end
101
+ end
102
+ end
103
+ end
data/sig/vdom.rbs ADDED
@@ -0,0 +1,59 @@
1
+ module Funicular
2
+ module VDOM
3
+ type patch_t = Array[untyped]
4
+ type child_t = Element | Text | Component | String | Array[Element | Text | Component | String]
5
+
6
+ URL_ATTRIBUTES: Array[String]
7
+
8
+ class VNode
9
+ attr_reader type: Symbol
10
+ attr_reader key: untyped
11
+
12
+ def initialize: (Symbol type) -> void
13
+ end
14
+
15
+ class Element < VNode
16
+ attr_reader tag: String
17
+ attr_reader props: Hash[Symbol, untyped]
18
+ attr_reader children: Array[child_t]
19
+
20
+ def initialize: (String tag, ?Hash[Symbol, untyped] props, ?Array[child_t] children) -> void
21
+ def ==: (untyped other) -> bool
22
+ private def normalize_children: (Array[child_t] children) -> Array[child_t]
23
+ end
24
+
25
+ class Text < VNode
26
+ attr_reader content: String
27
+
28
+ def initialize: (String content) -> void
29
+ def ==: (untyped other) -> bool
30
+ end
31
+
32
+ class Renderer
33
+ @error_boundary_stack: Array[Funicular::ErrorBoundary]
34
+
35
+ def initialize: (?JS::Element? doc) -> void
36
+ def render: (VDOM::VNode | VDOM::Text | nil vnode, ?JS::Element? parent) -> JS::Element
37
+
38
+ private def current_error_boundary: () -> ErrorBoundary?
39
+ private def render_element: (Element element, JS::Element? parent) -> JS::Element
40
+ private def render_text: (VDOM::Text text, JS::Element? parent) -> JS::Element
41
+ private def render_component: (VDOM::Component component_vnode, JS::Element? parent) -> JS::Element
42
+ end
43
+
44
+ def self.create_element: (String tag, ?Hash[Symbol, untyped] props, *child_t children) -> Element
45
+ def self.create_text: (String content) -> Text
46
+ def self.render: (VNode vnode, JS::Element container) -> void
47
+ def self.diff: (VNode? old_vnode, VNode? new_vnode) -> Array[patch_t]
48
+ def self.patch: (JS::Object element, Array[patch_t] patches) -> JS::Object
49
+
50
+ class Component < VNode
51
+ attr_reader component_class: untyped
52
+ attr_reader props: Hash[Symbol, untyped]
53
+ attr_accessor instance: untyped
54
+
55
+ def initialize: (untyped component_class, ?Hash[Symbol, untyped] props) -> void
56
+ def ==: (untyped other) -> bool
57
+ end
58
+ end
59
+ end
metadata CHANGED
@@ -1,18 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: funicular
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HASUMI Hitoshi
8
8
  bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
- dependencies: []
12
- description: Funicular is a tool
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '8.0'
26
+ description: Funicular enables you to write client-side UI components in Ruby, powered
27
+ by PicoRuby.wasm
13
28
  email:
14
29
  - hasumikin@gmail.com
15
- executables: []
30
+ executables:
31
+ - funicular
16
32
  extensions: []
17
33
  extra_rdoc_files: []
18
34
  files:
@@ -21,14 +37,143 @@ files:
21
37
  - LICENSE.txt
22
38
  - README.md
23
39
  - Rakefile
40
+ - demo/keymap_editor.html
41
+ - demo/test_cable.html
42
+ - demo/test_chartjs.html
43
+ - demo/test_component.html
44
+ - demo/test_diff_patch.html
45
+ - demo/test_error_boundary.html
46
+ - demo/test_router.html
47
+ - demo/test_vdom.html
48
+ - demo/tic-tac-toe.html
49
+ - docs/architecture.md
50
+ - exe/funicular
24
51
  - lib/funicular.rb
52
+ - lib/funicular/assets/funicular.css
53
+ - lib/funicular/assets/funicular.rb
54
+ - lib/funicular/assets/funicular_debug.css
55
+ - lib/funicular/assets/funicular_debug.js
56
+ - lib/funicular/commands/routes.rb
57
+ - lib/funicular/compiler.rb
58
+ - lib/funicular/configuration.rb
59
+ - lib/funicular/helpers/picoruby_helper.rb
60
+ - lib/funicular/middleware.rb
61
+ - lib/funicular/plugin.rb
62
+ - lib/funicular/railtie.rb
63
+ - lib/funicular/route_parser.rb
64
+ - lib/funicular/schema.rb
65
+ - lib/funicular/ssr.rb
66
+ - lib/funicular/ssr/runtime.rb
67
+ - lib/funicular/testing.rb
68
+ - lib/funicular/testing/node_runner.mjs
69
+ - lib/funicular/testing/node_runner.rb
70
+ - lib/funicular/vendor/picorbc/VERSION
71
+ - lib/funicular/vendor/picorbc/picorbc.js
72
+ - lib/funicular/vendor/picorbc/picorbc.wasm
73
+ - lib/funicular/vendor/picoruby-test-node/VERSION
74
+ - lib/funicular/vendor/picoruby-test-node/picoruby.js
75
+ - lib/funicular/vendor/picoruby-test-node/picoruby.wasm
76
+ - lib/funicular/vendor/picoruby-test-node/picoruby.wasm.map
77
+ - lib/funicular/vendor/picoruby/VERSION
78
+ - lib/funicular/vendor/picoruby/debug/init.iife.js
79
+ - lib/funicular/vendor/picoruby/debug/picoruby.js
80
+ - lib/funicular/vendor/picoruby/debug/picoruby.wasm
81
+ - lib/funicular/vendor/picoruby/dist/init.iife.js
82
+ - lib/funicular/vendor/picoruby/dist/picoruby.js
83
+ - lib/funicular/vendor/picoruby/dist/picoruby.wasm
25
84
  - lib/funicular/version.rb
85
+ - lib/generators/funicular/chat/chat_generator.rb
86
+ - lib/generators/funicular/chat/templates/application_cable_channel.rb.tt
87
+ - lib/generators/funicular/chat/templates/application_cable_connection.rb.tt
88
+ - lib/generators/funicular/chat/templates/create_funicular_chat_messages.rb.tt
89
+ - lib/generators/funicular/chat/templates/funicular_chat.css.tt
90
+ - lib/generators/funicular/chat/templates/funicular_chat_channel.rb.tt
91
+ - lib/generators/funicular/chat/templates/funicular_chat_component.rb.tt
92
+ - lib/generators/funicular/chat/templates/funicular_chat_component_picotest.rb.tt
93
+ - lib/generators/funicular/chat/templates/funicular_chat_controller.rb.tt
94
+ - lib/generators/funicular/chat/templates/funicular_chat_message.rb.tt
95
+ - lib/generators/funicular/chat/templates/funicular_chat_messages_controller.rb.tt
96
+ - lib/generators/funicular/chat/templates/initializer.rb.tt
97
+ - lib/generators/funicular/chat/templates/show.html.erb.tt
98
+ - lib/tasks/funicular.rake
99
+ - minitest/fixtures/funicular_app/components/greeting_component.rb
100
+ - minitest/fixtures/funicular_app/initializer.rb
101
+ - minitest/funicular_test.rb
102
+ - minitest/hydration_test.rb
103
+ - minitest/plugin_test.rb
104
+ - minitest/schema_test.rb
105
+ - minitest/ssr_test.rb
106
+ - minitest/test_helper.rb
107
+ - minitest/validations_test.rb
108
+ - mrbgem.rake
109
+ - mrblib/0_validations.rb
110
+ - mrblib/1_validators.rb
111
+ - mrblib/cable.rb
112
+ - mrblib/component.rb
113
+ - mrblib/debug.rb
114
+ - mrblib/differ.rb
115
+ - mrblib/environment_inquirer.rb
116
+ - mrblib/error_boundary.rb
117
+ - mrblib/file_upload.rb
118
+ - mrblib/form_builder.rb
119
+ - mrblib/funicular.rb
120
+ - mrblib/html_serializer.rb
121
+ - mrblib/http.rb
122
+ - mrblib/model.rb
123
+ - mrblib/patcher.rb
124
+ - mrblib/router.rb
125
+ - mrblib/store.rb
126
+ - mrblib/store_collection.rb
127
+ - mrblib/store_singleton.rb
128
+ - mrblib/styles.rb
129
+ - mrblib/vdom.rb
130
+ - sig/cable.rbs
131
+ - sig/component.rbs
132
+ - sig/debug.rbs
133
+ - sig/differ.rbs
134
+ - sig/environment_iquirer.rbs
135
+ - sig/error_boundary.rbs
136
+ - sig/file_upload.rbs
137
+ - sig/form_builder.rbs
26
138
  - sig/funicular.rbs
27
- homepage: https://github.com/hasumikin/funicular
139
+ - sig/html_serializer.rbs
140
+ - sig/http.rbs
141
+ - sig/model.rbs
142
+ - sig/patcher.rbs
143
+ - sig/router.rbs
144
+ - sig/store.rbs
145
+ - sig/store_collection.rbs
146
+ - sig/store_singleton.rbs
147
+ - sig/styles.rbs
148
+ - sig/validations.rbs
149
+ - sig/vdom.rbs
150
+ homepage: https://github.com/picoruby/funicular
28
151
  licenses:
29
152
  - MIT
30
153
  metadata:
31
- homepage_uri: https://github.com/hasumikin/funicular
154
+ homepage_uri: https://picoruby.org/funicular-getting-started
155
+ source_code_uri: https://github.com/picoruby/funicular
156
+ changelog_uri: https://github.com/picoruby/funicular/blob/master/CHANGELOG.md
157
+ post_install_message: |2+
158
+
159
+ Thank you for installing Funicular!
160
+
161
+ Funicular bundles a WebAssembly build of picorbc, which compiles your
162
+ Ruby code to .mrb bytecode. Make sure Node.js is installed on machines
163
+ that run the compilation.
164
+
165
+ Funicular works in two modes:
166
+
167
+ Standalone: include PicoRuby.wasm directly in any HTML page using the
168
+ bundled WASM artifacts. No server framework required.
169
+
170
+ Rails integration: use the Railtie, middleware, and view helpers for
171
+ seamless asset pipeline support.
172
+ bin/rails funicular:install
173
+
174
+ For Web App Developers: https://picoruby.org/funicular
175
+ For Funicular Contributors: https://github.com/picoruby/funicular
176
+
32
177
  rdoc_options: []
33
178
  require_paths:
34
179
  - lib
@@ -43,7 +188,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
43
188
  - !ruby/object:Gem::Version
44
189
  version: '0'
45
190
  requirements: []
46
- rubygems_version: 3.7.0.dev
191
+ rubygems_version: 4.0.10
47
192
  specification_version: 4
48
- summary: Funicular
193
+ summary: Rails plugin for client-side Ruby development with mruby
49
194
  test_files: []
195
+ ...