@shopify/hydrogen 0.11.0-experimental.1 → 0.11.1-experimental.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.
- package/CHANGELOG.md +504 -0
- package/dist/esnext/client.d.ts +1 -1
- package/dist/esnext/client.js +1 -1
- package/dist/esnext/components/AddToCartButton/AddToCartButton.client.d.ts +1 -1
- package/dist/esnext/components/AddToCartButton/AddToCartButton.client.js +11 -2
- package/dist/esnext/components/CartEstimatedCost/CartEstimatedCost.client.js +1 -1
- package/dist/esnext/components/CartLineImage/CartLineImage.client.js +2 -2
- package/dist/esnext/components/CartLinePrice/CartLinePrice.client.d.ts +1 -1
- package/dist/esnext/components/CartLinePrice/CartLinePrice.client.js +1 -1
- package/dist/esnext/components/CartProvider/CartProvider.client.d.ts +2 -2
- package/dist/esnext/components/CartProvider/CartProvider.client.js +1 -1
- package/dist/esnext/components/ExternalVideo/ExternalVideo.d.ts +1 -1
- package/dist/esnext/components/ExternalVideo/ExternalVideo.js +2 -2
- package/dist/esnext/components/Image/Image.d.ts +1 -1
- package/dist/esnext/components/Image/Image.js +9 -9
- package/dist/esnext/components/LocalizationProvider/LocalizationProvider.server.d.ts +13 -4
- package/dist/esnext/components/LocalizationProvider/LocalizationProvider.server.js +5 -3
- package/dist/esnext/components/MediaFile/MediaFile.d.ts +8 -6
- package/dist/esnext/components/MediaFile/MediaFile.js +6 -6
- package/dist/esnext/components/Metafield/Metafield.client.d.ts +1 -1
- package/dist/esnext/components/Metafield/Metafield.client.js +16 -16
- package/dist/esnext/components/ModelViewer/ModelViewer.client.d.ts +1 -1
- package/dist/esnext/components/ModelViewer/ModelViewer.client.js +1 -1
- package/dist/esnext/components/Money/Money.client.d.ts +1 -1
- package/dist/esnext/components/Money/Money.client.js +2 -2
- package/dist/esnext/components/ProductMetafield/ProductMetafield.client.d.ts +3 -1
- package/dist/esnext/components/ProductMetafield/ProductMetafield.client.js +21 -4
- package/dist/esnext/components/ProductPrice/ProductPrice.client.d.ts +5 -3
- package/dist/esnext/components/ProductPrice/ProductPrice.client.js +30 -9
- package/dist/esnext/components/ProductProvider/ProductOptionsProvider.client.d.ts +8 -0
- package/dist/esnext/components/ProductProvider/ProductOptionsProvider.client.js +12 -0
- package/dist/esnext/components/ProductProvider/ProductProvider.client.d.ts +8 -7
- package/dist/esnext/components/ProductProvider/ProductProvider.client.js +9 -35
- package/dist/esnext/components/ProductProvider/context.d.ts +10 -6
- package/dist/esnext/components/ProductProvider/context.js +1 -0
- package/dist/esnext/components/Seo/DefaultPageSeo.client.js +2 -2
- package/dist/esnext/components/Seo/DescriptionSeo.client.js +2 -2
- package/dist/esnext/components/Seo/HomePageSeo.client.js +2 -2
- package/dist/esnext/components/Seo/ImageSeo.client.js +2 -2
- package/dist/esnext/components/Seo/ProductSeo.client.js +5 -3
- package/dist/esnext/components/Seo/TitleSeo.client.js +2 -2
- package/dist/esnext/components/Seo/TwitterSeo.client.js +2 -2
- package/dist/esnext/components/Seo/types.d.ts +1 -1
- package/dist/esnext/components/UnitPrice/UnitPrice.client.d.ts +2 -2
- package/dist/esnext/components/UnitPrice/UnitPrice.client.js +3 -3
- package/dist/esnext/components/Video/Video.d.ts +1 -1
- package/dist/esnext/components/Video/Video.js +3 -3
- package/dist/esnext/components/index.d.ts +0 -8
- package/dist/esnext/components/index.js +0 -8
- package/dist/esnext/entry-client.js +1 -1
- package/dist/esnext/entry-server.d.ts +18 -2
- package/dist/esnext/entry-server.js +347 -329
- package/dist/esnext/foundation/Head/Head.client.d.ts +5 -0
- package/dist/esnext/foundation/Head/Head.client.js +10 -0
- package/dist/esnext/foundation/Head/index.d.ts +1 -0
- package/dist/esnext/foundation/Head/index.js +1 -0
- package/dist/esnext/foundation/ServerRequestProvider/ServerRequestProvider.d.ts +2 -1
- package/dist/esnext/foundation/ServerRequestProvider/ServerRequestProvider.js +43 -4
- package/dist/esnext/foundation/useQuery/hooks.d.ts +11 -3
- package/dist/esnext/foundation/useQuery/hooks.js +21 -5
- package/dist/esnext/framework/CachingStrategy/index.d.ts +10 -0
- package/dist/esnext/framework/CachingStrategy/index.js +96 -0
- package/dist/esnext/framework/Hydration/Html.js +5 -12
- package/dist/esnext/framework/Hydration/ServerComponentRequest.server.d.ts +20 -2
- package/dist/esnext/framework/Hydration/ServerComponentRequest.server.js +51 -2
- package/dist/esnext/framework/Hydration/ServerComponentResponse.server.d.ts +2 -2
- package/dist/esnext/framework/Hydration/ServerComponentResponse.server.js +2 -11
- package/dist/esnext/framework/cache/in-memory.js +6 -5
- package/dist/esnext/framework/cache.d.ts +3 -3
- package/dist/esnext/framework/cache.js +4 -18
- package/dist/esnext/framework/middleware.d.ts +7 -7
- package/dist/esnext/framework/middleware.js +15 -43
- package/dist/esnext/framework/plugin.js +14 -3
- package/dist/esnext/framework/plugins/vite-plugin-hydration-auto-import.d.ts +3 -0
- package/dist/esnext/framework/plugins/vite-plugin-hydration-auto-import.js +38 -0
- package/dist/esnext/framework/plugins/vite-plugin-hydrogen-client-middleware.d.ts +9 -0
- package/dist/esnext/framework/plugins/vite-plugin-hydrogen-client-middleware.js +37 -0
- package/dist/esnext/framework/plugins/vite-plugin-hydrogen-middleware.d.ts +2 -1
- package/dist/esnext/framework/plugins/vite-plugin-hydrogen-middleware.js +3 -1
- package/dist/esnext/framework/plugins/vite-plugin-platform-entry.d.ts +3 -0
- package/dist/esnext/framework/plugins/vite-plugin-platform-entry.js +70 -0
- package/dist/esnext/hooks/useProduct/useProduct.d.ts +150 -1
- package/dist/esnext/hooks/useProduct/useProduct.js +36 -3
- package/dist/esnext/hooks/useProductOptions/types.d.ts +1 -1
- package/dist/esnext/hooks/useProductOptions/useProductOptions.d.ts +1 -1
- package/dist/esnext/hooks/useProductOptions/useProductOptions.js +6 -6
- package/dist/esnext/hooks/useShopQuery/hooks.d.ts +11 -4
- package/dist/esnext/hooks/useShopQuery/hooks.js +6 -3
- package/dist/esnext/index.d.ts +2 -1
- package/dist/esnext/index.js +2 -1
- package/dist/esnext/platforms/node.d.ts +10 -0
- package/dist/esnext/platforms/node.js +38 -0
- package/dist/esnext/platforms/worker-event.d.ts +9 -0
- package/dist/esnext/platforms/worker-event.js +24 -0
- package/dist/esnext/streaming.server.d.ts +17 -7
- package/dist/esnext/streaming.server.js +44 -0
- package/dist/esnext/types.d.ts +25 -25
- package/dist/esnext/utilities/apiRoutes.d.ts +1 -2
- package/dist/esnext/utilities/apiRoutes.js +4 -3
- package/dist/esnext/utilities/bot-ua.d.ts +4 -0
- package/dist/esnext/utilities/bot-ua.js +54 -0
- package/dist/esnext/utilities/fetch.js +1 -26
- package/dist/esnext/utilities/log/index.d.ts +4 -1
- package/dist/esnext/utilities/log/index.js +4 -1
- package/dist/esnext/utilities/log/log-cache-api-status.d.ts +1 -0
- package/dist/esnext/utilities/log/log-cache-api-status.js +9 -0
- package/dist/esnext/utilities/log/log-cache-header.d.ts +10 -0
- package/dist/esnext/utilities/log/log-cache-header.js +30 -0
- package/dist/esnext/utilities/log/log-query-timeline.d.ts +12 -0
- package/dist/esnext/utilities/log/log-query-timeline.js +83 -0
- package/dist/esnext/utilities/log/log.d.ts +11 -8
- package/dist/esnext/utilities/log/log.js +24 -35
- package/dist/esnext/utilities/log/utils.d.ts +3 -0
- package/dist/esnext/utilities/log/utils.js +13 -0
- package/dist/esnext/utilities/template.d.ts +9 -0
- package/dist/esnext/utilities/template.js +23 -0
- package/dist/{worker/foundation/ShopifyProvider/types.js → esnext/utilities/web-api-polyfill.d.ts} +0 -0
- package/dist/esnext/utilities/web-api-polyfill.js +19 -0
- package/dist/esnext/version.d.ts +1 -1
- package/dist/esnext/version.js +1 -1
- package/dist/node/entry-server.d.ts +22 -0
- package/dist/node/entry-server.js +581 -0
- package/dist/node/foundation/ServerRequestProvider/ServerRequestProvider.d.ts +23 -0
- package/dist/node/foundation/ServerRequestProvider/ServerRequestProvider.js +132 -0
- package/dist/node/foundation/ServerRequestProvider/index.d.ts +1 -0
- package/dist/node/foundation/ServerRequestProvider/index.js +13 -0
- package/dist/node/foundation/ServerStateProvider/ServerStateProvider.client.d.ts +25 -0
- package/dist/node/foundation/ServerStateProvider/ServerStateProvider.client.js +68 -0
- package/dist/node/foundation/ServerStateProvider/index.d.ts +2 -0
- package/dist/node/foundation/ServerStateProvider/index.js +6 -0
- package/dist/node/framework/CachingStrategy/index.d.ts +10 -0
- package/dist/node/framework/CachingStrategy/index.js +108 -0
- package/dist/node/framework/Hydration/Html.js +5 -12
- package/dist/node/framework/Hydration/ServerComponentRequest.server.d.ts +20 -2
- package/dist/node/framework/Hydration/ServerComponentRequest.server.js +50 -1
- package/dist/node/framework/Hydration/ServerComponentResponse.server.d.ts +2 -2
- package/dist/node/framework/Hydration/ServerComponentResponse.server.js +2 -11
- package/dist/node/framework/cache/in-memory.js +6 -5
- package/dist/node/framework/cache.d.ts +3 -3
- package/dist/node/framework/cache.js +6 -20
- package/dist/node/framework/middleware.d.ts +7 -7
- package/dist/node/framework/middleware.js +14 -46
- package/dist/node/framework/plugin.js +33 -3
- package/dist/node/framework/plugins/vite-plugin-hydration-auto-import.d.ts +3 -0
- package/dist/node/framework/plugins/vite-plugin-hydration-auto-import.js +43 -0
- package/dist/node/framework/plugins/vite-plugin-hydrogen-client-middleware.d.ts +9 -0
- package/dist/node/framework/plugins/vite-plugin-hydrogen-client-middleware.js +39 -0
- package/dist/node/framework/plugins/vite-plugin-hydrogen-middleware.d.ts +2 -1
- package/dist/node/framework/plugins/vite-plugin-hydrogen-middleware.js +4 -1
- package/dist/node/framework/plugins/vite-plugin-platform-entry.d.ts +3 -0
- package/dist/node/framework/plugins/vite-plugin-platform-entry.js +75 -0
- package/dist/node/streaming.server.d.ts +21 -0
- package/dist/node/streaming.server.js +59 -0
- package/dist/node/types.d.ts +25 -25
- package/dist/node/utilities/apiRoutes.d.ts +1 -2
- package/dist/node/utilities/apiRoutes.js +4 -3
- package/dist/node/utilities/bot-ua.d.ts +4 -0
- package/dist/node/utilities/bot-ua.js +58 -0
- package/dist/node/utilities/defer.d.ts +6 -0
- package/dist/node/utilities/defer.js +18 -0
- package/dist/node/utilities/error.d.ts +1 -0
- package/dist/node/utilities/error.js +10 -0
- package/dist/node/utilities/log/index.d.ts +4 -0
- package/dist/node/utilities/log/index.js +18 -0
- package/dist/node/utilities/log/log-cache-api-status.d.ts +1 -0
- package/dist/node/utilities/log/log-cache-api-status.js +13 -0
- package/dist/node/utilities/log/log-cache-header.d.ts +10 -0
- package/dist/node/utilities/log/log-cache-header.js +35 -0
- package/dist/node/utilities/log/log-query-timeline.d.ts +12 -0
- package/dist/node/utilities/log/log-query-timeline.js +88 -0
- package/dist/node/utilities/log/log.d.ts +11 -8
- package/dist/node/utilities/log/log.js +27 -37
- package/dist/node/utilities/log/utils.d.ts +3 -0
- package/dist/node/utilities/log/utils.js +18 -0
- package/dist/node/utilities/template.d.ts +9 -0
- package/dist/node/utilities/template.js +27 -0
- package/dist/{worker/types.js → node/utilities/web-api-polyfill.d.ts} +0 -0
- package/dist/node/utilities/web-api-polyfill.js +43 -0
- package/package.json +20 -10
- package/web-polyfills.js +1 -0
- package/LICENSE.md +0 -7
- package/dist/esnext/components/CartLineAttributes/CartLineAttributes.client.d.ts +0 -22
- package/dist/esnext/components/CartLineAttributes/CartLineAttributes.client.js +0 -13
- package/dist/esnext/components/CartLineAttributes/index.d.ts +0 -1
- package/dist/esnext/components/CartLineAttributes/index.js +0 -1
- package/dist/esnext/components/CartLineSelectedOptions/CartLineSelectedOptions.client.d.ts +0 -21
- package/dist/esnext/components/CartLineSelectedOptions/CartLineSelectedOptions.client.js +0 -13
- package/dist/esnext/components/CartLineSelectedOptions/index.d.ts +0 -1
- package/dist/esnext/components/CartLineSelectedOptions/index.js +0 -1
- package/dist/esnext/components/SelectedVariantAddToCartButton/SelectedVariantAddToCartButton.client.d.ts +0 -11
- package/dist/esnext/components/SelectedVariantAddToCartButton/SelectedVariantAddToCartButton.client.js +0 -17
- package/dist/esnext/components/SelectedVariantAddToCartButton/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantAddToCartButton/index.js +0 -1
- package/dist/esnext/components/SelectedVariantBuyNowButton/SelectedVariantBuyNowButton.d.ts +0 -9
- package/dist/esnext/components/SelectedVariantBuyNowButton/SelectedVariantBuyNowButton.js +0 -17
- package/dist/esnext/components/SelectedVariantBuyNowButton/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantBuyNowButton/index.js +0 -1
- package/dist/esnext/components/SelectedVariantImage/SelectedVariantImage.client.d.ts +0 -10
- package/dist/esnext/components/SelectedVariantImage/SelectedVariantImage.client.js +0 -16
- package/dist/esnext/components/SelectedVariantImage/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantImage/index.js +0 -1
- package/dist/esnext/components/SelectedVariantMetafield/SelectedVariantMetafield.client.d.ts +0 -15
- package/dist/esnext/components/SelectedVariantMetafield/SelectedVariantMetafield.client.js +0 -24
- package/dist/esnext/components/SelectedVariantMetafield/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantMetafield/index.js +0 -1
- package/dist/esnext/components/SelectedVariantPrice/SelectedVariantPrice.client.d.ts +0 -12
- package/dist/esnext/components/SelectedVariantPrice/SelectedVariantPrice.client.js +0 -22
- package/dist/esnext/components/SelectedVariantPrice/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantPrice/index.js +0 -1
- package/dist/esnext/components/SelectedVariantShopPayButton/SelectedVariantShopPayButton.client.d.ts +0 -8
- package/dist/esnext/components/SelectedVariantShopPayButton/SelectedVariantShopPayButton.client.js +0 -18
- package/dist/esnext/components/SelectedVariantShopPayButton/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantShopPayButton/index.js +0 -1
- package/dist/esnext/components/SelectedVariantUnitPrice/SelectedVariantUnitPrice.client.d.ts +0 -7
- package/dist/esnext/components/SelectedVariantUnitPrice/SelectedVariantUnitPrice.client.js +0 -16
- package/dist/esnext/components/SelectedVariantUnitPrice/index.d.ts +0 -1
- package/dist/esnext/components/SelectedVariantUnitPrice/index.js +0 -1
- package/dist/esnext/foundation/Helmet/Helmet.client.d.ts +0 -10
- package/dist/esnext/foundation/Helmet/Helmet.client.js +0 -10
- package/dist/esnext/foundation/Helmet/index.d.ts +0 -1
- package/dist/esnext/foundation/Helmet/index.js +0 -1
- package/dist/esnext/handle-event.d.ts +0 -23
- package/dist/esnext/handle-event.js +0 -132
- package/dist/esnext/handle-worker-event.d.ts +0 -11
- package/dist/esnext/handle-worker-event.js +0 -14
- package/dist/node/foundation/Helmet/Helmet.client.d.ts +0 -10
- package/dist/node/foundation/Helmet/Helmet.client.js +0 -17
- package/dist/node/foundation/Helmet/index.d.ts +0 -1
- package/dist/node/foundation/Helmet/index.js +0 -5
- package/dist/node/foundation/ssr-interop.d.ts +0 -29
- package/dist/node/foundation/ssr-interop.js +0 -39
- package/dist/node/handle-event.d.ts +0 -23
- package/dist/node/handle-event.js +0 -135
- package/dist/worker/constants.d.ts +0 -1
- package/dist/worker/constants.js +0 -1
- package/dist/worker/foundation/Helmet/Helmet.client.d.ts +0 -10
- package/dist/worker/foundation/Helmet/Helmet.client.js +0 -10
- package/dist/worker/foundation/Helmet/index.d.ts +0 -1
- package/dist/worker/foundation/Helmet/index.js +0 -1
- package/dist/worker/foundation/ShopifyProvider/types.d.ts +0 -15
- package/dist/worker/foundation/ssr-interop.d.ts +0 -29
- package/dist/worker/foundation/ssr-interop.js +0 -35
- package/dist/worker/framework/Hydration/ServerComponentRequest.server.d.ts +0 -23
- package/dist/worker/framework/Hydration/ServerComponentRequest.server.js +0 -57
- package/dist/worker/framework/config.d.ts +0 -6
- package/dist/worker/framework/config.js +0 -6
- package/dist/worker/framework/runtime.d.ts +0 -13
- package/dist/worker/framework/runtime.js +0 -27
- package/dist/worker/graphql/types/types.d.ts +0 -5761
- package/dist/worker/graphql/types/types.js +0 -1436
- package/dist/worker/handle-event.d.ts +0 -23
- package/dist/worker/handle-event.js +0 -132
- package/dist/worker/handle-worker-event.d.ts +0 -11
- package/dist/worker/handle-worker-event.js +0 -14
- package/dist/worker/types.d.ts +0 -96
- package/dist/worker/utilities/apiRoutes.d.ts +0 -21
- package/dist/worker/utilities/apiRoutes.js +0 -87
- package/dist/worker/utilities/log/log.d.ts +0 -18
- package/dist/worker/utilities/log/log.js +0 -77
- package/dist/worker/utilities/matchPath.d.ts +0 -10
- package/dist/worker/utilities/matchPath.js +0 -54
- package/dist/worker/utilities/timing.d.ts +0 -7
- package/dist/worker/utilities/timing.js +0 -14
- package/worker.js +0 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.renderHydrogen = void 0;
|
|
26
|
+
const react_1 = __importDefault(require("react"));
|
|
27
|
+
const log_1 = require("./utilities/log");
|
|
28
|
+
const error_1 = require("./utilities/error");
|
|
29
|
+
const defer_1 = require("./utilities/defer");
|
|
30
|
+
const Html_1 = require("./framework/Hydration/Html");
|
|
31
|
+
const ServerComponentResponse_server_1 = require("./framework/Hydration/ServerComponentResponse.server");
|
|
32
|
+
const ServerComponentRequest_server_1 = require("./framework/Hydration/ServerComponentRequest.server");
|
|
33
|
+
const cache_1 = require("./framework/cache");
|
|
34
|
+
const ServerRequestProvider_1 = require("./foundation/ServerRequestProvider");
|
|
35
|
+
const apiRoutes_1 = require("./utilities/apiRoutes");
|
|
36
|
+
const ServerStateProvider_1 = require("./foundation/ServerStateProvider");
|
|
37
|
+
const bot_ua_1 = require("./utilities/bot-ua");
|
|
38
|
+
const runtime_1 = require("./framework/runtime");
|
|
39
|
+
const config_1 = require("./framework/config");
|
|
40
|
+
const streaming_server_1 = require("./streaming.server");
|
|
41
|
+
const constants_1 = require("./constants");
|
|
42
|
+
const template_1 = require("./utilities/template");
|
|
43
|
+
const HTML_CONTENT_TYPE = 'text/html; charset=UTF-8';
|
|
44
|
+
const renderHydrogen = (App, { pages }) => {
|
|
45
|
+
const handleRequest = async function (rawRequest, { indexTemplate, streamableResponse, dev, cache, context, nonce }) {
|
|
46
|
+
const request = new ServerComponentRequest_server_1.ServerComponentRequest(rawRequest);
|
|
47
|
+
const url = new URL(request.url);
|
|
48
|
+
const log = (0, log_1.getLoggerWithContext)(request);
|
|
49
|
+
const componentResponse = new ServerComponentResponse_server_1.ServerComponentResponse();
|
|
50
|
+
/**
|
|
51
|
+
* Inject the cache & context into the module loader so we can pull it out for subrequests.
|
|
52
|
+
*/
|
|
53
|
+
(0, runtime_1.setCache)(cache);
|
|
54
|
+
(0, runtime_1.setContext)(context);
|
|
55
|
+
(0, config_1.setConfig)({ dev });
|
|
56
|
+
const isReactHydrationRequest = url.pathname === constants_1.RSC_PATHNAME;
|
|
57
|
+
let template = typeof indexTemplate === 'function'
|
|
58
|
+
? await indexTemplate(url.toString())
|
|
59
|
+
: indexTemplate;
|
|
60
|
+
if (template && typeof template !== 'string') {
|
|
61
|
+
template = template.default;
|
|
62
|
+
}
|
|
63
|
+
if (!isReactHydrationRequest && pages) {
|
|
64
|
+
const apiRoute = getApiRoute(url, { pages });
|
|
65
|
+
// The API Route might have a default export, making it also a server component
|
|
66
|
+
// If it does, only render the API route if the request method is GET
|
|
67
|
+
if (apiRoute &&
|
|
68
|
+
(!apiRoute.hasServerComponent || request.method !== 'GET')) {
|
|
69
|
+
return (0, apiRoutes_1.renderApiRoute)(request, apiRoute);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const isStreamable = !(0, bot_ua_1.isBotUA)(url, request.headers.get('user-agent')) &&
|
|
73
|
+
(!!streamableResponse || (0, streaming_server_1.supportsReadableStream)());
|
|
74
|
+
const params = {
|
|
75
|
+
App,
|
|
76
|
+
log,
|
|
77
|
+
dev,
|
|
78
|
+
pages,
|
|
79
|
+
nonce,
|
|
80
|
+
request,
|
|
81
|
+
template,
|
|
82
|
+
isStreamable,
|
|
83
|
+
componentResponse,
|
|
84
|
+
response: streamableResponse,
|
|
85
|
+
};
|
|
86
|
+
if (isReactHydrationRequest) {
|
|
87
|
+
return hydrate(url, params);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stream back real-user responses, but for bots/etc,
|
|
91
|
+
* use `render` instead. This is because we need to inject <head>
|
|
92
|
+
* things for SEO reasons.
|
|
93
|
+
*/
|
|
94
|
+
if (isStreamable) {
|
|
95
|
+
return stream(url, params);
|
|
96
|
+
}
|
|
97
|
+
return render(url, params);
|
|
98
|
+
};
|
|
99
|
+
return handleRequest;
|
|
100
|
+
};
|
|
101
|
+
exports.renderHydrogen = renderHydrogen;
|
|
102
|
+
function getApiRoute(url, { pages }) {
|
|
103
|
+
const routes = (0, apiRoutes_1.getApiRoutesFromPages)(pages);
|
|
104
|
+
return (0, apiRoutes_1.getApiRouteFromURL)(url, routes);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The render function is responsible for turning the provided `App` into an HTML string,
|
|
108
|
+
* and returning any initial state that needs to be hydrated into the client version of the app.
|
|
109
|
+
* NOTE: This is currently only used for SEO bots or Worker runtime (where Stream is not yet supported).
|
|
110
|
+
*/
|
|
111
|
+
async function render(url, { App, pages, request, componentResponse, log, template, nonce, dev, }) {
|
|
112
|
+
const state = { pathname: url.pathname, search: url.search };
|
|
113
|
+
const { AppSSR, rscReadable } = buildAppSSR({
|
|
114
|
+
App,
|
|
115
|
+
state,
|
|
116
|
+
request,
|
|
117
|
+
response: componentResponse,
|
|
118
|
+
pages,
|
|
119
|
+
log,
|
|
120
|
+
}, { template });
|
|
121
|
+
let [html, flight] = await Promise.all([
|
|
122
|
+
renderToBufferedString(AppSSR, { log, nonce }),
|
|
123
|
+
(0, streaming_server_1.bufferReadableStream)(rscReadable.getReader()),
|
|
124
|
+
]);
|
|
125
|
+
const { headers, status, statusText } = getResponseOptions(componentResponse);
|
|
126
|
+
/**
|
|
127
|
+
* TODO: Also add `Vary` headers for `accept-language` and any other keys
|
|
128
|
+
* we want to shard our full-page cache for all Hydrogen storefronts.
|
|
129
|
+
*/
|
|
130
|
+
headers[(0, cache_1.getCacheControlHeader)({ dev })] = componentResponse.cacheControlHeader;
|
|
131
|
+
if (componentResponse.customBody) {
|
|
132
|
+
// This can be used to return sitemap.xml or any other custom response.
|
|
133
|
+
postRequestTasks('ssr', status, request, componentResponse);
|
|
134
|
+
return new Response(await componentResponse.customBody, {
|
|
135
|
+
status,
|
|
136
|
+
statusText,
|
|
137
|
+
headers,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
headers['Content-type'] = HTML_CONTENT_TYPE;
|
|
141
|
+
const { bodyAttributes, htmlAttributes, ...head } = extractHeadElements(request.ctx.head);
|
|
142
|
+
html = html
|
|
143
|
+
.replace(/<head>(.*?)<\/head>/s, generateHeadTag(head))
|
|
144
|
+
.replace('<html', htmlAttributes ? `<html ${htmlAttributes}` : '$&')
|
|
145
|
+
.replace('<body', bodyAttributes ? `<body ${bodyAttributes}` : '$&')
|
|
146
|
+
.replace('</body>', flight
|
|
147
|
+
? `${flightContainer({ init: true, nonce, chunk: flight })}</body>`
|
|
148
|
+
: '$&');
|
|
149
|
+
postRequestTasks('ssr', status, request, componentResponse);
|
|
150
|
+
return new Response(html, {
|
|
151
|
+
status,
|
|
152
|
+
statusText,
|
|
153
|
+
headers,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Stream a response to the client. NOTE: This omits custom `<head>`
|
|
158
|
+
* information, so this method should not be used by crawlers.
|
|
159
|
+
*/
|
|
160
|
+
async function stream(url, { App, pages, request, response, componentResponse, log, template, nonce, dev, }) {
|
|
161
|
+
const state = { pathname: url.pathname, search: url.search };
|
|
162
|
+
log.trace('start stream');
|
|
163
|
+
const { noScriptTemplate, bootstrapScripts, bootstrapModules } = (0, template_1.stripScriptsFromTemplate)(template);
|
|
164
|
+
const { AppSSR, rscReadable } = buildAppSSR({
|
|
165
|
+
App,
|
|
166
|
+
state,
|
|
167
|
+
request,
|
|
168
|
+
response: componentResponse,
|
|
169
|
+
log,
|
|
170
|
+
pages,
|
|
171
|
+
}, {
|
|
172
|
+
template: noScriptTemplate,
|
|
173
|
+
htmlAttrs: { lang: 'en' },
|
|
174
|
+
});
|
|
175
|
+
const rscToScriptTagReadable = new ReadableStream({
|
|
176
|
+
start(controller) {
|
|
177
|
+
log.trace('rsc start chunks');
|
|
178
|
+
let init = true;
|
|
179
|
+
const encoder = new TextEncoder();
|
|
180
|
+
(0, streaming_server_1.bufferReadableStream)(rscReadable.getReader(), (chunk) => {
|
|
181
|
+
const scriptTag = flightContainer({ init, chunk, nonce });
|
|
182
|
+
controller.enqueue(encoder.encode(scriptTag));
|
|
183
|
+
init = false;
|
|
184
|
+
}).then(() => {
|
|
185
|
+
log.trace('rsc finish chunks');
|
|
186
|
+
return controller.close();
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
let didError;
|
|
191
|
+
if (__WORKER__) {
|
|
192
|
+
const deferredShouldReturnApp = (0, defer_1.defer)();
|
|
193
|
+
const encoder = new TextEncoder();
|
|
194
|
+
const transform = new TransformStream();
|
|
195
|
+
const writable = transform.writable.getWriter();
|
|
196
|
+
const responseOptions = {};
|
|
197
|
+
const ssrReadable = (0, streaming_server_1.ssrRenderToReadableStream)(AppSSR, {
|
|
198
|
+
nonce,
|
|
199
|
+
bootstrapScripts,
|
|
200
|
+
bootstrapModules,
|
|
201
|
+
onCompleteShell() {
|
|
202
|
+
log.trace('worker ready to stream');
|
|
203
|
+
Object.assign(responseOptions, getResponseOptions(componentResponse, didError));
|
|
204
|
+
/**
|
|
205
|
+
* TODO: This assumes `response.cache()` has been called _before_ any
|
|
206
|
+
* queries which might be caught behind Suspense. Clarify this or add
|
|
207
|
+
* additional checks downstream?
|
|
208
|
+
*/
|
|
209
|
+
responseOptions.headers[(0, cache_1.getCacheControlHeader)({ dev })] =
|
|
210
|
+
componentResponse.cacheControlHeader;
|
|
211
|
+
if (isRedirect(responseOptions)) {
|
|
212
|
+
// Return redirects early without further rendering/streaming
|
|
213
|
+
return deferredShouldReturnApp.resolve(false);
|
|
214
|
+
}
|
|
215
|
+
if (!componentResponse.canStream())
|
|
216
|
+
return;
|
|
217
|
+
startWritingHtmlToStream(responseOptions, writable, encoder, dev ? didError : undefined);
|
|
218
|
+
deferredShouldReturnApp.resolve(true);
|
|
219
|
+
},
|
|
220
|
+
async onCompleteAll() {
|
|
221
|
+
log.trace('worker complete stream');
|
|
222
|
+
if (componentResponse.canStream())
|
|
223
|
+
return;
|
|
224
|
+
Object.assign(responseOptions, getResponseOptions(componentResponse, didError));
|
|
225
|
+
if (isRedirect(responseOptions)) {
|
|
226
|
+
// Redirects found after any async code
|
|
227
|
+
return deferredShouldReturnApp.resolve(false);
|
|
228
|
+
}
|
|
229
|
+
if (componentResponse.customBody) {
|
|
230
|
+
writable.write(encoder.encode(await componentResponse.customBody));
|
|
231
|
+
return deferredShouldReturnApp.resolve(false);
|
|
232
|
+
}
|
|
233
|
+
startWritingHtmlToStream(responseOptions, writable, encoder, dev ? didError : undefined);
|
|
234
|
+
deferredShouldReturnApp.resolve(true);
|
|
235
|
+
},
|
|
236
|
+
onError(error) {
|
|
237
|
+
didError = error;
|
|
238
|
+
if (dev && deferredShouldReturnApp.status === 'pending') {
|
|
239
|
+
writable.write((0, error_1.getErrorMarkup)(error));
|
|
240
|
+
}
|
|
241
|
+
log.error(error);
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
if (await deferredShouldReturnApp.promise) {
|
|
245
|
+
let bufferedSsr = '';
|
|
246
|
+
let isPendingSsrWrite = false;
|
|
247
|
+
const writingSSR = (0, streaming_server_1.bufferReadableStream)(ssrReadable.getReader(), (chunk) => {
|
|
248
|
+
bufferedSsr += chunk;
|
|
249
|
+
if (!isPendingSsrWrite) {
|
|
250
|
+
isPendingSsrWrite = true;
|
|
251
|
+
setTimeout(() => {
|
|
252
|
+
isPendingSsrWrite = false;
|
|
253
|
+
// React can write fractional chunks synchronously.
|
|
254
|
+
// This timeout ensures we only write full HTML tags
|
|
255
|
+
// in order to allow RSC writing concurrently.
|
|
256
|
+
if (bufferedSsr) {
|
|
257
|
+
writable.write(encoder.encode(bufferedSsr));
|
|
258
|
+
bufferedSsr = '';
|
|
259
|
+
}
|
|
260
|
+
}, 0);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
const writingRSC = (0, streaming_server_1.bufferReadableStream)(rscToScriptTagReadable.getReader(), (scriptTag) => writable.write(encoder.encode(scriptTag)));
|
|
264
|
+
Promise.all([writingSSR, writingRSC]).then(() => {
|
|
265
|
+
// Last SSR write might be pending, delay closing the writable one tick
|
|
266
|
+
setTimeout(() => writable.close(), 0);
|
|
267
|
+
postRequestTasks('str', responseOptions.status, request, componentResponse);
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
writable.close();
|
|
272
|
+
postRequestTasks('str', responseOptions.status, request, componentResponse);
|
|
273
|
+
}
|
|
274
|
+
if (await (0, streaming_server_1.isStreamingSupported)()) {
|
|
275
|
+
return new Response(transform.readable, responseOptions);
|
|
276
|
+
}
|
|
277
|
+
const bufferedBody = await (0, streaming_server_1.bufferReadableStream)(transform.readable.getReader());
|
|
278
|
+
return new Response(bufferedBody, responseOptions);
|
|
279
|
+
}
|
|
280
|
+
else if (response) {
|
|
281
|
+
response.socket.on('error', log.fatal);
|
|
282
|
+
const { pipe } = (0, streaming_server_1.ssrRenderToPipeableStream)(AppSSR, {
|
|
283
|
+
nonce,
|
|
284
|
+
bootstrapScripts,
|
|
285
|
+
bootstrapModules,
|
|
286
|
+
onCompleteShell() {
|
|
287
|
+
log.trace('node ready to stream');
|
|
288
|
+
/**
|
|
289
|
+
* TODO: This assumes `response.cache()` has been called _before_ any
|
|
290
|
+
* queries which might be caught behind Suspense. Clarify this or add
|
|
291
|
+
* additional checks downstream?
|
|
292
|
+
*/
|
|
293
|
+
response.setHeader((0, cache_1.getCacheControlHeader)({ dev }), componentResponse.cacheControlHeader);
|
|
294
|
+
writeHeadToServerResponse(response, componentResponse, log, didError);
|
|
295
|
+
(0, log_1.logServerResponse)('str', request, response.statusCode);
|
|
296
|
+
if (isRedirect(response)) {
|
|
297
|
+
// Return redirects early without further rendering/streaming
|
|
298
|
+
return response.end();
|
|
299
|
+
}
|
|
300
|
+
if (!componentResponse.canStream())
|
|
301
|
+
return;
|
|
302
|
+
startWritingHtmlToServerResponse(response, dev ? didError : undefined);
|
|
303
|
+
setTimeout(() => {
|
|
304
|
+
log.trace('node pipe response');
|
|
305
|
+
pipe(response);
|
|
306
|
+
}, 0);
|
|
307
|
+
(0, streaming_server_1.bufferReadableStream)(rscToScriptTagReadable.getReader(), (chunk) => {
|
|
308
|
+
log.trace('rsc chunk');
|
|
309
|
+
return response.write(chunk);
|
|
310
|
+
});
|
|
311
|
+
},
|
|
312
|
+
async onCompleteAll() {
|
|
313
|
+
log.trace('node complete stream');
|
|
314
|
+
if (componentResponse.canStream() || response.writableEnded) {
|
|
315
|
+
postRequestTasks('str', response.statusCode, request, componentResponse);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
writeHeadToServerResponse(response, componentResponse, log, didError);
|
|
319
|
+
postRequestTasks('str', response.statusCode, request, componentResponse);
|
|
320
|
+
if (isRedirect(response)) {
|
|
321
|
+
// Redirects found after any async code
|
|
322
|
+
return response.end();
|
|
323
|
+
}
|
|
324
|
+
if (componentResponse.customBody) {
|
|
325
|
+
return response.end(await componentResponse.customBody);
|
|
326
|
+
}
|
|
327
|
+
startWritingHtmlToServerResponse(response, dev ? didError : undefined);
|
|
328
|
+
(0, streaming_server_1.bufferReadableStream)(rscToScriptTagReadable.getReader()).then((scriptTags) => {
|
|
329
|
+
// Piping ends the response so script tags
|
|
330
|
+
// must be written before that.
|
|
331
|
+
response.write(scriptTags);
|
|
332
|
+
pipe(response);
|
|
333
|
+
});
|
|
334
|
+
},
|
|
335
|
+
onError(error) {
|
|
336
|
+
didError = error;
|
|
337
|
+
if (dev && response.headersSent) {
|
|
338
|
+
// Calling write would flush headers automatically.
|
|
339
|
+
// Delay this error until headers are properly sent.
|
|
340
|
+
response.write((0, error_1.getErrorMarkup)(error));
|
|
341
|
+
}
|
|
342
|
+
log.error(error);
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Stream a hydration response to the client.
|
|
349
|
+
*/
|
|
350
|
+
async function hydrate(url, { App, pages, request, response, componentResponse, isStreamable, log, }) {
|
|
351
|
+
const state = JSON.parse(url.searchParams.get('state') || '{}');
|
|
352
|
+
const { AppRSC } = buildAppRSC({
|
|
353
|
+
App,
|
|
354
|
+
state,
|
|
355
|
+
request,
|
|
356
|
+
response: componentResponse,
|
|
357
|
+
log,
|
|
358
|
+
pages,
|
|
359
|
+
});
|
|
360
|
+
if (__WORKER__) {
|
|
361
|
+
const rscReadable = (0, streaming_server_1.rscRenderToReadableStream)(AppRSC);
|
|
362
|
+
if (isStreamable && (await (0, streaming_server_1.isStreamingSupported)())) {
|
|
363
|
+
postRequestTasks('rsc', 200, request, componentResponse);
|
|
364
|
+
return new Response(rscReadable);
|
|
365
|
+
}
|
|
366
|
+
// Note: CFW does not support reader.piteTo nor iterable syntax
|
|
367
|
+
const bufferedBody = await (0, streaming_server_1.bufferReadableStream)(rscReadable.getReader());
|
|
368
|
+
postRequestTasks('rsc', 200, request, componentResponse);
|
|
369
|
+
return new Response(bufferedBody);
|
|
370
|
+
}
|
|
371
|
+
else if (response) {
|
|
372
|
+
response.socket.on('error', log.fatal);
|
|
373
|
+
const rscWriter = await Promise.resolve().then(() => __importStar(require(
|
|
374
|
+
// @ts-ignore
|
|
375
|
+
'@shopify/hydrogen/vendor/react-server-dom-vite/writer.node.server')));
|
|
376
|
+
const stream = rscWriter
|
|
377
|
+
.renderToPipeableStream(AppRSC)
|
|
378
|
+
.pipe(response);
|
|
379
|
+
stream.on('finish', function () {
|
|
380
|
+
postRequestTasks('rsc', response.statusCode, request, componentResponse);
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
function buildAppRSC({ App, state, request, response, log, pages, }) {
|
|
385
|
+
const hydrogenServerProps = { request, response, log };
|
|
386
|
+
const AppRSC = (react_1.default.createElement(ServerRequestProvider_1.ServerRequestProvider, { request: request, isRSC: true },
|
|
387
|
+
react_1.default.createElement(PreloadQueries, { request: request },
|
|
388
|
+
react_1.default.createElement(App, { ...state, ...hydrogenServerProps, pages: pages }))));
|
|
389
|
+
return { AppRSC };
|
|
390
|
+
}
|
|
391
|
+
function buildAppSSR({ App, state, request, response, log, pages }, htmlOptions) {
|
|
392
|
+
const { AppRSC } = buildAppRSC({
|
|
393
|
+
App,
|
|
394
|
+
state,
|
|
395
|
+
request,
|
|
396
|
+
response,
|
|
397
|
+
log,
|
|
398
|
+
pages,
|
|
399
|
+
});
|
|
400
|
+
const [rscReadableForFizz, rscReadableForFlight] = (0, streaming_server_1.rscRenderToReadableStream)(AppRSC).tee();
|
|
401
|
+
const rscResponse = (0, streaming_server_1.createFromReadableStream)(rscReadableForFizz);
|
|
402
|
+
const RscConsumer = () => rscResponse.readRoot();
|
|
403
|
+
const AppSSR = (react_1.default.createElement(Html_1.Html, { ...htmlOptions },
|
|
404
|
+
react_1.default.createElement(ServerRequestProvider_1.ServerRequestProvider, { request: request, isRSC: false },
|
|
405
|
+
react_1.default.createElement(ServerStateProvider_1.ServerStateProvider, { serverState: state, setServerState: () => { } },
|
|
406
|
+
react_1.default.createElement(PreloadQueries, { request: request },
|
|
407
|
+
react_1.default.createElement(react_1.default.Suspense, { fallback: null },
|
|
408
|
+
react_1.default.createElement(RscConsumer, null)))))));
|
|
409
|
+
return { AppSSR, rscReadable: rscReadableForFlight };
|
|
410
|
+
}
|
|
411
|
+
function PreloadQueries({ request, children, }) {
|
|
412
|
+
const preloadQueries = request.getPreloadQueries();
|
|
413
|
+
(0, ServerRequestProvider_1.preloadRequestCacheData)(request, preloadQueries);
|
|
414
|
+
return children;
|
|
415
|
+
}
|
|
416
|
+
function extractHeadElements({ context: { helmet } }) {
|
|
417
|
+
return helmet
|
|
418
|
+
? {
|
|
419
|
+
base: helmet.base.toString(),
|
|
420
|
+
bodyAttributes: helmet.bodyAttributes.toString(),
|
|
421
|
+
htmlAttributes: helmet.htmlAttributes.toString(),
|
|
422
|
+
link: helmet.link.toString(),
|
|
423
|
+
meta: helmet.meta.toString(),
|
|
424
|
+
noscript: helmet.noscript.toString(),
|
|
425
|
+
script: helmet.script.toString(),
|
|
426
|
+
style: helmet.style.toString(),
|
|
427
|
+
title: helmet.title.toString(),
|
|
428
|
+
}
|
|
429
|
+
: {};
|
|
430
|
+
}
|
|
431
|
+
async function renderToBufferedString(ReactApp, { log, nonce }) {
|
|
432
|
+
return new Promise(async (resolve, reject) => {
|
|
433
|
+
if (__WORKER__) {
|
|
434
|
+
const deferred = (0, defer_1.defer)();
|
|
435
|
+
const readable = (0, streaming_server_1.ssrRenderToReadableStream)(ReactApp, {
|
|
436
|
+
nonce,
|
|
437
|
+
onCompleteAll() {
|
|
438
|
+
/**
|
|
439
|
+
* We want to wait until `onCompleteAll` has been called before fetching the
|
|
440
|
+
* stream body. Otherwise, React 18's streaming JS script/template tags
|
|
441
|
+
* will be included in the output and cause issues when loading
|
|
442
|
+
* the Client Components in the browser.
|
|
443
|
+
*/
|
|
444
|
+
deferred.resolve(null);
|
|
445
|
+
},
|
|
446
|
+
onError(error) {
|
|
447
|
+
log.error(error);
|
|
448
|
+
deferred.reject(error);
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
await deferred.promise.catch(reject);
|
|
452
|
+
resolve(await (0, streaming_server_1.bufferReadableStream)(readable.getReader()));
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
const writer = await createNodeWriter();
|
|
456
|
+
const { pipe } = (0, streaming_server_1.ssrRenderToPipeableStream)(ReactApp, {
|
|
457
|
+
nonce,
|
|
458
|
+
/**
|
|
459
|
+
* When hydrating, we have to wait until `onCompleteAll` to avoid having
|
|
460
|
+
* `template` and `script` tags inserted and rendered as part of the hydration response.
|
|
461
|
+
*/
|
|
462
|
+
onCompleteAll() {
|
|
463
|
+
let data = '';
|
|
464
|
+
writer.on('data', (chunk) => (data += chunk.toString()));
|
|
465
|
+
writer.once('error', reject);
|
|
466
|
+
writer.once('end', () => resolve(data));
|
|
467
|
+
// Tell React to start writing to the writer
|
|
468
|
+
pipe(writer);
|
|
469
|
+
},
|
|
470
|
+
onError(error) {
|
|
471
|
+
log.error(error);
|
|
472
|
+
reject(error);
|
|
473
|
+
},
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
exports.default = exports.renderHydrogen;
|
|
479
|
+
function startWritingHtmlToServerResponse(response, error) {
|
|
480
|
+
if (!response.headersSent) {
|
|
481
|
+
response.setHeader('Content-type', HTML_CONTENT_TYPE);
|
|
482
|
+
response.write('<!DOCTYPE html>');
|
|
483
|
+
}
|
|
484
|
+
if (error) {
|
|
485
|
+
// This error was delayed until the headers were properly sent.
|
|
486
|
+
response.write((0, error_1.getErrorMarkup)(error));
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
function startWritingHtmlToStream(responseOptions, writable, encoder, error) {
|
|
490
|
+
responseOptions.headers['Content-type'] = HTML_CONTENT_TYPE;
|
|
491
|
+
writable.write(encoder.encode('<!DOCTYPE html>'));
|
|
492
|
+
if (error) {
|
|
493
|
+
// This error was delayed until the headers were properly sent.
|
|
494
|
+
writable.write(encoder.encode((0, error_1.getErrorMarkup)(error)));
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
function getResponseOptions({ headers, status, customStatus }, error) {
|
|
498
|
+
var _a, _b;
|
|
499
|
+
const responseInit = {};
|
|
500
|
+
// @ts-ignore
|
|
501
|
+
responseInit.headers = Object.fromEntries(headers.entries());
|
|
502
|
+
if (error) {
|
|
503
|
+
responseInit.status = 500;
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
responseInit.status = (_b = (_a = customStatus === null || customStatus === void 0 ? void 0 : customStatus.code) !== null && _a !== void 0 ? _a : status) !== null && _b !== void 0 ? _b : 200;
|
|
507
|
+
if (customStatus === null || customStatus === void 0 ? void 0 : customStatus.text) {
|
|
508
|
+
responseInit.statusText = customStatus.text;
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return responseInit;
|
|
512
|
+
}
|
|
513
|
+
function writeHeadToServerResponse(response, serverComponentResponse, log, error) {
|
|
514
|
+
if (response.headersSent)
|
|
515
|
+
return;
|
|
516
|
+
log.trace('writeHeadToServerResponse');
|
|
517
|
+
const { headers, status, statusText } = getResponseOptions(serverComponentResponse, error);
|
|
518
|
+
response.statusCode = status;
|
|
519
|
+
if (statusText) {
|
|
520
|
+
response.statusMessage = statusText;
|
|
521
|
+
}
|
|
522
|
+
Object.entries(headers).forEach(([key, value]) => response.setHeader(key, value));
|
|
523
|
+
}
|
|
524
|
+
function isRedirect(response) {
|
|
525
|
+
var _a, _b;
|
|
526
|
+
const status = (_b = (_a = response.status) !== null && _a !== void 0 ? _a : response.statusCode) !== null && _b !== void 0 ? _b : 0;
|
|
527
|
+
return status >= 300 && status < 400;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Generate the contents of the `head` tag, and update the existing `<title>` tag
|
|
531
|
+
* if one exists, and if a title is passed.
|
|
532
|
+
*/
|
|
533
|
+
function generateHeadTag({ title, ...rest }) {
|
|
534
|
+
const headProps = ['base', 'meta', 'style', 'noscript', 'script', 'link'];
|
|
535
|
+
const otherHeadProps = headProps
|
|
536
|
+
.map((prop) => rest[prop])
|
|
537
|
+
.filter(Boolean)
|
|
538
|
+
.join('\n');
|
|
539
|
+
return (_outerHtml, innerHtml) => {
|
|
540
|
+
let headHtml = otherHeadProps + innerHtml;
|
|
541
|
+
if (title) {
|
|
542
|
+
if (headHtml.includes('<title>')) {
|
|
543
|
+
headHtml = headHtml.replace(/(<title>(?:.|\n)*?<\/title>)/, title);
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
headHtml += title;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
return `<head>${headHtml}</head>`;
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
async function createNodeWriter() {
|
|
553
|
+
// Importing 'stream' directly breaks Vite resolve
|
|
554
|
+
// when building for workers, even though this code
|
|
555
|
+
// does not run in a worker. Looks like tree-shaking
|
|
556
|
+
// kicks in after the import analysis/bundle.
|
|
557
|
+
const streamImport = __WORKER__ ? '' : 'stream';
|
|
558
|
+
const { PassThrough } = await Promise.resolve().then(() => __importStar(require(streamImport)));
|
|
559
|
+
return new PassThrough();
|
|
560
|
+
}
|
|
561
|
+
function flightContainer({ init, chunk, nonce, }) {
|
|
562
|
+
let script = `<script${nonce ? ` nonce="${nonce}"` : ''}>`;
|
|
563
|
+
if (init) {
|
|
564
|
+
script += 'var __flight=[];';
|
|
565
|
+
}
|
|
566
|
+
if (chunk) {
|
|
567
|
+
const normalizedChunk = chunk
|
|
568
|
+
// 1. Duplicate the escape char (\) for already escaped characters (e.g. \n or \").
|
|
569
|
+
.replace(/\\/g, String.raw `\\`)
|
|
570
|
+
// 2. Escape existing backticks to allow wrapping the whole thing in `...`.
|
|
571
|
+
.replace(/`/g, String.raw `\``);
|
|
572
|
+
script += `__flight.push(\`${normalizedChunk}\`)`;
|
|
573
|
+
}
|
|
574
|
+
return script + '</script>';
|
|
575
|
+
}
|
|
576
|
+
function postRequestTasks(type, status, request, componentResponse) {
|
|
577
|
+
(0, log_1.logServerResponse)(type, request, status);
|
|
578
|
+
(0, log_1.logCacheControlHeaders)(type, request, componentResponse);
|
|
579
|
+
(0, log_1.logQueryTimings)(type, request);
|
|
580
|
+
request.savePreloadQueries();
|
|
581
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PreloadQueriesByURL, ServerComponentRequest } from '../../framework/Hydration/ServerComponentRequest.server';
|
|
2
|
+
import type { QueryKey } from '../../types';
|
|
3
|
+
declare type ServerRequestProviderProps = {
|
|
4
|
+
isRSC: boolean;
|
|
5
|
+
request: ServerComponentRequest;
|
|
6
|
+
children: JSX.Element;
|
|
7
|
+
};
|
|
8
|
+
export declare function ServerRequestProvider({ isRSC, request, children, }: ServerRequestProviderProps): JSX.Element;
|
|
9
|
+
export declare function useServerRequest(): ServerComponentRequest;
|
|
10
|
+
declare type RequestCacheResult<T> = {
|
|
11
|
+
data: T;
|
|
12
|
+
error?: never;
|
|
13
|
+
} | {
|
|
14
|
+
data?: never;
|
|
15
|
+
error: Response;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Returns data stored in the request cache.
|
|
19
|
+
* It will throw the promise if data is not ready.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useRequestCacheData<T>(key: QueryKey, fetcher: () => Promise<T>): RequestCacheResult<T>;
|
|
22
|
+
export declare function preloadRequestCacheData(request: ServerComponentRequest, preloadQueries?: PreloadQueriesByURL): void;
|
|
23
|
+
export {};
|