quilt_rails 1.11.1 → 1.12.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.
- checksums.yaml +4 -4
- data/README.md +44 -42
- data/lib/quilt_rails/react_renderable.rb +11 -7
- data/lib/quilt_rails/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 801ba2d2d619ae8c7a6714bf69f06a8edeb2ae7edc1d0255f8e9df57755be211
|
4
|
+
data.tar.gz: bc17c1c983af45c573a589c1c9ae84d241b1af242a996d33998aa360ef560ae7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3f14ae99c0e106a9b3a71606c7489c20c99446a91e8ddfe20ed7b294bab50a358927cb6f6e70ed295b814fe7b520039e7f14dcb68cb1a2d7395b934f92f3c3d
|
7
|
+
data.tar.gz: 21b493fecf60259353c8df068c219d51de3eb3859cf4889bc8f44b6c4ea8f2993c6e08d1f58dad0585bf98d9f10128a4001e651528afb779d3008f5b8ca902b1
|
data/README.md
CHANGED
@@ -11,6 +11,7 @@ A turn-key solution for integrating Quilt client-side libraries into your Rails
|
|
11
11
|
- [Generate Quilt boilerplate](#generate-quilt-boilerplate)
|
12
12
|
- [Try it out](#try-it-out)
|
13
13
|
- [Manual Install](#manual-installation)
|
14
|
+
- [Generate Rails boilerplate](#generate-rails-boilerplate)
|
14
15
|
- [Install Dependencies](#install-dependencies)
|
15
16
|
- [Setup the Rails app](#setup-the-rails-app)
|
16
17
|
- [Add JavaScript](#add-javascript)
|
@@ -21,6 +22,7 @@ A turn-key solution for integrating Quilt client-side libraries into your Rails
|
|
21
22
|
- [Interacting with the request and response in React code](#interacting-with-the-request-and-response-in-react-code)
|
22
23
|
- [Dealing with isomorphic state](#dealing-with-isomorphic-state)
|
23
24
|
- [Customizing the node server](#customizing-the-node-server)
|
25
|
+
- [Fixing rejected CSRF tokens for new user sessions](#fixing-rejected-csrf-tokens-for-new-user-sessions)
|
24
26
|
- [Performance tracking a React app](#performance-tracking-a-react-app)
|
25
27
|
- [Install dependencies](#install-dependencies)
|
26
28
|
- [Setup an endpoint for performance reports](setup-an-endpoint-for-performance-reports)
|
@@ -80,7 +82,10 @@ This will install the Node dependencies, provide a basic React app (in TypeScrip
|
|
80
82
|
|
81
83
|
#### Try it out
|
82
84
|
|
83
|
-
|
85
|
+
```sh
|
86
|
+
dev up
|
87
|
+
dev server
|
88
|
+
```
|
84
89
|
|
85
90
|
Will run the application, starting up both servers and compiling assets.
|
86
91
|
|
@@ -88,6 +93,8 @@ Will run the application, starting up both servers and compiling assets.
|
|
88
93
|
|
89
94
|
An application can also be setup manually using the following steps.
|
90
95
|
|
96
|
+
[Generate Rails boilerplate](#generate-rails-boilerplate)
|
97
|
+
|
91
98
|
#### Install dependencies
|
92
99
|
|
93
100
|
```sh
|
@@ -100,6 +107,25 @@ yarn add @shopify/sewing-kit @shopify/react-server
|
|
100
107
|
# Add React
|
101
108
|
yarn add react react-dom
|
102
109
|
|
110
|
+
# Add Typescript
|
111
|
+
yarn add typescript @types/react @types/react-dom
|
112
|
+
```
|
113
|
+
|
114
|
+
##### Define typescript config
|
115
|
+
|
116
|
+
```json
|
117
|
+
// tsconfig.json
|
118
|
+
{
|
119
|
+
"extends": "@shopify/typescript-configs/application.json",
|
120
|
+
"compilerOptions": {
|
121
|
+
"baseUrl": ".",
|
122
|
+
"rootDir": "."
|
123
|
+
},
|
124
|
+
"include": ["app/ui"]
|
125
|
+
}
|
126
|
+
```
|
127
|
+
|
128
|
+
```sh
|
103
129
|
yarn
|
104
130
|
dev up
|
105
131
|
```
|
@@ -303,67 +329,45 @@ function App() {
|
|
303
329
|
export default App;
|
304
330
|
```
|
305
331
|
|
306
|
-
##### Example: sending
|
332
|
+
##### Example: sending custom data from Rails controller
|
333
|
+
|
334
|
+
In some cases you may want to send custom headers or basic data from Rails to your React server. Quilt facilitates this case by providing consumers with a `headers` and `data` argument on the `render_react` call.
|
335
|
+
|
336
|
+
**Note:** The data passed should be data that is unlikely or will never change over the course of the session before they render any React components.
|
307
337
|
|
308
338
|
```ruby
|
309
339
|
class ReactController < ApplicationController
|
310
340
|
include Quilt::ReactRenderable
|
311
341
|
|
312
342
|
def index
|
313
|
-
render_react(headers: {
|
343
|
+
render_react(headers: {'x-custom-header': 'header-value-a'}, data: {'some_id': 123})
|
314
344
|
end
|
315
345
|
end
|
316
346
|
```
|
317
347
|
|
318
|
-
|
319
|
-
|
320
|
-
```tsx
|
321
|
-
// app/ui/foundation/CustomUniversalProvider.tsx
|
322
|
-
import {createContext} from 'react';
|
323
|
-
import {createUniversalProvider} from '@shopify/react-universal-provider';
|
324
|
-
|
325
|
-
export const CustomContext = createContext<string | null>(null);
|
326
|
-
export const CustomUniversalProvider = createUniversalProvider('custom-key', CustomContext);
|
327
|
-
```
|
348
|
+
The React server will serialize the provided quilt data using `x-quilt-data` as the ID. You can then get this serialized data on the client with `getSerialized` from `@shopify/react-html`.
|
328
349
|
|
329
350
|
```tsx
|
330
351
|
// app/ui/index.tsx
|
331
352
|
|
332
353
|
import React from 'react';
|
333
|
-
import {
|
334
|
-
|
335
|
-
|
354
|
+
import {getSerialized} from '@shopify/react-html';
|
355
|
+
|
356
|
+
const IS_CLIENT = typeof window !== 'undefined';
|
336
357
|
|
337
358
|
function App() {
|
338
|
-
// get `x-
|
339
|
-
const
|
359
|
+
// get `x-quilt-data` from the request that was sent through Rails ReactController
|
360
|
+
const quiltData = IS_CLIENT ? getSerialized<{[key: string]: any}>('x-quilt-data') : null;
|
340
361
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
</CustomUniversalProvider>
|
346
|
-
);
|
362
|
+
// Logs {"x-custom-header":"header-value-a","some_id":123}
|
363
|
+
console.log(quiltData);
|
364
|
+
|
365
|
+
return <h1>Data: {quiltData}</h1>;
|
347
366
|
}
|
348
367
|
|
349
368
|
export default App;
|
350
369
|
```
|
351
370
|
|
352
|
-
```tsx
|
353
|
-
// app/ui/components/ComponentWithCustomHeader.tsx
|
354
|
-
|
355
|
-
import React, {useContext} from 'react';
|
356
|
-
import {CustomContext} from '../foundation/CustomUniversalProvider';
|
357
|
-
|
358
|
-
export function ComponentWithCustomHeader() {
|
359
|
-
// get `x-custom-header` from serialized context
|
360
|
-
// will be 'header-value-a' in this example
|
361
|
-
const customHeader = useContext(CustomContext);
|
362
|
-
|
363
|
-
return <span>{customHeader}</span>;
|
364
|
-
}
|
365
|
-
```
|
366
|
-
|
367
371
|
##### Example: redirecting
|
368
372
|
|
369
373
|
```tsx
|
@@ -424,7 +428,7 @@ class GraphqlController < ApplicationController
|
|
424
428
|
end
|
425
429
|
```
|
426
430
|
|
427
|
-
If your API **does** require session data, you
|
431
|
+
If your API **does** require session data, you can follow these steps:
|
428
432
|
|
429
433
|
- Add an `x-shopify-react-xhr` header to all GraphQL requests with a value of 1 (this is done automatically if you are using `@shopify/react-graphql-universal-provider`)
|
430
434
|
- Add a `protect_from_forgery with: Quilt::HeaderCsrfStrategy` override to your controllers
|
@@ -445,8 +449,6 @@ class GraphqlController < ApplicationController
|
|
445
449
|
end
|
446
450
|
```
|
447
451
|
|
448
|
-
-
|
449
|
-
|
450
452
|
## Performance tracking a React app
|
451
453
|
|
452
454
|
Using [`Quilt::Performance::Reportable`](#performanceReportable) and [@shopify/react-performance](https://www.npmjs.com/package/@shopify/react-performance) it's easy to add performance tracking to apps using[`sewing_kit`](https://github.com/Shopify/sewing-kit/tree/master/gems/sewing_kit#sewing_kit-) for client-side-rendering or `quilt_rails` for server-side-rendering.
|
@@ -6,29 +6,29 @@ module Quilt
|
|
6
6
|
module ReactRenderable
|
7
7
|
include ReverseProxy::Controller
|
8
8
|
|
9
|
-
def render_react(headers: {})
|
9
|
+
def render_react(headers: {}, data: {})
|
10
10
|
raise DoNotIntegrationTestError if Rails.env.test?
|
11
11
|
|
12
12
|
# Allow concurrent loading to prevent this thread from blocking class
|
13
13
|
# loading in controllers called by the Node server.
|
14
14
|
ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
|
15
|
-
call_proxy(headers)
|
15
|
+
call_proxy(headers, data)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
-
def call_proxy(headers)
|
21
|
+
def call_proxy(headers, data)
|
22
22
|
if defined? ShopifySecurityBase
|
23
23
|
ShopifySecurityBase::HTTPHostRestriction.whitelist([Quilt.configuration.react_server_host]) do
|
24
|
-
proxy(headers)
|
24
|
+
proxy(headers, data)
|
25
25
|
end
|
26
26
|
else
|
27
|
-
proxy(headers)
|
27
|
+
proxy(headers, data)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
def proxy(headers)
|
31
|
+
def proxy(headers, data)
|
32
32
|
url = "#{Quilt.configuration.react_server_protocol}://#{Quilt.configuration.react_server_host}"
|
33
33
|
Quilt::Logger.log("[ReactRenderable] proxying to React server at #{url}")
|
34
34
|
|
@@ -37,7 +37,11 @@ module Quilt
|
|
37
37
|
end
|
38
38
|
|
39
39
|
begin
|
40
|
-
|
40
|
+
|
41
|
+
reverse_proxy(
|
42
|
+
url,
|
43
|
+
headers: headers.merge('X-CSRF-Token': form_authenticity_token, 'X-Quilt-Data': headers.merge(data).to_json)
|
44
|
+
) do |callbacks|
|
41
45
|
callbacks.on_response do |status_code, _response|
|
42
46
|
Quilt::Logger.log("[ReactRenderable] #{url} returned #{status_code}")
|
43
47
|
end
|
data/lib/quilt_rails/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quilt_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathew Allen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|