Skip to content

Commit dadd84c

Browse files
authored
Merge pull request #722 from robinweser/targetDocument-support
Support for targetDocument
2 parents b18559a + b956c3e commit dadd84c

9 files changed

Lines changed: 52 additions & 31 deletions

File tree

packages/fela-bindings/src/RendererProviderFactory.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
import { render, rehydrate } from 'fela-dom'
33
import objectEach from 'fast-loops/lib/objectEach'
44

5-
function hasDOM(renderer) {
5+
function hasDOM(renderer, targetDocument = document) {
66
return (
77
renderer &&
88
!renderer.isNativeRenderer &&
99
typeof window !== 'undefined' &&
10-
window.document &&
11-
window.document.createElement
10+
targetDocument &&
11+
targetDocument.createElement
1212
)
1313
}
1414

15-
function hasServerRenderedStyle() {
16-
return window.document.querySelectorAll('[data-fela-type]').length > 0
15+
function hasServerRenderedStyle(targetDocument = document) {
16+
return targetDocument.querySelectorAll('[data-fela-type]').length > 0
1717
}
1818

1919
export default function RendererProviderFactory(
@@ -27,11 +27,26 @@ export default function RendererProviderFactory(
2727
constructor(props: Object, context: Object) {
2828
super(props, context)
2929

30-
if (hasDOM(props.renderer)) {
31-
if (props.rehydrate && hasServerRenderedStyle()) {
32-
rehydrate(props.renderer)
30+
this._renderStyle()
31+
}
32+
33+
componentDidUpdate(prevProps) {
34+
// TODO: we might add a shallow compare to avoid unnecessary rerenders
35+
this._renderStyle()
36+
}
37+
38+
_renderStyle() {
39+
const {
40+
renderer,
41+
rehydrate: shouldRehydrate,
42+
targetDocument,
43+
} = this.props
44+
45+
if (hasDOM(renderer, targetDocument)) {
46+
if (shouldRehydrate && hasServerRenderedStyle(targetDocument)) {
47+
rehydrate(renderer, targetDocument)
3348
} else {
34-
render(props.renderer)
49+
render(renderer, targetDocument)
3550
}
3651
}
3752
}

packages/fela-dom/src/dom/connection/createNode.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ import type { NodeAttributes } from '../../../../../flowtypes/DOMNode'
66
export default function createNode(
77
nodes: Object,
88
score: number,
9-
{ type, media, support }: NodeAttributes
9+
{ type, media, support }: NodeAttributes,
10+
targetDocument: any = document
1011
): Object {
11-
const head = document.head || {}
12+
const head = targetDocument.head || {}
1213

13-
const node = document.createElement('style')
14+
const node = targetDocument.createElement('style')
1415
node.setAttribute('data-fela-type', type)
1516
node.type = 'text/css'
1617

packages/fela-dom/src/dom/connection/createSubscription.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ import insertRule from './insertRule'
1515

1616
import type { DOMRenderer } from '../../../../../flowtypes/DOMRenderer'
1717

18-
export default function createSubscription(renderer: DOMRenderer): Function {
18+
export default function createSubscription(
19+
renderer: DOMRenderer,
20+
targetDocument: any = document
21+
): Function {
1922
return change => {
2023
if (change.type === CLEAR_TYPE) {
2124
objectEach(renderer.nodes, ({ node }) =>
@@ -27,7 +30,7 @@ export default function createSubscription(renderer: DOMRenderer): Function {
2730
return
2831
}
2932

30-
const node = getNodeFromCache(change, renderer)
33+
const node = getNodeFromCache(change, renderer, targetDocument)
3134

3235
switch (change.type) {
3336
case KEYFRAME_TYPE:

packages/fela-dom/src/dom/connection/getNodeFromCache.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ function getReference({
1616

1717
export default function getNodeFromCache(
1818
attributes: NodeAttributes,
19-
renderer: DOMRenderer
19+
renderer: DOMRenderer,
20+
targetDocument: any = document
2021
): Object {
2122
const reference = getReference(attributes)
2223

2324
if (!renderer.nodes[reference]) {
2425
const score = calculateNodeScore(attributes, renderer.mediaQueryOrder)
2526
const node =
26-
queryNode(attributes) || createNode(renderer.nodes, score, attributes)
27+
queryNode(attributes, targetDocument) ||
28+
createNode(renderer.nodes, score, attributes, targetDocument)
2729

2830
renderer.nodes[reference] = {
2931
node,

packages/fela-dom/src/dom/connection/queryNode.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import type { NodeAttributes } from '../../../../../flowtypes/DOMNode'
33

44
export default function queryNode(
55
{ type, media, support }: NodeAttributes,
6-
id?: string = ''
6+
targetDocument: any = document
77
): ?Object {
88
const mediaQuery = media ? `[media="${media}"]` : ':not([media])'
99
const supportQuery = support
1010
? '[data-fela-support="true"]'
1111
: ':not([data-fela-support="true"])'
1212

13-
return document.querySelector(
13+
return targetDocument.querySelector(
1414
`[data-fela-type="${type}"]${supportQuery}${mediaQuery}`
1515
)
1616
}

packages/fela-dom/src/dom/rehydrate.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ const CLASSNAME_REGEX = /[.][a-z0-9_-]*/gi
1414

1515
// rehydration (WIP)
1616
// TODO: static, keyframe, font
17-
export default function rehydrate(renderer: DOMRenderer): void {
18-
render(renderer)
17+
export default function rehydrate(
18+
renderer: DOMRenderer,
19+
targetDocument: any = document
20+
): void {
21+
render(renderer, targetDocument)
1922

20-
arrayEach(document.querySelectorAll('[data-fela-type]'), node => {
23+
arrayEach(targetDocument.querySelectorAll('[data-fela-type]'), node => {
2124
const rehydrationAttribute =
2225
node.getAttribute('data-fela-rehydration') || -1
2326
const rehydrationIndex =

packages/fela-dom/src/dom/render.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import createSubscription from './connection/createSubscription'
55

66
import type { DOMRenderer } from '../../../../flowtypes/DOMRenderer'
77

8-
export default function render(renderer: DOMRenderer): void {
8+
export default function render(
9+
renderer: DOMRenderer,
10+
targetDocument?: any
11+
): void {
912
if (!renderer.updateSubscription) {
1013
renderer.scoreIndex = {}
1114
renderer.nodes = {}
1215

13-
renderer.updateSubscription = createSubscription(renderer)
16+
renderer.updateSubscription = createSubscription(renderer, targetDocument)
1417
renderer.subscribe(renderer.updateSubscription)
1518

1619
// simulate rendering to ensure all styles rendered prior to

packages/fela/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ Don't want to miss any update? Follow us on [Twitter](https://twitter.com/felajs
211211
- [Kilix](http://kilix.fr)
212212
- [Lusk](https://lusk.io)
213213
- [MediaFire](https://m.mediafire.com)
214+
- [Microsoft](https://microsoft.com)
214215
- [N26](https://n26.com)
215216
- [Net-A-Porter](https://www.net-a-porter.com/gb/en/porter)
216217
- [NinjaConcept](https://www.ninjaconcept.com)

yarn.lock

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7216,13 +7216,6 @@ fela-dom@4.2.6:
72167216
version "4.2.6"
72177217
resolved "https://registry.yarnpkg.com/fela-dom/-/fela-dom-4.2.6.tgz#fb8b618a3cb9e87a4ae15c438389a2a7057ebb31"
72187218

7219-
fela-plugin-extend@^5.0.11:
7220-
version "5.0.12"
7221-
resolved "https://registry.yarnpkg.com/fela-plugin-extend/-/fela-plugin-extend-5.0.12.tgz#f3065fd0dc25e586c4e23a67448657c35a573ec0"
7222-
dependencies:
7223-
css-in-js-utils "2.0.0"
7224-
fela-utils "^7.0.4"
7225-
72267219
fela-plugin-lvha@^5.0.16:
72277220
version "5.0.16"
72287221
resolved "https://registry.yarnpkg.com/fela-plugin-lvha/-/fela-plugin-lvha-5.0.16.tgz#f20cb7d73755ea123fb87acf19a5aca38001d72b"
@@ -7235,7 +7228,7 @@ fela-plugin-named-media-query@^5.0.13:
72357228
dependencies:
72367229
fela-utils "^7.0.5"
72377230

7238-
fela-utils@^7.0.4, fela-utils@^7.0.5:
7231+
fela-utils@^7.0.5:
72397232
version "7.0.5"
72407233
resolved "https://registry.yarnpkg.com/fela-utils/-/fela-utils-7.0.5.tgz#62397db8abf8294bb160ba7575b31d68495283b2"
72417234
dependencies:

0 commit comments

Comments
 (0)