archipelago-rails 0.1.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 (51) hide show
  1. checksums.yaml +7 -0
  2. data/Appraisals +16 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +79 -0
  5. data/Rakefile +17 -0
  6. data/app/controllers/archipelago/application_controller.rb +10 -0
  7. data/app/controllers/archipelago/islands_controller.rb +158 -0
  8. data/config/database.yml +5 -0
  9. data/config/routes.rb +6 -0
  10. data/lib/archipelago/action.rb +121 -0
  11. data/lib/archipelago/broadcasts.rb +17 -0
  12. data/lib/archipelago/channel.rb +36 -0
  13. data/lib/archipelago/configuration.rb +23 -0
  14. data/lib/archipelago/context.rb +14 -0
  15. data/lib/archipelago/engine.rb +21 -0
  16. data/lib/archipelago/params_dsl.rb +143 -0
  17. data/lib/archipelago/registry.rb +25 -0
  18. data/lib/archipelago/resolver.rb +54 -0
  19. data/lib/archipelago/response.rb +35 -0
  20. data/lib/archipelago/security/origin_validator.rb +32 -0
  21. data/lib/archipelago/security/redirect_validator.rb +30 -0
  22. data/lib/archipelago/test_helpers.rb +31 -0
  23. data/lib/archipelago/view_helper.rb +31 -0
  24. data/lib/archipelago-rails.rb +3 -0
  25. data/lib/archipelago.rb +71 -0
  26. data/lib/generators/archipelago/install/install_generator.rb +43 -0
  27. data/lib/generators/archipelago/install/react/react_generator.rb +380 -0
  28. data/lib/generators/archipelago/install/react/templates/entry.js.tt +13 -0
  29. data/lib/generators/archipelago/install/react/templates/generate_registry.mjs.tt +96 -0
  30. data/lib/generators/archipelago/install/react_generator.rb +3 -0
  31. data/lib/generators/archipelago/install_generator.rb +3 -0
  32. data/lib/generators/archipelago/island/island_generator.rb +44 -0
  33. data/lib/generators/archipelago/island/templates/action.rb.tt +11 -0
  34. data/lib/generators/archipelago/island/templates/component.tsx.tt +14 -0
  35. data/lib/generators/archipelago/island_generator.rb +3 -0
  36. data/test/archipelago/action_test.rb +136 -0
  37. data/test/archipelago/broadcasts_test.rb +29 -0
  38. data/test/archipelago/channel_test.rb +15 -0
  39. data/test/archipelago/notifications_test.rb +60 -0
  40. data/test/archipelago/origin_validator_test.rb +36 -0
  41. data/test/archipelago/params_dsl_test.rb +51 -0
  42. data/test/archipelago/redirect_validator_test.rb +28 -0
  43. data/test/archipelago/resolver_test.rb +80 -0
  44. data/test/archipelago/response_test.rb +30 -0
  45. data/test/archipelago/view_helper_test.rb +32 -0
  46. data/test/controllers/islands_controller_test.rb +115 -0
  47. data/test/generators/install_generator_test.rb +26 -0
  48. data/test/generators/island_generator_test.rb +20 -0
  49. data/test/generators/react_install_generator_test.rb +67 -0
  50. data/test/test_helper.rb +35 -0
  51. metadata +180 -0
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../test_helper"
4
+ require "rails/generators/test_case"
5
+ require "generators/archipelago/install/react_generator"
6
+ require "json"
7
+
8
+ class ReactInstallGeneratorTest < Rails::Generators::TestCase
9
+ tests Archipelago::Generators::Install::ReactGenerator
10
+ destination File.expand_path("../../tmp", __dir__)
11
+
12
+ setup :prepare_destination
13
+
14
+ def setup
15
+ super
16
+ FileUtils.mkdir_p(File.join(destination_root, "app/javascript"))
17
+ File.write(File.join(destination_root, "app/javascript/application.js"), "// entry\n")
18
+ File.write(File.join(destination_root, "Gemfile"), "gem \"jsbundling-rails\"\n")
19
+ File.write(
20
+ File.join(destination_root, "package.json"),
21
+ <<~JSON
22
+ {
23
+ "name": "dummy",
24
+ "scripts": {
25
+ "build": "esbuild app/javascript/*.* --bundle --outdir=app/assets/builds",
26
+ "build:watch": "esbuild app/javascript/*.* --bundle --outdir=app/assets/builds --watch"
27
+ }
28
+ }
29
+ JSON
30
+ )
31
+ end
32
+
33
+ def test_generates_entry_and_wires_application_import
34
+ run_generator %w[--interactive=false]
35
+
36
+ assert_file "app/javascript/archipelago/entry.jsx", /import registry from "\.\/registry\.generated"/
37
+ assert_file "app/javascript/application.js", /import "\.\/archipelago\/entry"/
38
+ assert_file "app/javascript/archipelago/generate_registry.mjs", /registry\.generated\.js/
39
+ assert_file "app/javascript/archipelago/registry.generated.js", /const registry = \{\}/
40
+
41
+ package_json = JSON.parse(File.read(File.join(destination_root, "package.json")))
42
+ assert_equal "node app/javascript/archipelago/generate_registry.mjs", package_json.dig("scripts", "archipelago:registry")
43
+ assert_match(/^node app\/javascript\/archipelago\/generate_registry\.mjs && /, package_json.dig("scripts", "build"))
44
+ end
45
+
46
+ def test_generates_typescript_entry_when_requested
47
+ run_generator %w[--interactive=false --typescript=true]
48
+
49
+ assert_file "app/javascript/archipelago/entry.tsx", /import registry from "\.\/registry\.generated"/
50
+ assert_file "app/javascript/archipelago/registry.generated.ts", /const registry: IslandRegistry = \{\}/
51
+ end
52
+
53
+ def test_auto_detects_typescript_when_tsconfig_present
54
+ File.write(File.join(destination_root, "tsconfig.json"), "{\n}\n")
55
+
56
+ run_generator %w[--interactive=false]
57
+
58
+ assert_file "app/javascript/archipelago/entry.tsx", /bootArchipelagoIslands/
59
+ end
60
+
61
+ def test_can_disable_auto_registry
62
+ run_generator %w[--interactive=false --auto_registry=false]
63
+
64
+ assert_file "app/javascript/archipelago/entry.jsx", /const registry = \{/
65
+ refute File.exist?(File.join(destination_root, "app/javascript/archipelago/generate_registry.mjs"))
66
+ end
67
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
4
+
5
+ ENV["RAILS_ENV"] ||= "test"
6
+
7
+ require "minitest/autorun"
8
+ require "active_support"
9
+ require "active_support/testing/time_helpers"
10
+ require "action_view"
11
+ begin
12
+ require "action_controller/template_assertions"
13
+ rescue LoadError
14
+ # Loaded in full Rails app contexts.
15
+ end
16
+ begin
17
+ require "action_cable/engine"
18
+ rescue LoadError
19
+ # Streaming tests require actioncable; core tests can still run without it.
20
+ end
21
+ require "archipelago"
22
+
23
+ if defined?(ActionController::Base)
24
+ ActionController::Base.allow_forgery_protection = false
25
+ end
26
+
27
+ class ArchipelagoTestCase < Minitest::Test
28
+ include ActiveSupport::Testing::TimeHelpers
29
+
30
+ def setup
31
+ super
32
+ Archipelago.reset_configuration!
33
+ Archipelago.registry.clear!
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,180 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: archipelago-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Archipelago
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
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: '7.1'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '9.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '7.1'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '9.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: appraisal
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - "~>"
37
+ - !ruby/object:Gem::Version
38
+ version: '2.5'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: '2.5'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '5.20'
53
+ - - "<"
54
+ - !ruby/object:Gem::Version
55
+ version: '6.0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '5.20'
63
+ - - "<"
64
+ - !ruby/object:Gem::Version
65
+ version: '6.0'
66
+ - !ruby/object:Gem::Dependency
67
+ name: rake
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '13.0'
73
+ type: :development
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '13.0'
80
+ - !ruby/object:Gem::Dependency
81
+ name: sqlite3
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '1.6'
87
+ - - "<"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - - "<"
98
+ - !ruby/object:Gem::Version
99
+ version: '3.0'
100
+ description: Inertia-style server-driven props for embedded React islands
101
+ email:
102
+ - dev@archipelago.local
103
+ executables: []
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - Appraisals
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - app/controllers/archipelago/application_controller.rb
112
+ - app/controllers/archipelago/islands_controller.rb
113
+ - config/database.yml
114
+ - config/routes.rb
115
+ - lib/archipelago-rails.rb
116
+ - lib/archipelago.rb
117
+ - lib/archipelago/action.rb
118
+ - lib/archipelago/broadcasts.rb
119
+ - lib/archipelago/channel.rb
120
+ - lib/archipelago/configuration.rb
121
+ - lib/archipelago/context.rb
122
+ - lib/archipelago/engine.rb
123
+ - lib/archipelago/params_dsl.rb
124
+ - lib/archipelago/registry.rb
125
+ - lib/archipelago/resolver.rb
126
+ - lib/archipelago/response.rb
127
+ - lib/archipelago/security/origin_validator.rb
128
+ - lib/archipelago/security/redirect_validator.rb
129
+ - lib/archipelago/test_helpers.rb
130
+ - lib/archipelago/view_helper.rb
131
+ - lib/generators/archipelago/install/install_generator.rb
132
+ - lib/generators/archipelago/install/react/react_generator.rb
133
+ - lib/generators/archipelago/install/react/templates/entry.js.tt
134
+ - lib/generators/archipelago/install/react/templates/generate_registry.mjs.tt
135
+ - lib/generators/archipelago/install/react_generator.rb
136
+ - lib/generators/archipelago/install_generator.rb
137
+ - lib/generators/archipelago/island/island_generator.rb
138
+ - lib/generators/archipelago/island/templates/action.rb.tt
139
+ - lib/generators/archipelago/island/templates/component.tsx.tt
140
+ - lib/generators/archipelago/island_generator.rb
141
+ - test/archipelago/action_test.rb
142
+ - test/archipelago/broadcasts_test.rb
143
+ - test/archipelago/channel_test.rb
144
+ - test/archipelago/notifications_test.rb
145
+ - test/archipelago/origin_validator_test.rb
146
+ - test/archipelago/params_dsl_test.rb
147
+ - test/archipelago/redirect_validator_test.rb
148
+ - test/archipelago/resolver_test.rb
149
+ - test/archipelago/response_test.rb
150
+ - test/archipelago/view_helper_test.rb
151
+ - test/controllers/islands_controller_test.rb
152
+ - test/generators/install_generator_test.rb
153
+ - test/generators/island_generator_test.rb
154
+ - test/generators/react_install_generator_test.rb
155
+ - test/test_helper.rb
156
+ homepage: https://github.com/robrace/archipelago/tree/main/archipelago-rails
157
+ licenses:
158
+ - MIT
159
+ metadata:
160
+ homepage_uri: https://github.com/robrace/archipelago/tree/main/archipelago-rails
161
+ source_code_uri: https://github.com/robrace/archipelago
162
+ changelog_uri: https://github.com/robrace/archipelago/releases
163
+ rdoc_options: []
164
+ require_paths:
165
+ - lib
166
+ required_ruby_version: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '3.2'
171
+ required_rubygems_version: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ requirements: []
177
+ rubygems_version: 3.6.7
178
+ specification_version: 4
179
+ summary: Server-driven React islands for Rails
180
+ test_files: []