@sitecore-content-sdk/nextjs 1.3.0-canary.9 → 1.4.0-canary.2
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/README.md +11 -11
- package/dist/cjs/client/index.js +10 -10
- package/dist/cjs/client/models.js +2 -2
- package/dist/cjs/client/sitecore-nextjs-client.js +160 -156
- package/dist/cjs/components/BYOCWrapper.js +31 -30
- package/dist/cjs/components/ComponentPropsContext.js +66 -59
- package/dist/cjs/components/FEaaSWrapper.js +33 -32
- package/dist/cjs/components/Link.js +117 -90
- package/dist/cjs/components/NextImage.js +66 -62
- package/dist/cjs/components/Placeholder.js +55 -50
- package/dist/cjs/components/RichText.js +133 -128
- package/dist/cjs/config/define-config.js +26 -25
- package/dist/cjs/config/index.js +5 -5
- package/dist/cjs/config-cli/define-cli-config.js +40 -39
- package/dist/cjs/config-cli/index.js +5 -5
- package/dist/cjs/editing/codegen/import-map.js +129 -118
- package/dist/cjs/editing/codegen/index.js +6 -6
- package/dist/cjs/editing/constants.js +10 -10
- package/dist/cjs/editing/editing-config-middleware.js +70 -69
- package/dist/cjs/editing/editing-render-middleware.js +145 -144
- package/dist/cjs/editing/feaas-render-middleware.js +102 -101
- package/dist/cjs/editing/index.js +19 -19
- package/dist/cjs/editing/render-middleware.js +46 -46
- package/dist/cjs/editing/utils.js +260 -257
- package/dist/cjs/index.js +132 -131
- package/dist/cjs/middleware/app-router-multisite-middleware.js +41 -20
- package/dist/cjs/middleware/index.js +30 -30
- package/dist/cjs/middleware/locale-middleware.js +85 -84
- package/dist/cjs/middleware/middleware.js +195 -192
- package/dist/cjs/middleware/multisite-middleware.js +141 -118
- package/dist/cjs/middleware/personalize-middleware.js +240 -236
- package/dist/cjs/middleware/redirects-middleware.js +323 -297
- package/dist/cjs/middleware/robots-middleware.js +45 -44
- package/dist/cjs/middleware/sitemap-middleware.js +50 -49
- package/dist/cjs/monitoring/healthcheck-middleware.js +31 -30
- package/dist/cjs/monitoring/index.js +5 -5
- package/dist/cjs/route-handler/editing-config-route-handler.js +110 -106
- package/dist/cjs/route-handler/editing-render-route-handler.js +270 -165
- package/dist/cjs/route-handler/index.js +11 -11
- package/dist/cjs/route-handler/robots-route-handler.js +69 -68
- package/dist/cjs/route-handler/sitemap-route-handler.js +66 -65
- package/dist/cjs/search/index.js +17 -0
- package/dist/cjs/services/component-props-service.js +142 -138
- package/dist/cjs/sharedTypes/component-props.js +2 -2
- package/dist/cjs/sharedTypes/sitecore-page-props.js +2 -2
- package/dist/cjs/site/index.js +5 -5
- package/dist/cjs/tools/codegen/import-map.js +15 -0
- package/dist/cjs/tools/component-props.loader.js +95 -95
- package/dist/cjs/tools/generate-map.js +317 -317
- package/dist/cjs/tools/index.js +14 -13
- package/dist/cjs/tools/templating/byoc-component.js +36 -36
- package/dist/cjs/tools/templating/constants.js +7 -7
- package/dist/cjs/tools/templating/default-component.js +35 -35
- package/dist/cjs/tools/templating/utils.js +200 -0
- package/dist/cjs/utils/index.js +14 -14
- package/dist/cjs/utils/utils.js +82 -73
- package/dist/esm/client/index.js +2 -2
- package/dist/esm/client/models.js +1 -1
- package/dist/esm/client/sitecore-nextjs-client.js +156 -152
- package/dist/esm/components/BYOCWrapper.js +27 -26
- package/dist/esm/components/ComponentPropsContext.js +28 -21
- package/dist/esm/components/FEaaSWrapper.js +29 -28
- package/dist/esm/components/Link.js +78 -51
- package/dist/esm/components/NextImage.js +60 -56
- package/dist/esm/components/Placeholder.js +18 -13
- package/dist/esm/components/RichText.js +96 -91
- package/dist/esm/config/define-config.js +21 -20
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/config-cli/define-cli-config.js +36 -35
- package/dist/esm/config-cli/index.js +1 -1
- package/dist/esm/editing/codegen/import-map.js +92 -81
- package/dist/esm/editing/codegen/index.js +1 -1
- package/dist/esm/editing/constants.js +7 -7
- package/dist/esm/editing/editing-config-middleware.js +66 -65
- package/dist/esm/editing/editing-render-middleware.js +141 -140
- package/dist/esm/editing/feaas-render-middleware.js +98 -97
- package/dist/esm/editing/index.js +6 -6
- package/dist/esm/editing/render-middleware.js +42 -42
- package/dist/esm/editing/utils.js +246 -243
- package/dist/esm/index.js +25 -25
- package/dist/esm/middleware/app-router-multisite-middleware.js +37 -16
- package/dist/esm/middleware/index.js +11 -11
- package/dist/esm/middleware/locale-middleware.js +81 -80
- package/dist/esm/middleware/middleware.js +189 -186
- package/dist/esm/middleware/multisite-middleware.js +137 -114
- package/dist/esm/middleware/personalize-middleware.js +236 -232
- package/dist/esm/middleware/redirects-middleware.js +316 -290
- package/dist/esm/middleware/robots-middleware.js +41 -40
- package/dist/esm/middleware/sitemap-middleware.js +46 -45
- package/dist/esm/monitoring/healthcheck-middleware.js +27 -26
- package/dist/esm/monitoring/index.js +1 -1
- package/dist/esm/route-handler/editing-config-route-handler.js +106 -102
- package/dist/esm/route-handler/editing-render-route-handler.js +265 -160
- package/dist/esm/route-handler/index.js +4 -4
- package/dist/esm/route-handler/robots-route-handler.js +65 -64
- package/dist/esm/route-handler/sitemap-route-handler.js +63 -62
- package/dist/esm/search/index.js +1 -0
- package/dist/esm/services/component-props-service.js +135 -131
- package/dist/esm/sharedTypes/component-props.js +1 -1
- package/dist/esm/sharedTypes/sitecore-page-props.js +1 -1
- package/dist/esm/site/index.js +1 -1
- package/dist/esm/tools/codegen/import-map.js +11 -0
- package/dist/esm/tools/component-props.loader.js +59 -59
- package/dist/esm/tools/generate-map.js +279 -279
- package/dist/esm/tools/index.js +3 -2
- package/dist/esm/tools/templating/byoc-component.js +30 -30
- package/dist/esm/tools/templating/constants.js +4 -4
- package/dist/esm/tools/templating/default-component.js +29 -29
- package/dist/esm/tools/templating/utils.js +190 -0
- package/dist/esm/utils/index.js +3 -3
- package/dist/esm/utils/utils.js +74 -65
- package/package.json +87 -13
- package/search.d.ts +1 -0
- package/types/client/index.d.ts +3 -2
- package/types/client/index.d.ts.map +1 -0
- package/types/client/models.d.ts +9 -8
- package/types/client/models.d.ts.map +1 -0
- package/types/client/sitecore-nextjs-client.d.ts +68 -63
- package/types/client/sitecore-nextjs-client.d.ts.map +1 -0
- package/types/components/BYOCWrapper.d.ts +16 -14
- package/types/components/BYOCWrapper.d.ts.map +1 -0
- package/types/components/ComponentPropsContext.d.ts +30 -18
- package/types/components/ComponentPropsContext.d.ts.map +1 -0
- package/types/components/FEaaSWrapper.d.ts +17 -15
- package/types/components/FEaaSWrapper.d.ts.map +1 -0
- package/types/components/Link.d.ts +25 -15
- package/types/components/Link.d.ts.map +1 -0
- package/types/components/NextImage.d.ts +11 -6
- package/types/components/NextImage.d.ts.map +1 -0
- package/types/components/Placeholder.d.ts +14 -8
- package/types/components/Placeholder.d.ts.map +1 -0
- package/types/components/RichText.d.ts +35 -25
- package/types/components/RichText.d.ts.map +1 -0
- package/types/config/define-config.d.ts +42 -38
- package/types/config/define-config.d.ts.map +1 -0
- package/types/config/index.d.ts +2 -1
- package/types/config/index.d.ts.map +1 -0
- package/types/config-cli/define-cli-config.d.ts +10 -8
- package/types/config-cli/define-cli-config.d.ts.map +1 -0
- package/types/config-cli/index.d.ts +2 -1
- package/types/config-cli/index.d.ts.map +1 -0
- package/types/editing/codegen/import-map.d.ts +15 -3
- package/types/editing/codegen/import-map.d.ts.map +1 -0
- package/types/editing/codegen/index.d.ts +3 -2
- package/types/editing/codegen/index.d.ts.map +1 -0
- package/types/editing/constants.d.ts +8 -7
- package/types/editing/constants.d.ts.map +1 -0
- package/types/editing/editing-config-middleware.d.ts +37 -31
- package/types/editing/editing-config-middleware.d.ts.map +1 -0
- package/types/editing/editing-render-middleware.d.ts +47 -44
- package/types/editing/editing-render-middleware.d.ts.map +1 -0
- package/types/editing/feaas-render-middleware.d.ts +35 -32
- package/types/editing/feaas-render-middleware.d.ts.map +1 -0
- package/types/editing/index.d.ts +7 -6
- package/types/editing/index.d.ts.map +1 -0
- package/types/editing/render-middleware.d.ts +26 -25
- package/types/editing/render-middleware.d.ts.map +1 -0
- package/types/editing/utils.d.ts +110 -106
- package/types/editing/utils.d.ts.map +1 -0
- package/types/index.d.ts +25 -24
- package/types/index.d.ts.map +1 -0
- package/types/middleware/app-router-multisite-middleware.d.ts +28 -13
- package/types/middleware/app-router-multisite-middleware.d.ts.map +1 -0
- package/types/middleware/index.d.ts +12 -11
- package/types/middleware/index.d.ts.map +1 -0
- package/types/middleware/locale-middleware.d.ts +35 -32
- package/types/middleware/locale-middleware.d.ts.map +1 -0
- package/types/middleware/middleware.d.ts +135 -127
- package/types/middleware/middleware.d.ts.map +1 -0
- package/types/middleware/multisite-middleware.d.ts +54 -37
- package/types/middleware/multisite-middleware.d.ts.map +1 -0
- package/types/middleware/personalize-middleware.d.ts +81 -65
- package/types/middleware/personalize-middleware.d.ts.map +1 -0
- package/types/middleware/redirects-middleware.d.ts +68 -65
- package/types/middleware/redirects-middleware.d.ts.map +1 -0
- package/types/middleware/robots-middleware.d.ts +15 -13
- package/types/middleware/robots-middleware.d.ts.map +1 -0
- package/types/middleware/sitemap-middleware.d.ts +16 -14
- package/types/middleware/sitemap-middleware.d.ts.map +1 -0
- package/types/monitoring/healthcheck-middleware.d.ts +14 -12
- package/types/monitoring/healthcheck-middleware.d.ts.map +1 -0
- package/types/monitoring/index.d.ts +2 -1
- package/types/monitoring/index.d.ts.map +1 -0
- package/types/route-handler/editing-config-route-handler.d.ts +30 -24
- package/types/route-handler/editing-config-route-handler.d.ts.map +1 -0
- package/types/route-handler/editing-render-route-handler.d.ts +33 -25
- package/types/route-handler/editing-render-route-handler.d.ts.map +1 -0
- package/types/route-handler/index.d.ts +5 -4
- package/types/route-handler/index.d.ts.map +1 -0
- package/types/route-handler/robots-route-handler.d.ts +30 -28
- package/types/route-handler/robots-route-handler.d.ts.map +1 -0
- package/types/route-handler/sitemap-route-handler.d.ts +30 -28
- package/types/route-handler/sitemap-route-handler.d.ts.map +1 -0
- package/types/search/index.d.ts +2 -0
- package/types/search/index.d.ts.map +1 -0
- package/types/services/component-props-service.d.ts +62 -57
- package/types/services/component-props-service.d.ts.map +1 -0
- package/types/sharedTypes/component-props.d.ts +62 -47
- package/types/sharedTypes/component-props.d.ts.map +1 -0
- package/types/sharedTypes/sitecore-page-props.d.ts +14 -9
- package/types/sharedTypes/sitecore-page-props.d.ts.map +1 -0
- package/types/site/index.d.ts +2 -1
- package/types/site/index.d.ts.map +1 -0
- package/types/tools/codegen/import-map.d.ts +10 -0
- package/types/tools/codegen/import-map.d.ts.map +1 -0
- package/types/tools/component-props.loader.d.ts +8 -7
- package/types/tools/component-props.loader.d.ts.map +1 -0
- package/types/tools/generate-map.d.ts +26 -24
- package/types/tools/generate-map.d.ts.map +1 -0
- package/types/tools/index.d.ts +4 -2
- package/types/tools/index.d.ts.map +1 -0
- package/types/tools/templating/byoc-component.d.ts +3 -2
- package/types/tools/templating/byoc-component.d.ts.map +1 -0
- package/types/tools/templating/constants.d.ts +5 -4
- package/types/tools/templating/constants.d.ts.map +1 -0
- package/types/tools/templating/default-component.d.ts +3 -2
- package/types/tools/templating/default-component.d.ts.map +1 -0
- package/types/tools/templating/utils.d.ts +44 -0
- package/types/tools/templating/utils.d.ts.map +1 -0
- package/types/utils/index.d.ts +4 -3
- package/types/utils/index.d.ts.map +1 -0
- package/types/utils/utils.d.ts +34 -24
- package/types/utils/utils.d.ts.map +1 -0
- package/client.js +0 -1
- package/codegen.js +0 -1
- package/config-cli.js +0 -1
- package/config.js +0 -1
- package/editing.js +0 -1
- package/middleware.js +0 -1
- package/monitoring.js +0 -1
- package/route-handler.js +0 -1
- package/site.js +0 -1
- package/tools.js +0 -1
- package/utils.js +0 -1
|
@@ -1,297 +1,323 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.RedirectsMiddleware = void 0;
|
|
16
|
-
const core_1 = require("@sitecore-content-sdk/core");
|
|
17
|
-
const site_1 = require("@sitecore-content-sdk/core/site");
|
|
18
|
-
const utils_1 = require("@sitecore-content-sdk/core/utils");
|
|
19
|
-
const server_1 = require("next/server");
|
|
20
|
-
const regex_parser_1 = __importDefault(require("regex-parser"));
|
|
21
|
-
const middleware_1 = require("./middleware");
|
|
22
|
-
const REGEXP_CONTEXT_SITE_LANG = new RegExp(/\$siteLang/, 'i');
|
|
23
|
-
const REGEXP_ABSOLUTE_URL = new RegExp('^(?:[a-z]+:)?//', 'i');
|
|
24
|
-
/**
|
|
25
|
-
* Middleware / handler fetches all redirects from Sitecore instance by grapqhl service
|
|
26
|
-
* compares with current url and redirects to target url
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
this.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if (
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
return
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
*
|
|
280
|
-
* @param {string}
|
|
281
|
-
* @
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.RedirectsMiddleware = void 0;
|
|
16
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
17
|
+
const site_1 = require("@sitecore-content-sdk/core/site");
|
|
18
|
+
const utils_1 = require("@sitecore-content-sdk/core/utils");
|
|
19
|
+
const server_1 = require("next/server");
|
|
20
|
+
const regex_parser_1 = __importDefault(require("regex-parser"));
|
|
21
|
+
const middleware_1 = require("./middleware");
|
|
22
|
+
const REGEXP_CONTEXT_SITE_LANG = new RegExp(/\$siteLang/, 'i');
|
|
23
|
+
const REGEXP_ABSOLUTE_URL = new RegExp('^(?:[a-z]+:)?//', 'i');
|
|
24
|
+
/**
|
|
25
|
+
* Middleware / handler fetches all redirects from Sitecore instance by grapqhl service
|
|
26
|
+
* compares with current url and redirects to target url
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
30
|
+
/**
|
|
31
|
+
* @param {RedirectsMiddlewareConfig} [config] redirects middleware config
|
|
32
|
+
*/
|
|
33
|
+
constructor(config) {
|
|
34
|
+
var _a;
|
|
35
|
+
super(config);
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.handle = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
if (!this.config.enabled) {
|
|
39
|
+
core_1.debug.redirects('skipped (redirects middleware is disabled globally)');
|
|
40
|
+
return res;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const pathname = req.nextUrl.pathname;
|
|
44
|
+
const language = this.getLanguage(req, res);
|
|
45
|
+
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
46
|
+
let site;
|
|
47
|
+
const startTimestamp = Date.now();
|
|
48
|
+
core_1.debug.redirects('redirects middleware start: %o', {
|
|
49
|
+
pathname,
|
|
50
|
+
language,
|
|
51
|
+
hostname,
|
|
52
|
+
});
|
|
53
|
+
if (this.disabled(req, res)) {
|
|
54
|
+
core_1.debug.redirects('skipped (redirects middleware is disabled)');
|
|
55
|
+
return res;
|
|
56
|
+
}
|
|
57
|
+
const isAppRouterRequest = this.isAppRouter(res);
|
|
58
|
+
const createResponse = () => __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
var _a;
|
|
60
|
+
if (this.isPreview(req)) {
|
|
61
|
+
core_1.debug.redirects('skipped (preview)');
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
64
|
+
// Skip prefetch requests from Next.js, which are not original client requests
|
|
65
|
+
// as they load unnecessary requests that burden the redirects middleware with meaningless traffic
|
|
66
|
+
if (this.isPrefetch(req)) {
|
|
67
|
+
core_1.debug.redirects('skipped (prefetch)');
|
|
68
|
+
res.headers.set('x-middleware-cache', 'no-cache');
|
|
69
|
+
res.headers.set('Cache-Control', 'no-store, must-revalidate');
|
|
70
|
+
return res;
|
|
71
|
+
}
|
|
72
|
+
site = this.getSite(req, res);
|
|
73
|
+
// Find the redirect from result of RedirectService
|
|
74
|
+
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
75
|
+
if (!existsRedirect) {
|
|
76
|
+
core_1.debug.redirects('skipped (redirect does not exist)');
|
|
77
|
+
return res;
|
|
78
|
+
}
|
|
79
|
+
core_1.debug.redirects('Matched redirect rule: %o', { existsRedirect });
|
|
80
|
+
// Find context site language and replace token
|
|
81
|
+
if (REGEXP_CONTEXT_SITE_LANG.test(existsRedirect.target) &&
|
|
82
|
+
!(REGEXP_ABSOLUTE_URL.test(existsRedirect.target) &&
|
|
83
|
+
existsRedirect.target.includes(hostname))) {
|
|
84
|
+
existsRedirect.target = existsRedirect.target.replace(REGEXP_CONTEXT_SITE_LANG, site.language);
|
|
85
|
+
if (!isAppRouterRequest) {
|
|
86
|
+
req.nextUrl.locale = site.language;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const url = this.normalizeUrl(req.nextUrl.clone());
|
|
90
|
+
// Redirect logic for external (absolute) URLS. To avoid locale stripping: use plain string for external URLs to prevent Next.js rewriting.
|
|
91
|
+
if (REGEXP_ABSOLUTE_URL.test(existsRedirect.target)) {
|
|
92
|
+
// Perform variable substitution for absolute URLs
|
|
93
|
+
let finalTarget = existsRedirect.target;
|
|
94
|
+
if ((0, utils_1.isRegexOrUrl)(existsRedirect.pattern) === 'regex') {
|
|
95
|
+
const matched = url.pathname
|
|
96
|
+
.replace(/\/*$/gi, '')
|
|
97
|
+
.match((0, regex_parser_1.default)(existsRedirect.pattern));
|
|
98
|
+
if (matched) {
|
|
99
|
+
finalTarget = existsRedirect.target.replace(/\$(\d+)/g, (_, index) => {
|
|
100
|
+
return matched[parseInt(index, 10)] || '';
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return this.dispatchRedirect(finalTarget, existsRedirect.redirectType, req, res, true);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const isUrl = (0, utils_1.isRegexOrUrl)(existsRedirect.pattern) === 'url';
|
|
108
|
+
const targetParts = existsRedirect.target.split('/');
|
|
109
|
+
const urlFirstPart = targetParts[1];
|
|
110
|
+
if (this.locales.includes(urlFirstPart)) {
|
|
111
|
+
if (!isAppRouterRequest) {
|
|
112
|
+
req.nextUrl.locale = urlFirstPart;
|
|
113
|
+
}
|
|
114
|
+
existsRedirect.target = existsRedirect.target.replace(`/${urlFirstPart}`, '');
|
|
115
|
+
}
|
|
116
|
+
const targetSegments = isUrl
|
|
117
|
+
? existsRedirect.target.split('?')
|
|
118
|
+
: url.pathname.replace(/\/*$/gi, '') + existsRedirect.matchedQueryString;
|
|
119
|
+
const [targetPath, targetQueryString] = isUrl
|
|
120
|
+
? targetSegments
|
|
121
|
+
: targetSegments
|
|
122
|
+
.replace((0, regex_parser_1.default)(existsRedirect.pattern), existsRedirect.target)
|
|
123
|
+
.replace(/^\/\//, '/')
|
|
124
|
+
.split('?');
|
|
125
|
+
const mergedQueryString = existsRedirect.isQueryStringPreserved
|
|
126
|
+
? (0, utils_1.mergeURLSearchParams)(new URLSearchParams((_a = url.search) !== null && _a !== void 0 ? _a : ''), new URLSearchParams(targetQueryString || ''))
|
|
127
|
+
: targetQueryString || '';
|
|
128
|
+
const prepareNewURL = new URL(`${targetPath}${mergedQueryString ? '?' + mergedQueryString : ''}`, url.origin);
|
|
129
|
+
url.href = prepareNewURL.href;
|
|
130
|
+
url.pathname = prepareNewURL.pathname;
|
|
131
|
+
url.search = prepareNewURL.search;
|
|
132
|
+
if (!isAppRouterRequest) {
|
|
133
|
+
url.locale = req.nextUrl.locale;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** return Response redirect with http code of redirect type */
|
|
137
|
+
return this.dispatchRedirect(url, existsRedirect.redirectType, req, res, false);
|
|
138
|
+
});
|
|
139
|
+
const response = yield createResponse();
|
|
140
|
+
core_1.debug.redirects('redirects middleware end in %dms: %o', Date.now() - startTimestamp, {
|
|
141
|
+
redirected: response.redirected,
|
|
142
|
+
status: response.status,
|
|
143
|
+
url: response.url,
|
|
144
|
+
headers: this.extractDebugHeaders(response.headers),
|
|
145
|
+
});
|
|
146
|
+
return response;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
console.log('Redirect middleware failed:');
|
|
150
|
+
console.log(error);
|
|
151
|
+
return res;
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
const graphQLOptions = {
|
|
155
|
+
api: Object.assign({ edge: {
|
|
156
|
+
contextId: this.config.contextId,
|
|
157
|
+
clientContextId: this.config.clientContextId,
|
|
158
|
+
edgeUrl: this.config.edgeUrl,
|
|
159
|
+
} }, (this.config.apiHost && this.config.apiKey
|
|
160
|
+
? {
|
|
161
|
+
local: {
|
|
162
|
+
apiHost: this.config.apiHost,
|
|
163
|
+
apiKey: this.config.apiKey,
|
|
164
|
+
path: this.config.path,
|
|
165
|
+
},
|
|
166
|
+
}
|
|
167
|
+
: {})),
|
|
168
|
+
};
|
|
169
|
+
// NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
|
|
170
|
+
// (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
|
|
171
|
+
this.redirectsService =
|
|
172
|
+
(_a = this.config.redirectsService) !== null && _a !== void 0 ? _a : new site_1.RedirectsService(Object.assign(Object.assign({}, config), { clientFactory: this.getClientFactory(graphQLOptions), fetch: fetch }));
|
|
173
|
+
this.locales = config.locales;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Method returns RedirectInfo when matches
|
|
177
|
+
* @param {NextRequest} req request
|
|
178
|
+
* @param {string} siteName site name
|
|
179
|
+
* @returns Promise<RedirectInfo | undefined>
|
|
180
|
+
* @private
|
|
181
|
+
*/
|
|
182
|
+
getExistsRedirect(req, siteName) {
|
|
183
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
184
|
+
const { pathname: incomingURL, search: incomingQS = '' } = this.normalizeUrl(req.nextUrl.clone());
|
|
185
|
+
const locale = this.getLanguage(req);
|
|
186
|
+
const normalizedPath = incomingURL.replace(/\/*$/gi, '').toLowerCase();
|
|
187
|
+
const redirects = yield this.redirectsService.fetchRedirects(siteName);
|
|
188
|
+
const language = this.getLanguage(req);
|
|
189
|
+
const modifyRedirects = structuredClone(redirects);
|
|
190
|
+
let matchedQueryString;
|
|
191
|
+
const localePath = `/${locale.toLowerCase()}${normalizedPath}`;
|
|
192
|
+
return modifyRedirects.length
|
|
193
|
+
? modifyRedirects.find((redirect) => {
|
|
194
|
+
// process static URL (non-regex) rules
|
|
195
|
+
if ((0, utils_1.isRegexOrUrl)(redirect.pattern) === 'url') {
|
|
196
|
+
const urlArray = redirect.pattern.endsWith('/')
|
|
197
|
+
? redirect.pattern.slice(0, -1).split('?')
|
|
198
|
+
: redirect.pattern.split('?');
|
|
199
|
+
const patternQS = urlArray[1];
|
|
200
|
+
let patternPath = urlArray[0].toLowerCase();
|
|
201
|
+
// nextjs routes are case-sensitive, but locales should be compared case-insensitively
|
|
202
|
+
const patternParts = patternPath.split('/');
|
|
203
|
+
const maybeLocale = patternParts[1].toLowerCase();
|
|
204
|
+
// case insensitive lookup of locales
|
|
205
|
+
if (new RegExp(this.locales.join('|'), 'i').test(maybeLocale)) {
|
|
206
|
+
patternPath = patternPath.replace(`/${patternParts[1]}`, `/${maybeLocale}`);
|
|
207
|
+
}
|
|
208
|
+
return ((patternPath === localePath || patternPath === normalizedPath) &&
|
|
209
|
+
(!patternQS ||
|
|
210
|
+
(0, utils_1.areURLSearchParamsEqual)(new URLSearchParams(patternQS), new URLSearchParams(incomingQS))));
|
|
211
|
+
}
|
|
212
|
+
// process regex rules
|
|
213
|
+
// Modify the redirect pattern to ignore the language prefix in the path
|
|
214
|
+
// And escapes non-special "?" characters in a string or regex.
|
|
215
|
+
redirect.pattern = (0, utils_1.escapeNonSpecialQuestionMarks)(redirect.pattern.replace(new RegExp(`^[^]?/${language}/`, 'gi'), ''));
|
|
216
|
+
// Prepare the redirect pattern as a regular expression, making it more flexible for matching URLs
|
|
217
|
+
redirect.pattern = `/^\/${redirect.pattern
|
|
218
|
+
.replace(/^\/|\/$/g, '') // Removes leading and trailing slashes
|
|
219
|
+
.replace(/^\^\/|\/\$$/g, '') // Removes unnecessary start (^) and end ($) anchors
|
|
220
|
+
.replace(/^\^|\$$/g, '') // Further cleans up anchors
|
|
221
|
+
.replace(/\$\/gi$/g, '')}[\/]?$/i`; // Ensures the pattern allows an optional trailing slash
|
|
222
|
+
// Redirect pattern matches the full incoming URL with query string present
|
|
223
|
+
matchedQueryString = [
|
|
224
|
+
(0, regex_parser_1.default)(redirect.pattern).test(`/${localePath}${incomingQS}`),
|
|
225
|
+
(0, regex_parser_1.default)(redirect.pattern).test(`${normalizedPath}${incomingQS}`),
|
|
226
|
+
].some(Boolean)
|
|
227
|
+
? incomingQS
|
|
228
|
+
: undefined;
|
|
229
|
+
// Save the matched query string (if found) into the redirect object
|
|
230
|
+
redirect.matchedQueryString = matchedQueryString || '';
|
|
231
|
+
return (!!((0, regex_parser_1.default)(redirect.pattern).test(`/${req.nextUrl.locale}${incomingURL}`) ||
|
|
232
|
+
(0, regex_parser_1.default)(redirect.pattern).test(incomingURL) ||
|
|
233
|
+
matchedQueryString) && (redirect.locale ? redirect.locale.toLowerCase() === locale.toLowerCase() : true));
|
|
234
|
+
})
|
|
235
|
+
: undefined;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* When a user clicks on a link generated by the Link component from next/link,
|
|
240
|
+
* Next.js adds special parameters in the route called path.
|
|
241
|
+
* This method removes these special parameters.
|
|
242
|
+
* @param {NextURL} url
|
|
243
|
+
* @returns {string} normalize url
|
|
244
|
+
*/
|
|
245
|
+
normalizeUrl(url) {
|
|
246
|
+
if (!url.search) {
|
|
247
|
+
return url;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Prepare special parameters for exclusion.
|
|
251
|
+
*/
|
|
252
|
+
const splittedPathname = url.pathname
|
|
253
|
+
.split('/')
|
|
254
|
+
.filter((route) => route)
|
|
255
|
+
.map((route) => `path=${route}`);
|
|
256
|
+
/**
|
|
257
|
+
* Remove special parameters(Next.JS)
|
|
258
|
+
* Example: /about/contact/us
|
|
259
|
+
* When a user clicks on this link, Next.js should generate a link for the middleware, formatted like this:
|
|
260
|
+
* http://host/about/contact/us?path=about&path=contact&path=us
|
|
261
|
+
*/
|
|
262
|
+
const newQueryString = url.search
|
|
263
|
+
.replace(/^\?/, '')
|
|
264
|
+
.split('&')
|
|
265
|
+
.filter((param) => {
|
|
266
|
+
if (!splittedPathname.includes(param)) {
|
|
267
|
+
return param;
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
})
|
|
271
|
+
.join('&');
|
|
272
|
+
const newUrl = new URL(`${url.pathname.toLowerCase()}?${newQueryString}`, url.origin);
|
|
273
|
+
url.search = newUrl.search;
|
|
274
|
+
url.pathname = newUrl.pathname.toLocaleLowerCase();
|
|
275
|
+
url.href = newUrl.href;
|
|
276
|
+
return url;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Helper function to dispatch a redirect or rewrite based on the redirect type.
|
|
280
|
+
* @param {NextURL | string} target The final target to redirect/rewrite to.
|
|
281
|
+
* @param {string} type One of `REDIRECT_TYPE_301`, `REDIRECT_TYPE_302`, or `REDIRECT_TYPE_SERVER_TRANSFER`.
|
|
282
|
+
* @param {NextRequest} req The incoming request.
|
|
283
|
+
* @param {NextResponse} res The current response (used for header cleanup / carry-over).
|
|
284
|
+
* @param {boolean} isExternal Set to `true` when `target` is an external absolute URL (e.g. `https://…`).
|
|
285
|
+
* Passed through to `rewrite` so it can skip locale/basePath stripping for externals.
|
|
286
|
+
* @returns {NextResponse} The redirect/rewrite response, or `res` if the type is not recognized.
|
|
287
|
+
*/
|
|
288
|
+
dispatchRedirect(target, type, req, res, isExternal = false) {
|
|
289
|
+
switch (type) {
|
|
290
|
+
case site_1.REDIRECT_TYPE_301:
|
|
291
|
+
return this.createRedirectResponse(target, res, 301, 'Moved Permanently');
|
|
292
|
+
case site_1.REDIRECT_TYPE_302:
|
|
293
|
+
return this.createRedirectResponse(target, res, 302, 'Found');
|
|
294
|
+
case site_1.REDIRECT_TYPE_SERVER_TRANSFER:
|
|
295
|
+
// rewrite expects a string; unwrap NextURL if needed
|
|
296
|
+
return this.rewrite(typeof target === 'string' ? target : target.href, req, res, isExternal);
|
|
297
|
+
default:
|
|
298
|
+
return res;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Helper function to create a redirect response and remove the x-middleware-next header.
|
|
303
|
+
* @param {NextURL | string} url The URL to redirect to.
|
|
304
|
+
* @param {Response} res The response object.
|
|
305
|
+
* @param {number} status The HTTP status code of the redirect.
|
|
306
|
+
* @param {string} statusText The status text of the redirect.
|
|
307
|
+
* @returns {NextResponse<unknown>} The redirect response.
|
|
308
|
+
*/
|
|
309
|
+
createRedirectResponse(url, res, status, statusText) {
|
|
310
|
+
const redirect = server_1.NextResponse.redirect(url, {
|
|
311
|
+
status,
|
|
312
|
+
statusText,
|
|
313
|
+
headers: res === null || res === void 0 ? void 0 : res.headers,
|
|
314
|
+
});
|
|
315
|
+
if (res === null || res === void 0 ? void 0 : res.headers) {
|
|
316
|
+
redirect.headers.delete('x-middleware-next');
|
|
317
|
+
redirect.headers.delete('x-middleware-rewrite');
|
|
318
|
+
redirect.headers.delete(middleware_1.REWRITE_HEADER_NAME);
|
|
319
|
+
}
|
|
320
|
+
return redirect;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
exports.RedirectsMiddleware = RedirectsMiddleware;
|