sku 13.1.2 → 13.2.0-debug-babel-loader-20240925035914
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.
- package/CHANGELOG.md +49 -0
- package/config/webpack/statsConfig.js +1 -0
- package/entry/render/index.js +3 -0
- package/entry/render/render-to-string.js +90 -0
- package/package.json +7 -3
- package/sku-types.d.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# sku
|
|
2
2
|
|
|
3
|
+
## 13.2.0-debug-babel-loader-20240925035914
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Add experimental `renderToStringAsync` parameter in `renderApp` ([#1050](https://github.com/seek-oss/sku/pull/1050))
|
|
8
|
+
|
|
9
|
+
The new `renderToStringAsync` method can be called instead of React DOM's `renderToString`. It is an asynchronous function, but once awaited should return the same result.
|
|
10
|
+
|
|
11
|
+
This new function won't error when hitting suspended components during a static render, instead it'll wait for all suspended boundaries to resolve.
|
|
12
|
+
|
|
13
|
+
**Note:** `react-dom` is now an optional peer dependency for use in this function. All known uses of static rendering use `react-dom` and shouldn't need to make a change.
|
|
14
|
+
|
|
15
|
+
The function is being provided to enable teams to trial the behaviour, but is not encouraged for production use.
|
|
16
|
+
|
|
17
|
+
```diff
|
|
18
|
+
-import { renderToString } from 'react-dom/server';
|
|
19
|
+
|
|
20
|
+
const skuRender: Render<RenderContext> = {
|
|
21
|
+
- renderApp: ({ SkuProvider, environment }) => {
|
|
22
|
+
+ renderApp: async ({ SkuProvider, environment, renderToStringAsync }) => {
|
|
23
|
+
- const appHtml = renderToString(
|
|
24
|
+
+ const appHtml = await renderToStringAsync(
|
|
25
|
+
<SkuProvider>
|
|
26
|
+
<App environment={environment as ClientContext['environment']} />
|
|
27
|
+
</SkuProvider>,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
appHtml,
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
// ...
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This new feature is experimental, and is likely to change in implementation or may be removed completely.
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- Enable `babel-loader` debug logs (86edc31182b914c8bdd9ee75163520c5d0f3865b)
|
|
43
|
+
|
|
44
|
+
## 13.1.3
|
|
45
|
+
|
|
46
|
+
### Patch Changes
|
|
47
|
+
|
|
48
|
+
- Reverts #1039 ([#1053](https://github.com/seek-oss/sku/pull/1053))
|
|
49
|
+
|
|
50
|
+
This change was causing a dependency to be cloned via `git` which may not be available in all CI envrionments.
|
|
51
|
+
|
|
3
52
|
## 13.1.2
|
|
4
53
|
|
|
5
54
|
### Patch Changes
|
package/entry/render/index.js
CHANGED
|
@@ -5,6 +5,8 @@ import makeExtractor from '../makeExtractor';
|
|
|
5
5
|
import clientContextKey from '../clientContextKey';
|
|
6
6
|
import createCSPHandler from '../csp';
|
|
7
7
|
|
|
8
|
+
import { renderToStringAsync } from './render-to-string';
|
|
9
|
+
|
|
8
10
|
import render from '__sku_alias__renderEntry';
|
|
9
11
|
|
|
10
12
|
const libraryName = __SKU_LIBRARY_NAME__;
|
|
@@ -37,6 +39,7 @@ export default async (renderParams) => {
|
|
|
37
39
|
...renderContext,
|
|
38
40
|
_addChunk: (chunkName) => extractor.addChunk(chunkName),
|
|
39
41
|
SkuProvider,
|
|
42
|
+
renderToStringAsync,
|
|
40
43
|
});
|
|
41
44
|
if (renderContext.language) {
|
|
42
45
|
debug('sku:render:language')(
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Writable } from 'node:stream';
|
|
2
|
+
|
|
3
|
+
import debug from 'debug';
|
|
4
|
+
import { renderToPipeableStream } from 'react-dom/server';
|
|
5
|
+
|
|
6
|
+
const RENDER_TIMEOUT_MS = 5000;
|
|
7
|
+
|
|
8
|
+
let hasWarned = false;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Renders a React node to a string in a way that is compatible with Suspense and async rendering.
|
|
12
|
+
* Will await all Suspense boundaries before resolving the promise.
|
|
13
|
+
* @returns Promise that resolves with the rendered HTML string.
|
|
14
|
+
*/
|
|
15
|
+
export function renderToStringAsync(reactNode) {
|
|
16
|
+
if (!hasWarned) {
|
|
17
|
+
console.log(
|
|
18
|
+
"Warning: The use of `renderApp`'s `renderToStringAsync` parameter is experimental. Its API and behaviour may change, and you may experience unexpected behaviours.",
|
|
19
|
+
);
|
|
20
|
+
hasWarned = true;
|
|
21
|
+
}
|
|
22
|
+
debug('sku:render:renderToStringAsync')('Starting render');
|
|
23
|
+
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
let hasErrored = false;
|
|
26
|
+
let hasRendered = false;
|
|
27
|
+
|
|
28
|
+
const { pipe, abort } = renderToPipeableStream(reactNode, {
|
|
29
|
+
onShellError(error) {
|
|
30
|
+
// A Shell Error is unrecoverable. Reject so that Error handling can resolve the response.
|
|
31
|
+
debug('sku:render:renderToStringAsync')('Shell Render Error:', error);
|
|
32
|
+
hasErrored = true;
|
|
33
|
+
reject(error);
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
onError(error) {
|
|
37
|
+
// Non-shell errors are recoverable. HTML shell can still be returned.
|
|
38
|
+
debug('sku:render:renderToStringAsync')('Render Error:', error);
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
onShellReady() {
|
|
42
|
+
debug('sku:render:renderToStringAsync')('Shell Ready: No action');
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
async onAllReady() {
|
|
46
|
+
debug('sku:render:renderToStringAsync')(
|
|
47
|
+
'All Ready: Ready to stream to string',
|
|
48
|
+
);
|
|
49
|
+
startStreamToString();
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
setTimeout(() => {
|
|
54
|
+
if (hasErrored || hasRendered) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
debug('sku:render:renderToStringAsync')(
|
|
59
|
+
`Timeout after having not errored or rendered in ${RENDER_TIMEOUT_MS}ms`,
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
abort(
|
|
63
|
+
'Timeout during Render. Render did not complete in time. You may may have a hanging promise or perpetually suspended component.',
|
|
64
|
+
);
|
|
65
|
+
}, RENDER_TIMEOUT_MS);
|
|
66
|
+
|
|
67
|
+
function startStreamToString() {
|
|
68
|
+
if (hasErrored) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
debug('sku:render:renderToStringAsync')('Starting streaming to string');
|
|
72
|
+
hasRendered = true;
|
|
73
|
+
let html = '';
|
|
74
|
+
const stream = new Writable({
|
|
75
|
+
write(chunk, _encoding, callback) {
|
|
76
|
+
html += chunk.toString();
|
|
77
|
+
callback();
|
|
78
|
+
},
|
|
79
|
+
destroy(callback) {
|
|
80
|
+
debug('sku:render:renderToStringAsync')(
|
|
81
|
+
'Stream ended. Returning HTML',
|
|
82
|
+
);
|
|
83
|
+
resolve(html);
|
|
84
|
+
callback();
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
pipe(stream);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sku",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.2.0-debug-babel-loader-20240925035914",
|
|
4
4
|
"description": "Front-end development toolkit, powered by Webpack, Babel, Vanilla Extract and Jest",
|
|
5
5
|
"types": "./sku-types.d.ts",
|
|
6
6
|
"bin": {
|
|
@@ -35,11 +35,15 @@
|
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"@storybook/react-webpack5": "^7.0.0 || ^8.0.0",
|
|
37
37
|
"@types/react": "^17.0.0 || ^18.0.0",
|
|
38
|
-
"react": "^17.0.0 || ^18.0.0"
|
|
38
|
+
"react": "^17.0.0 || ^18.0.0",
|
|
39
|
+
"react-dom": "^17.0.0 || ^18.0.0"
|
|
39
40
|
},
|
|
40
41
|
"peerDependenciesMeta": {
|
|
41
42
|
"@storybook/react-webpack5": {
|
|
42
43
|
"optional": true
|
|
44
|
+
},
|
|
45
|
+
"react-dom": {
|
|
46
|
+
"optional": true
|
|
43
47
|
}
|
|
44
48
|
},
|
|
45
49
|
"dependencies": {
|
|
@@ -67,7 +71,7 @@
|
|
|
67
71
|
"@vocab/phrase": "^2.0.1",
|
|
68
72
|
"@vocab/pseudo-localize": "^1.0.1",
|
|
69
73
|
"@vocab/webpack": "^1.2.9",
|
|
70
|
-
"@zendesk/babel-plugin-react-displayname": "https://github.com/zendesk/babel-plugin-react-displayname.
|
|
74
|
+
"@zendesk/babel-plugin-react-displayname": "https://codeload.github.com/zendesk/babel-plugin-react-displayname/tar.gz/7a837f2",
|
|
71
75
|
"autoprefixer": "^10.3.1",
|
|
72
76
|
"babel-jest": "^29.0.0",
|
|
73
77
|
"babel-loader": "^9.1.2",
|
package/sku-types.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ interface SharedRenderProps {
|
|
|
42
42
|
interface RenderAppProps extends SharedRenderProps {
|
|
43
43
|
SkuProvider: ({ children }: { children: ReactNode }) => JSX.Element;
|
|
44
44
|
_addChunk: (chunkName: string) => void;
|
|
45
|
+
renderToStringAsync: (element: ReactNode) => Promise<string>;
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
interface RenderDocumentProps<App> extends SharedRenderProps {
|