humid 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 64ab68e5648b4211e7d39b272da5f94e1aaf3bfcdf625db30ee5f6c72a7dc529
4
- data.tar.gz: 251e41301a91ea534547caa84b76ffef68b463299fd012c39b2b26e4626b6d13
3
+ metadata.gz: b8422854ba8184e3afc75af501ec45002304538e9f756ea3ee3bdd58b15d98de
4
+ data.tar.gz: 8e8025cba53a2ed0e54aecb85701bcb65a7d39798f241ef4e5d3aeea391367aa
5
5
  SHA512:
6
- metadata.gz: f97030ff349d70d7b4605969953194c34b8012dc12f477aa8c5f6f1ccdfee88be2ccb5c495fc880378be03c381ed88e11c8453abd1d8a92ad3621aad34a0b553
7
- data.tar.gz: 23f59abc3c56fe9d11b6084e89b0c02a3b11c4e12175bcab6ea4a641630616950b6943a9948c64be270173461f383a540fd570fdb69fd439cfcd7007d6e542ea
6
+ metadata.gz: 404f369b35a24b2b313bf2a5d572746b1d4262df0b5ee4988f69540a878502045d046279714432d77b367366e98031818f6c3f3c26747f67e916581335b4004f
7
+ data.tar.gz: 38feb90293fd0340155314e6300e5a3ff70a8ee5f2d2e7fb081c0bf89ea8b7826a7297d52b15888d05f447ff64738da454cc4ede07ff9a152236ae7318fd5380
data/README.md CHANGED
@@ -1,11 +1,10 @@
1
1
  # Humid
2
- [![Build
3
- Status](https://circleci.com/gh/thoughtbot/humid.svg?style=shield)](https://circleci.com/gh/thoughtbot/humid)
4
2
 
5
- Humid is a lightweight wrapper around [mini_racer] and [webpacker] used to
6
- generate Server Side Rendered (SSR) pages from your javascript application.
7
- While it was built for React, it can work with any JS function that returns a
8
- HTML string.
3
+ ![Build Status](https://github.com/thoughtbot/humid/actions/workflows/build.yml/badge.svg?branch=main)
4
+
5
+ Humid is a lightweight wrapper around [mini_racer] used to generate Server
6
+ Side Rendered (SSR) pages from your js-bundling builds. While it was built
7
+ for React, it can work with any JS function that returns a HTML string.
9
8
 
10
9
  ## Caution
11
10
 
@@ -34,20 +33,31 @@ Add an initializer to configure
34
33
 
35
34
  ```ruby
36
35
  Humid.configure do |config|
37
- # name of your webpacker pack. Defaults to "server_rendering.js"
38
- config.server_rendering_source = "server_rendering.js"
39
-
40
- # name of your webpacker pack source map. Defaults to `false`
41
- config.use_source_map = true
42
-
43
- # The logger instance. Defaults to `Logger.new(STDOUT)`
36
+ # Path to your build file located in `app/assets/build/`. You should use a
37
+ # separate build apart from your `application.js`.
38
+ # Required
39
+ config.application_path = "app/assets/build/server_rendering.js"
40
+
41
+ # Path to your source map file
42
+ # Optional
43
+ config.source_map_path = "app/assets/build/server_rendering.js.map"
44
+
45
+ # Raise errors if JS rendering failed. If false, the error will be
46
+ # logged out to Rails log and Humid.render will return an empty string
47
+ #
48
+ # Defaults to true.
49
+ config.raise_render_errors = Rails.env.development? || Rails.env.test?
50
+
51
+ # The logger instance.
44
52
  # `console.log` and friends (`warn`, `error`) are delegated to
45
53
  # the respective logger levels on the ruby side.
54
+ #
55
+ # Defaults to `Logger.new(STDOUT)`
46
56
  config.logger = Rails.logger
47
57
 
48
- # context_options. Options passed to mini_racer. Defaults to
49
- # empty.
50
- # config.context_options = {}
58
+ # Options passed to mini_racer.
59
+ #
60
+ # Defaults to empty `{}`.
51
61
  config.context_options = {
52
62
  timeout: 1000,
53
63
  ensure_gc_after_idle: 2000
@@ -55,16 +65,18 @@ Humid.configure do |config|
55
65
  end
56
66
 
57
67
  # Common development options
58
- # You may need to use single_threaded mode with Spring
59
- # MiniRacer::Platform.set_flags! :single_threaded
60
- #
61
- # If you're using Puma in single mode:
62
- # Humid.create_context
68
+ if Rails.env.development? || Rails.env.test?
69
+ # Use single_threaded mode for Spring and other forked envs.
70
+ MiniRacer::Platform.set_flags! :single_threaded
71
+
72
+ # If you're using Puma in single mode:
73
+ Humid.create_context
74
+ end
63
75
  ```
64
76
 
65
77
  If you'd like support for source map support, you will need to
66
- 1. Ensure `config.use_source_map` is set to `true`
67
- 2. Add the following to your `server_rendering.js` pack.
78
+ 1. Add the following to your entry file, e.g, `server_rendering.js`.
79
+ 2. set `config.source_map_path`.
68
80
 
69
81
  ```javascript
70
82
  require("source-map-support").install({
@@ -76,6 +88,7 @@ require("source-map-support").install({
76
88
  }
77
89
  });
78
90
  ```
91
+ A [sample] webpack.config is available for reference.
79
92
 
80
93
  ## The mini_racer environment.
81
94
 
@@ -95,46 +108,17 @@ The following functions are **not** available in the mini_racer environment
95
108
  `console.log` and friends (`info`, `error`, `warn`) are delegated to the
96
109
  respective methods on the configured logger.
97
110
 
98
- ### Webpacker
99
- You may need webpacker to create aliases for server friendly libraries that can
100
- not detect the `mini_racer` environment.
101
-
102
- ```diff
103
- // config/webpack/development.js
104
-
105
- process.env.NODE_ENV = process.env.NODE_ENV || 'development'
106
-
107
- const environment = require('./environment')
108
- +const path = require('path')
109
- +const ConfigObject = require('@rails/webpacker/package/config_types/config
110
-
111
- -module.exports = environment.toWebpackConfig()
112
- +const webConfig = environment.toWebpackConfig()
113
- +const ssrConfig = new ConfigObject(webConfig.toObject())
114
- +
115
- +ssrConfig.delete('entry')
116
- +ssrConfig.merge({
117
- + entry: {
118
- + server_rendering: webConfig.entry.server_rendering
119
- + },
120
- + resolve: {
121
- + alias: {
122
- + 'html-dom-parser': path.resolve(__dirname, '../../node_modules/html-dom-parser/lib/html-to-dom-server')
123
- + }
124
- + }
125
- +})
126
- +
127
- +delete webConfig.entry.server_rendering
128
- +module.exports = [ssrConfig, webConfig]
129
- ```
130
-
131
111
  ## Usage
132
112
 
133
- Pass your HTML render function to `setHumidRenderer`
113
+ In your entry file, e.g, `server_rendering.js`, pass your HTML render function
114
+ to `setHumidRenderer`. There is no need to require the function.
134
115
 
135
116
  ```javascript
117
+ // Set a factory function that will create a new instance of our app
118
+ // for each request.
136
119
  setHumidRenderer((json) => {
137
120
  const initialState = JSON.parse(json)
121
+
138
122
  return ReactDOMServer.renderToString(
139
123
  <Application initialPage={initialState}/>
140
124
  )
@@ -169,6 +153,48 @@ on_worker_shutdown do
169
153
  end
170
154
  ```
171
155
 
156
+ ### Server-side libraries that detect node.js envs.
157
+ You may need webpacker to create aliases for server friendly libraries that can
158
+ not detect the `mini_racer` environment. For example, in your `webpack.config.js`.
159
+
160
+ ```diff
161
+ ...
162
+ resolve: {
163
+ alias: {
164
+ 'html-dom-parser': path.resolve(__dirname, '../../node_modules/html-dom-parser/lib/html-to-dom-server')
165
+ }
166
+ }
167
+ ...
168
+ ```
169
+
170
+ ## Writing universal code
171
+ [Vue has a resource][vue_ssr] on how to write universal code. Below
172
+ are a few highlights that are important to keep in mind.
173
+
174
+ ### State
175
+
176
+ Humid uses a single context across multiple request. To avoid state pollution, we
177
+ provide a factory function to `setHumidRenderer` that builds a new app instance on
178
+ every call.
179
+
180
+ This provides better isolation, but as it is still a shared context, polluting
181
+ `global` is still possible. Be careful of modifying `global` in your code.
182
+
183
+ ### Polyfills
184
+
185
+ Polyfills will fail when using in the `mini_racer` environment because of missing
186
+ browser APIs. Account for this by moving the `require` to `componentDidMount`
187
+ in your component.
188
+
189
+ ```
190
+ componentDidMount() {
191
+ const dialogPolyfill = require('dialog-polyfill').default
192
+ dialogPolyfill.registerDialog(this.dialog.current)
193
+ this.dialog.current.open = this.props.open
194
+ this.dialog.current.showModal()
195
+ }
196
+ ```
197
+
172
198
  ## Contributing
173
199
 
174
200
  Please see [CONTRIBUTING.md](/CONTRIBUTING.md).
@@ -193,4 +219,5 @@ See [our other projects][community] or
193
219
  [community]: https://thoughtbot.com/community?utm_source=github
194
220
  [hire]: https://thoughtbot.com?utm_source=github
195
221
  [mini_racer]: https://github.com/rubyjs/mini_racer
196
- [webpacker]: https://github.com/rails/webpacker
222
+ [vue_ssr]: https://ssr.vuejs.org/
223
+ [sample]: ./webpack.config.js
data/lib/humid/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Humid
2
- VERSION = "0.0.4".freeze
2
+ VERSION = "0.0.6".freeze
3
3
  end
data/lib/humid.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require "mini_racer"
2
2
  require "logger"
3
- require "webpacker"
4
3
  require "active_support"
5
4
  require "active_support/core_ext"
6
5
  require "humid/log_subscriber"
@@ -14,16 +13,20 @@ module Humid
14
13
  class RenderError < StandardError
15
14
  end
16
15
 
17
- config_accessor :server_rendering_file do
18
- "server_rendering.js"
16
+ class FileNotFound < StandardError
19
17
  end
20
18
 
21
- config_accessor :use_source_map do
22
- false
19
+ @@context = nil
20
+
21
+ config_accessor :application_path
22
+ config_accessor :source_map_path
23
+
24
+ config_accessor :raise_render_errors do
25
+ true
23
26
  end
24
27
 
25
28
  config_accessor :logger do
26
- Logger.new(STDOUT)
29
+ Logger.new($stdout)
27
30
  end
28
31
 
29
32
  config_accessor :context_options do
@@ -54,27 +57,7 @@ module Humid
54
57
  JS
55
58
  end
56
59
 
57
- def handle_stale_files
58
- if Webpacker.compiler.stale?
59
- Webpacker.compiler.compile
60
- end
61
-
62
- public_path = Webpacker.config.public_path
63
- server_rendering_file = config.server_rendering_file
64
- source_path = public_path.join(Webpacker.manifest.lookup(server_rendering_file)[1..-1])
65
- filename = File.basename(source_path.to_s)
66
-
67
- if @@current_filename != filename
68
- dispose
69
- create_context
70
- end
71
- end
72
-
73
60
  def context
74
- if @@context && Webpacker.env.development?
75
- handle_stale_files
76
- end
77
-
78
61
  @@context
79
62
  end
80
63
 
@@ -86,7 +69,7 @@ module Humid
86
69
  end
87
70
 
88
71
  def create_context
89
- ctx = MiniRacer::Context.new(config.context_options)
72
+ ctx = MiniRacer::Context.new(**config.context_options)
90
73
  ctx.attach("console.log", proc { |err| logger.debug(err.to_s) })
91
74
  ctx.attach("console.info", proc { |err| logger.info(err.to_s) })
92
75
  ctx.attach("console.error", proc { |err| logger.error(err.to_s) })
@@ -97,13 +80,10 @@ module Humid
97
80
  js << renderer
98
81
  ctx.eval(js)
99
82
 
100
- public_path = Webpacker.config.public_path
101
- server_rendering_file = config.server_rendering_file
102
- server_rendering_map = "#{config.server_rendering_file}.map"
83
+ source_path = config.application_path
84
+ map_path = config.source_map_path
103
85
 
104
- source_path = public_path.join(Webpacker.manifest.lookup(server_rendering_file)[1..-1])
105
- map_path = public_path.join(Webpacker.manifest.lookup(server_rendering_map)[1..-1])
106
- if config.use_source_map
86
+ if map_path
107
87
  ctx.attach("readSourceMap", proc { File.read(map_path) })
108
88
  end
109
89
 
@@ -118,8 +98,15 @@ module Humid
118
98
  ActiveSupport::Notifications.instrument("render.humid") do
119
99
  context.call("__renderer", *args)
120
100
  rescue MiniRacer::RuntimeError => e
121
- message = ([e.message] + e.backtrace.filter {|x| x.starts_with? "JavaScript"}).join("\n")
122
- raise Humid::RenderError.new(message)
101
+ message = ([e.message] + e.backtrace.filter { |x| x.starts_with? "JavaScript" }).join("\n")
102
+ render_error = Humid::RenderError.new(message)
103
+
104
+ if config.raise_render_errors
105
+ raise render_error
106
+ else
107
+ config.logger.error(render_error.inspect)
108
+ ""
109
+ end
123
110
  end
124
111
  end
125
112
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: humid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johny Ho
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-23 00:00:00.000000000 Z
11
+ date: 2023-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: webpacker
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '4.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '4.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: mini_racer
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -44,70 +30,14 @@ dependencies:
44
30
  requirements:
45
31
  - - ">="
46
32
  - !ruby/object:Gem::Version
47
- version: '6.0'
33
+ version: '7.0'
48
34
  type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - ">="
53
39
  - !ruby/object:Gem::Version
54
- version: '6.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '12.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '12.0'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3.8'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3.8'
83
- - !ruby/object:Gem::Dependency
84
- name: byebug
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '9.0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '9.0'
97
- - !ruby/object:Gem::Dependency
98
- name: rails
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '6.0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '6.0'
40
+ version: '7.0'
111
41
  description: Javascript SSR rendering for Rails
112
42
  email: jho406@gmail.com
113
43
  executables: []
@@ -119,9 +49,6 @@ files:
119
49
  - lib/humid/controller_runtime.rb
120
50
  - lib/humid/log_subscriber.rb
121
51
  - lib/humid/version.rb
122
- - spec/controller_runtime_spec.rb
123
- - spec/log_subscriber_spec.rb
124
- - spec/render_spec.rb
125
52
  homepage: https://github.com/thoughtbot/humid/
126
53
  licenses:
127
54
  - MIT
@@ -141,11 +68,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
68
  - !ruby/object:Gem::Version
142
69
  version: '0'
143
70
  requirements: []
144
- rubygems_version: 3.1.2
71
+ rubygems_version: 3.4.6
145
72
  signing_key:
146
73
  specification_version: 4
147
74
  summary: Javascript SSR rendering for Rails
148
- test_files:
149
- - spec/render_spec.rb
150
- - spec/log_subscriber_spec.rb
151
- - spec/controller_runtime_spec.rb
75
+ test_files: []
@@ -1,79 +0,0 @@
1
- require_relative "./support/helper"
2
-
3
- describe Humid::ControllerRuntime do
4
- controller_runtime = Humid::ControllerRuntime
5
-
6
- def set_metric value
7
- Humid::LogSubscriber.runtime = value
8
- end
9
-
10
- def clear_metric!
11
- Humid::LogSubscriber.reset_runtime = 0
12
- end
13
-
14
- reference_controller_class = Class.new {
15
- def process_action *_
16
- @process_action = true
17
- end
18
-
19
- def cleanup_view_runtime *_
20
- @cleanup_view_runtime.call
21
- end
22
-
23
- def append_info_to_payload *_
24
- @append_info_to_payload = true
25
- end
26
-
27
- def self.log_process_action *_
28
- @log_process_action.call
29
- end
30
- }
31
-
32
- controller_class = Class.new reference_controller_class do
33
- include controller_runtime
34
-
35
- def logger
36
- Logger.new(STDOUT)
37
- end
38
- end
39
-
40
- let(:controller) { controller_class.new }
41
-
42
- it "resets the metric before each action" do
43
- set_metric 42
44
- controller.send(:process_action, "foo")
45
- expect(Humid::LogSubscriber.runtime).to be(0)
46
- expect(controller.instance_variable_get("@process_action")).to be(true)
47
- end
48
-
49
- it "strips the metric of other sources of the runtime" do
50
- set_metric 1
51
- controller.instance_variable_set "@cleanup_view_runtime", -> {
52
- controller.instance_variable_set "@cleanup_view_runtime", true
53
- set_metric 13
54
- 42
55
- }
56
- returned = controller.send :cleanup_view_runtime
57
- expect(controller.instance_variable_get("@cleanup_view_runtime")).to be(true)
58
- expect(controller.humid_runtime).to eq(14)
59
- expect(returned).to be(29)
60
- end
61
-
62
- it "appends the metric to payload" do
63
- payload = {}
64
- set_metric 42
65
- controller.send :append_info_to_payload, payload
66
- expect(controller.instance_variable_get("@append_info_to_payload")).to be(true)
67
- expect(payload[:humid_runtime]).to eq(42)
68
- end
69
-
70
- it "adds metric to log message" do
71
- controller_class.instance_variable_set "@log_process_action", -> {
72
- controller_class.instance_variable_set "@log_process_action", true
73
- []
74
- }
75
- messages = controller_class.log_process_action humid_runtime: 42.101
76
- expect(controller_class.instance_variable_get("@log_process_action")).to be(true)
77
- expect(messages).to eq(["Humid SSR: 42.1ms"])
78
- end
79
- end
@@ -1,54 +0,0 @@
1
- require_relative "./support/helper"
2
- require "active_support/log_subscriber/test_helper"
3
- require "byebug"
4
-
5
- RSpec.describe Humid::LogSubscriber do
6
- around(:each) do |example|
7
- app_path = File.expand_path("./testapp", File.dirname(__FILE__))
8
- Dir.chdir(app_path) do
9
- example.run
10
- end
11
- end
12
-
13
- before(:each) do
14
- Humid::LogSubscriber.reset_runtime
15
- end
16
-
17
- context ".runtime" do
18
- it "is returns the runtime from the thread local" do
19
- expect(Humid::LogSubscriber.runtime).to eql 0
20
- key = "attr_Humid::LogSubscriber_humid_runtime"
21
- Thread.current[key] = 3
22
- expect(Humid::LogSubscriber.runtime).to eql 3
23
- end
24
- end
25
-
26
- context ".runtime=" do
27
- it "sets the runtime in a thread-safe manner" do
28
- expect(Humid::LogSubscriber.runtime).to eql 0
29
- Humid::LogSubscriber.runtime = 3
30
- key = "attr_Humid::LogSubscriber_humid_runtime"
31
- expect(Thread.current[key]).to eql 3
32
- end
33
- end
34
-
35
- context ".reset_runtime" do
36
- it "resets the runtime" do
37
- Humid::LogSubscriber.runtime = 3
38
- key = "attr_Humid::LogSubscriber_humid_runtime"
39
- expect(Thread.current[key]).to eql 3
40
-
41
- Humid::LogSubscriber.reset_runtime
42
- expect(Thread.current[key]).to eql 0
43
- expect(Humid::LogSubscriber.runtime).to eql 0
44
- end
45
- end
46
-
47
- it "is attached" do
48
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
49
- Humid.create_context
50
- expect(Humid::LogSubscriber.runtime).to eql(0)
51
- Humid.render
52
- expect(Humid::LogSubscriber.runtime).to be > 0
53
- end
54
- end
data/spec/render_spec.rb DELETED
@@ -1,162 +0,0 @@
1
- require_relative "./support/helper"
2
-
3
- RSpec.describe "Humid" do
4
- around(:each) do |example|
5
- app_path = File.expand_path("./testapp", File.dirname(__FILE__))
6
- Dir.chdir(app_path) do
7
- example.run
8
- end
9
- end
10
-
11
- describe "create_context" do
12
- after(:each) do
13
- Humid.dispose
14
- end
15
-
16
- it "creates a context with initial js" do
17
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
18
- Humid.create_context
19
-
20
- expect(Humid.context).to be_kind_of(MiniRacer::Context)
21
- end
22
-
23
- it "does not have timeouts, immediates, and intervals" do
24
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
25
-
26
- Humid.create_context
27
-
28
- expect {
29
- Humid.context.eval("setTimeout()")
30
- }.to raise_error(MiniRacer::RuntimeError, "ReferenceError: setTimeout is not defined")
31
- expect {
32
- Humid.context.eval("setInterval()")
33
- }.to raise_error(MiniRacer::RuntimeError, "ReferenceError: setInterval is not defined")
34
- expect {
35
- Humid.context.eval("clearTimeout()")
36
- }.to raise_error(MiniRacer::RuntimeError, "ReferenceError: clearTimeout is not defined")
37
- expect {
38
- Humid.context.eval("setImmediate()")
39
- }.to raise_error(MiniRacer::RuntimeError, "ReferenceError: setImmediate is not defined")
40
- expect {
41
- Humid.context.eval("clearImmediate()")
42
- }.to raise_error(MiniRacer::RuntimeError, "ReferenceError: clearImmediate is not defined")
43
- end
44
-
45
- it "proxies to Rails logger" do
46
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
47
- Humid.create_context
48
- expect(Humid.logger).to receive(:info).with("hello")
49
-
50
- Humid.context.eval("console.info('hello')")
51
- end
52
- end
53
-
54
- describe "context" do
55
- it "returns the created context" do
56
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
57
-
58
- Humid.create_context
59
-
60
- expect(Humid.context).to be_kind_of(MiniRacer::Context)
61
- end
62
-
63
- context "when the js is stale and env is NOT dev`" do
64
- it "does not recompile the JS" do
65
- allow(Webpacker).to receive_message_chain("env.development?") { false }
66
- allow(Webpacker).to receive_message_chain("compiler.stale?") { true }
67
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
68
-
69
- Humid.create_context
70
- prev_context = Humid.context
71
- expect(prev_context).to be_kind_of(MiniRacer::Context)
72
-
73
- allow(Webpacker).to receive_message_chain("compiler.stale?") { true }
74
-
75
- next_context = Humid.context
76
-
77
- expect(prev_context).to eql(next_context)
78
- expect(next_context).to be_kind_of(MiniRacer::Context)
79
- end
80
- end
81
-
82
- context "when the env is development" do
83
- it "compiles the JS when stale" do
84
- allow(Webpacker).to receive_message_chain("env.development?") { true }
85
- allow(Webpacker).to receive_message_chain("compiler.stale?") { true }
86
- allow(Webpacker).to receive_message_chain("compiler.compile")
87
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
88
-
89
- Humid.create_context
90
- prev_context = Humid.context
91
- expect(prev_context).to be_kind_of(MiniRacer::Context)
92
-
93
- allow(Webpacker).to receive_message_chain("compiler.stale?") { true }
94
- # This simulates a changing file
95
- allow(Humid.config).to receive("server_rendering_file") { "simple_changed.js" }
96
-
97
- next_context = Humid.context
98
-
99
- expect(prev_context).to_not eql(next_context)
100
- expect(next_context).to be_kind_of(MiniRacer::Context)
101
- end
102
-
103
- it "creates a new context when webpack-devserver already handled JS staleness" do
104
- allow(Webpacker).to receive_message_chain("env.development?") { true }
105
- allow(Webpacker).to receive_message_chain("compiler.stale?") { true }
106
- allow(Webpacker).to receive_message_chain("compiler.compile")
107
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
108
-
109
- Humid.create_context
110
- prev_context = Humid.context
111
- expect(Humid.render).to eql("hello")
112
- expect(prev_context).to be_kind_of(MiniRacer::Context)
113
-
114
- allow(Webpacker).to receive_message_chain("compiler.stale?") { false }
115
- # This simulates a changing file
116
- allow(Humid.config).to receive("server_rendering_file") { "simple_changed.js" }
117
-
118
- next_context = Humid.context
119
-
120
- expect(prev_context).to_not eql(next_context)
121
- expect(next_context).to be_kind_of(MiniRacer::Context)
122
- expect(Humid.render).to eql("hello changed")
123
- end
124
- end
125
- end
126
-
127
- describe "render" do
128
- it "returns a js output" do
129
- allow(Humid.config).to receive("server_rendering_file") { "simple.js" }
130
- Humid.create_context
131
-
132
- expect(Humid.render).to eql("hello")
133
- end
134
-
135
- it "applys args to the func" do
136
- allow(Humid.config).to receive("server_rendering_file") { "args.js" }
137
- Humid.create_context
138
-
139
- args = ["a", 1, 2, [], {}]
140
-
141
- expect(Humid.render(*args)).to eql({"0" => "a", "1" => 1, "2" => 2, "3" => [], "4" => {}})
142
- end
143
-
144
- it "can use source maps to see errors" do
145
- allow(Humid.config).to receive("server_rendering_file") { "reporting.js" }
146
- allow(Humid.config).to receive("use_source_map") { true }
147
-
148
- Humid.create_context
149
-
150
- expect {
151
- Humid.render
152
- }.to raise_error { |error|
153
- expect(error).to be_a(Humid::RenderError)
154
- message = error.message.split("\n")
155
- expect(message[0]).to eql("Error: ^^ Look! These stack traces map to the actual source code :)")
156
- expect(message[1]).to eql("JavaScript at throwSomeError (/webpack:/app/javascript/packs/components/error-causing-component.js:2:1)")
157
- expect(message[2]).to eql("JavaScript at ErrorCausingComponent (/webpack:/app/javascript/packs/components/error-causing-component.js:8:1)")
158
- expect(message[3]).to eql("JavaScript at /webpack:/app/javascript/packs/reporting.js:18:1")
159
- }
160
- end
161
- end
162
- end