@prezly/theme-kit-nextjs 10.8.0 → 10.9.1

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.
Files changed (52) hide show
  1. package/README.md +73 -0
  2. package/build/adapters/app-helper/server.cjs +2 -4
  3. package/build/adapters/app-helper/server.mjs +2 -4
  4. package/build/adapters/intl/server.cjs +2 -3
  5. package/build/adapters/intl/server.mjs +2 -3
  6. package/build/adapters/metadata/lib/generateCategoryPageMetadata.cjs +5 -8
  7. package/build/adapters/metadata/lib/generateCategoryPageMetadata.mjs +5 -8
  8. package/build/adapters/metadata/lib/generateMediaGalleryPageMetadata.cjs +13 -8
  9. package/build/adapters/metadata/lib/generateMediaGalleryPageMetadata.mjs +13 -8
  10. package/build/adapters/metadata/lib/generateMediaPageMetadata.cjs +3 -5
  11. package/build/adapters/metadata/lib/generateMediaPageMetadata.mjs +3 -5
  12. package/build/adapters/metadata/lib/generateRootMetadata.cjs +14 -5
  13. package/build/adapters/metadata/lib/generateRootMetadata.mjs +14 -5
  14. package/build/adapters/metadata/lib/generateSearchPageMetadata.cjs +3 -5
  15. package/build/adapters/metadata/lib/generateSearchPageMetadata.mjs +3 -5
  16. package/build/adapters/metadata/lib/generateStoryPageMetadata.cjs +17 -10
  17. package/build/adapters/metadata/lib/generateStoryPageMetadata.mjs +17 -10
  18. package/build/adapters/metadata/lib/utils/generatePageMetadata.cjs +16 -7
  19. package/build/adapters/metadata/lib/utils/generatePageMetadata.mjs +16 -7
  20. package/build/adapters/metadata/server.cjs +1 -3
  21. package/build/adapters/metadata/server.mjs +1 -3
  22. package/build/adapters/prezly/cache/configure.d.ts +2 -0
  23. package/build/adapters/prezly/cache/redis.cjs +54 -22
  24. package/build/adapters/prezly/cache/redis.mjs +54 -22
  25. package/build/adapters/prezly/cache/redis.test.cjs +103 -0
  26. package/build/adapters/prezly/cache/redis.test.mjs +101 -0
  27. package/build/adapters/prezly/requests.cjs +152 -0
  28. package/build/adapters/prezly/requests.d.ts +17 -0
  29. package/build/adapters/prezly/requests.mjs +144 -0
  30. package/build/adapters/prezly/requests.test.cjs +201 -0
  31. package/build/adapters/prezly/requests.test.mjs +199 -0
  32. package/build/adapters/prezly/server.cjs +42 -18
  33. package/build/adapters/prezly/server.mjs +41 -18
  34. package/build/adapters/prezly/server.test.cjs +304 -0
  35. package/build/adapters/prezly/server.test.mjs +302 -0
  36. package/build/adapters/routing/lib/RoutingAdapter.client.cjs +5 -9
  37. package/build/adapters/routing/lib/RoutingAdapter.client.mjs +5 -9
  38. package/build/adapters/routing/lib/RoutingAdapter.server.cjs +5 -6
  39. package/build/adapters/routing/lib/RoutingAdapter.server.mjs +5 -6
  40. package/build/adapters/theme-settings/server.cjs +10 -1
  41. package/build/adapters/theme-settings/server.mjs +10 -1
  42. package/build/middleware/intl-middleware.cjs +22 -11
  43. package/build/middleware/intl-middleware.mjs +22 -11
  44. package/build/next-config/index.cjs +5 -7
  45. package/build/next-config/index.mjs +5 -7
  46. package/build/playwright/config.cjs +5 -5
  47. package/build/playwright/config.mjs +5 -5
  48. package/build/robots/server.cjs +1 -3
  49. package/build/robots/server.mjs +1 -3
  50. package/build/sentry/common.cjs +3 -7
  51. package/build/sentry/common.mjs +3 -7
  52. package/package.json +112 -109
@@ -3,38 +3,61 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
+ import { sha256 } from '@noble/hashes/sha256';
7
+ import { bytesToHex } from '@noble/hashes/utils';
8
+ import stableStringify from 'json-stable-stringify';
6
9
  import { createPrezlyClient } from '@prezly/sdk';
7
10
  import { ContentDelivery, Resolvable } from '@prezly/theme-kit-core';
8
11
  import { configure as configureCache } from "./cache/index.mjs";
12
+ import { createBoundedFetch } from "./requests.mjs";
9
13
  export var PrezlyAdapter;
10
14
  (function (_PrezlyAdapter) {
11
15
  function connect(config) {
12
- var {
13
- cache: cacheConfig,
14
- fetch
15
- } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
17
+ cacheConfig = _ref.cache,
18
+ fetch = _ref.fetch;
16
19
  function usePrezlyClient() {
17
- var {
18
- // sdk client properties
19
- accessToken,
20
- baseUrl,
21
- headers,
22
- // contentDelivery client properties
23
- newsroom,
24
- theme,
25
- formats
26
- } = Resolvable.resolve(config);
20
+ var _cacheConfig$namespac, _cacheConfig$memory;
21
+ var _Resolvable$resolve = Resolvable.resolve(config),
22
+ accessToken = _Resolvable$resolve.accessToken,
23
+ baseUrl = _Resolvable$resolve.baseUrl,
24
+ headers = _Resolvable$resolve.headers,
25
+ newsroom = _Resolvable$resolve.newsroom,
26
+ theme = _Resolvable$resolve.theme,
27
+ formats = _Resolvable$resolve.formats;
27
28
  var client = createPrezlyClient({
28
29
  fetch,
29
30
  accessToken,
30
31
  baseUrl,
31
32
  headers
32
33
  });
33
- var contentDelivery = ContentDelivery.createClient(client, newsroom, theme, {
34
+ var cache = cacheConfig ? configureCache(_objectSpread({
35
+ namespace: 'content:'
36
+ }, cacheConfig)) : undefined;
37
+ // Custom fetches may depend on hidden request context. Preserve their
38
+ // existing cache behavior unless the caller declares that identity.
39
+ var scope = cache && (!fetch || (cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.requestScope) !== undefined) ? bytesToHex(sha256(stableStringify({
40
+ baseUrl: baseUrl !== null && baseUrl !== void 0 ? baseUrl : 'https://api.prezly.com',
41
+ accessToken,
42
+ headers: headers !== null && headers !== void 0 ? headers : {},
43
+ cache: {
44
+ namespace: (_cacheConfig$namespac = cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.namespace) !== null && _cacheConfig$namespac !== void 0 ? _cacheConfig$namespac : 'content:',
45
+ memory: (_cacheConfig$memory = cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.memory) !== null && _cacheConfig$memory !== void 0 ? _cacheConfig$memory : false,
46
+ redis: cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.redis
47
+ },
48
+ requestScope: cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.requestScope
49
+ }))) : undefined;
50
+ var contentClient = cache ? createPrezlyClient({
51
+ accessToken,
52
+ baseUrl,
53
+ headers,
54
+ fetch: createBoundedFetch(fetch !== null && fetch !== void 0 ? fetch : globalThis.fetch)
55
+ }) : client;
56
+ var contentDelivery = ContentDelivery.createClient(contentClient, newsroom, theme, {
34
57
  formats,
35
- cache: cacheConfig ? configureCache(_objectSpread({
36
- namespace: 'content:'
37
- }, cacheConfig)) : undefined
58
+ cache: cache ? _objectSpread(_objectSpread({}, cache), {}, {
59
+ scope
60
+ }) : undefined
38
61
  });
39
62
  return {
40
63
  client,
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+
3
+ var _sdk = require("@prezly/sdk");
4
+ var _themeKitCore = require("@prezly/theme-kit-core");
5
+ var _requests = require("./requests.cjs");
6
+ var _server = require("./server.cjs");
7
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
10
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
11
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
13
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
14
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
15
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
16
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
17
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
18
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
19
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
20
+ var tick = () => new Promise(resolve => setImmediate(resolve));
21
+ var nativeFetch = globalThis.fetch;
22
+ var sequence = 0;
23
+ var config = {
24
+ newsroom: 'room',
25
+ accessToken: 'test-token',
26
+ baseUrl: 'https://example.test'
27
+ };
28
+ var cache = () => ({
29
+ memory: true,
30
+ latestVersion: 1,
31
+ namespace: "adapter-test-".concat(sequence++)
32
+ });
33
+ function response(name) {
34
+ return new Response(JSON.stringify({
35
+ newsroom: {
36
+ name,
37
+ stories_number: 600
38
+ }
39
+ }), {
40
+ headers: {
41
+ 'content-type': 'application/json'
42
+ }
43
+ });
44
+ }
45
+ afterEach(() => {
46
+ globalThis.fetch = nativeFetch;
47
+ });
48
+ it('coalesces 20 independently constructed adapters and then uses the warm cache', /*#__PURE__*/_asyncToGenerator(function* () {
49
+ var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
50
+ return response('room');
51
+ }));
52
+ globalThis.fetch = fetchMock;
53
+ var caching = cache();
54
+ var client = () => _server.PrezlyAdapter.connect(config, {
55
+ cache: caching
56
+ }).usePrezlyClient().contentDelivery;
57
+ var values = yield Promise.all(Array.from({
58
+ length: 20
59
+ }, () => client().newsroom()));
60
+ expect(values.every(value => value.name === 'room')).toBe(true);
61
+ expect(fetchMock).toHaveBeenCalledTimes(1);
62
+ yield tick();
63
+ yield client().newsroom();
64
+ expect(fetchMock).toHaveBeenCalledTimes(1);
65
+ }));
66
+ it.each([['token', {
67
+ accessToken: 'second-token'
68
+ }], ['source', {
69
+ baseUrl: 'https://another.example.test'
70
+ }], ['headers', {
71
+ headers: {
72
+ 'x-test-scope': 'second'
73
+ }
74
+ }]])('isolates concurrent and warm values by %s', /*#__PURE__*/function () {
75
+ var _ref3 = _asyncToGenerator(function* (_label, change) {
76
+ var fetchMock = jest.fn(/*#__PURE__*/function () {
77
+ var _ref4 = _asyncToGenerator(function* (url, init) {
78
+ return response(JSON.stringify([url, init === null || init === void 0 ? void 0 : init.headers]));
79
+ });
80
+ return function (_x3, _x4) {
81
+ return _ref4.apply(this, arguments);
82
+ };
83
+ }());
84
+ globalThis.fetch = fetchMock;
85
+ var caching = cache();
86
+ var a = () => _server.PrezlyAdapter.connect(config, {
87
+ cache: caching
88
+ }).usePrezlyClient().contentDelivery;
89
+ var b = () => _server.PrezlyAdapter.connect(_objectSpread(_objectSpread({}, config), change), {
90
+ cache: caching
91
+ }).usePrezlyClient().contentDelivery;
92
+ var _yield$Promise$all = yield Promise.all([a().newsroom(), b().newsroom()]),
93
+ _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2),
94
+ first = _yield$Promise$all2[0],
95
+ second = _yield$Promise$all2[1];
96
+ expect(first.name).not.toBe(second.name);
97
+ expect(fetchMock).toHaveBeenCalledTimes(2);
98
+ yield tick();
99
+ expect((yield a().newsroom()).name).toBe(first.name);
100
+ yield tick();
101
+ expect((yield b().newsroom()).name).toBe(second.name);
102
+ });
103
+ return function (_x, _x2) {
104
+ return _ref3.apply(this, arguments);
105
+ };
106
+ }());
107
+ it('isolates newsroom, theme, formats, namespace and invalidation version', /*#__PURE__*/_asyncToGenerator(function* () {
108
+ var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
109
+ return response('room');
110
+ }));
111
+ globalThis.fetch = fetchMock;
112
+ var caching = cache();
113
+ var variants = [[config, caching], [_objectSpread(_objectSpread({}, config), {}, {
114
+ newsroom: 'another'
115
+ }), caching], [_objectSpread(_objectSpread({}, config), {}, {
116
+ theme: 'theme'
117
+ }), caching], [_objectSpread(_objectSpread({}, config), {}, {
118
+ formats: [_sdk.Story.FormatVersion.SLATEJS_V6]
119
+ }), caching], [config, _objectSpread(_objectSpread({}, caching), {}, {
120
+ namespace: "".concat(caching.namespace, "-other")
121
+ })], [config, _objectSpread(_objectSpread({}, caching), {}, {
122
+ latestVersion: 2
123
+ })]];
124
+ yield Promise.all(variants.map(_ref7 => {
125
+ var _ref8 = _slicedToArray(_ref7, 2),
126
+ cfg = _ref8[0],
127
+ storage = _ref8[1];
128
+ return _server.PrezlyAdapter.connect(cfg, {
129
+ cache: storage
130
+ }).usePrezlyClient().contentDelivery.newsroom();
131
+ }));
132
+ expect(fetchMock).toHaveBeenCalledTimes(6);
133
+ yield tick();
134
+ yield _server.PrezlyAdapter.connect(config, {
135
+ cache: _objectSpread(_objectSpread({}, caching), {}, {
136
+ latestVersion: 3
137
+ })
138
+ }).usePrezlyClient().contentDelivery.newsroom();
139
+ expect(fetchMock).toHaveBeenCalledTimes(7);
140
+ }));
141
+ it('requires explicit scope to share custom fetch across adapter instances', /*#__PURE__*/_asyncToGenerator(function* () {
142
+ var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
143
+ return response('room');
144
+ }));
145
+ var create = caching => _server.PrezlyAdapter.connect(config, {
146
+ cache: caching,
147
+ fetch: fetchMock
148
+ }).usePrezlyClient().contentDelivery;
149
+ var unscoped = cache();
150
+ yield Promise.all([create(unscoped).newsroom(), create(unscoped).newsroom()]);
151
+ expect(fetchMock).toHaveBeenCalledTimes(2);
152
+ var scoped = _objectSpread(_objectSpread({}, cache()), {}, {
153
+ requestScope: 'immutable-custom-transport'
154
+ });
155
+ yield Promise.all([create(scoped).newsroom(), create(scoped).newsroom()]);
156
+ expect(fetchMock).toHaveBeenCalledTimes(3);
157
+ }));
158
+ it('does not buffer or change calls made using the raw SDK client', /*#__PURE__*/_asyncToGenerator(function* () {
159
+ var result = response('raw');
160
+ var read = jest.spyOn(result, 'arrayBuffer');
161
+ var fetchMock = jest.fn(/*#__PURE__*/function () {
162
+ var _ref10 = _asyncToGenerator(function* (_input, _init) {
163
+ return result;
164
+ });
165
+ return function (_x5, _x6) {
166
+ return _ref10.apply(this, arguments);
167
+ };
168
+ }());
169
+ var _PrezlyAdapter$connec = _server.PrezlyAdapter.connect(config, {
170
+ cache: cache(),
171
+ fetch: fetchMock
172
+ }).usePrezlyClient(),
173
+ client = _PrezlyAdapter$connec.client;
174
+ expect((yield client.newsrooms.get('room')).name).toBe('raw');
175
+ expect(read).not.toHaveBeenCalled();
176
+ expect(fetchMock.mock.calls[0][1]).not.toHaveProperty('signal');
177
+ }));
178
+ it('recovers from an actual SDK error without poisoning the shared key', /*#__PURE__*/_asyncToGenerator(function* () {
179
+ var fetchMock = jest.fn(/*#__PURE__*/_asyncToGenerator(function* () {
180
+ return response('recovered');
181
+ }));
182
+ fetchMock.mockRejectedValueOnce(new Error('offline'));
183
+ globalThis.fetch = fetchMock;
184
+ var caching = cache();
185
+ var client = () => _server.PrezlyAdapter.connect(config, {
186
+ cache: caching
187
+ }).usePrezlyClient().contentDelivery;
188
+ var failed = yield Promise.allSettled(Array.from({
189
+ length: 20
190
+ }, () => client().newsroom()));
191
+ expect(failed.every(value => value.status === 'rejected')).toBe(true);
192
+ expect(fetchMock).toHaveBeenCalledTimes(1);
193
+ expect((yield client().newsroom()).name).toBe('recovered');
194
+ expect(fetchMock).toHaveBeenCalledTimes(2);
195
+ }));
196
+ it('fetches every allStories page through the SDK with only one transport slot', /*#__PURE__*/_asyncToGenerator(function* () {
197
+ var fetchMock = jest.fn(/*#__PURE__*/function () {
198
+ var _ref14 = _asyncToGenerator(function* (url, init) {
199
+ if (String(url).endsWith('/room')) return response('room');
200
+ var _JSON$parse = JSON.parse(init.body),
201
+ offset = _JSON$parse.offset;
202
+ return new Response(JSON.stringify({
203
+ stories: [offset]
204
+ }));
205
+ });
206
+ return function (_x7, _x8) {
207
+ return _ref14.apply(this, arguments);
208
+ };
209
+ }());
210
+ var sdk = (0, _sdk.createPrezlyClient)(_objectSpread(_objectSpread({}, config), {}, {
211
+ fetch: (0, _requests.createBoundedFetch)(fetchMock, new _requests.FetchScheduler({
212
+ concurrency: 1
213
+ }))
214
+ }));
215
+ var caching = {
216
+ storage: _themeKitCore.ContentDelivery.createSharedMemoryCache(),
217
+ scope: "aggregate-".concat(sequence++),
218
+ latestVersion: 1
219
+ };
220
+ var clients = Array.from({
221
+ length: 20
222
+ }, () => _themeKitCore.ContentDelivery.createClient(sdk, 'room', undefined, {
223
+ cache: caching
224
+ }));
225
+ expect(yield Promise.all(clients.map(client => client.allStories()))).toEqual(Array.from({
226
+ length: 20
227
+ }, () => [0, 200, 400]));
228
+ expect(fetchMock).toHaveBeenCalledTimes(4);
229
+ }));
230
+ it('handles a large newsroom without overflowing its own global transport queue', /*#__PURE__*/_asyncToGenerator(function* () {
231
+ var active = 0;
232
+ var peak = 0;
233
+ var fetchMock = jest.fn(/*#__PURE__*/function () {
234
+ var _ref16 = _asyncToGenerator(function* (url, init) {
235
+ if (String(url).endsWith('/room')) {
236
+ return new Response(JSON.stringify({
237
+ newsroom: {
238
+ name: 'large',
239
+ stories_number: 60000
240
+ }
241
+ }));
242
+ }
243
+ active++;
244
+ peak = Math.max(active, peak);
245
+ yield tick();
246
+ active--;
247
+ var _JSON$parse2 = JSON.parse(init.body),
248
+ offset = _JSON$parse2.offset;
249
+ return new Response(JSON.stringify({
250
+ stories: [offset]
251
+ }));
252
+ });
253
+ return function (_x9, _x0) {
254
+ return _ref16.apply(this, arguments);
255
+ };
256
+ }());
257
+ globalThis.fetch = fetchMock;
258
+ var caching = cache();
259
+ var request = () => _server.PrezlyAdapter.connect(config, {
260
+ cache: caching
261
+ }).usePrezlyClient().contentDelivery.allStories();
262
+ var expected = Array.from({
263
+ length: 300
264
+ }, (_, index) => index * 200);
265
+ expect(yield Promise.all(Array.from({
266
+ length: 20
267
+ }, request))).toEqual(Array.from({
268
+ length: 20
269
+ }, () => expected));
270
+ expect(fetchMock).toHaveBeenCalledTimes(301);
271
+ expect(peak).toBeLessThanOrEqual(8);
272
+ }));
273
+ it('stops producing later story batches on failure and can retry the aggregate', /*#__PURE__*/_asyncToGenerator(function* () {
274
+ var fail = true;
275
+ var fetchMock = jest.fn(/*#__PURE__*/function () {
276
+ var _ref18 = _asyncToGenerator(function* (url, init) {
277
+ if (String(url).endsWith('/room')) {
278
+ return new Response(JSON.stringify({
279
+ newsroom: {
280
+ stories_number: 60000
281
+ }
282
+ }));
283
+ }
284
+ var _JSON$parse3 = JSON.parse(init.body),
285
+ offset = _JSON$parse3.offset;
286
+ if (offset === 0 && fail) throw new Error('page unavailable');
287
+ return new Response(JSON.stringify({
288
+ stories: [offset]
289
+ }));
290
+ });
291
+ return function (_x1, _x10) {
292
+ return _ref18.apply(this, arguments);
293
+ };
294
+ }());
295
+ globalThis.fetch = fetchMock;
296
+ var adapter = _server.PrezlyAdapter.connect(config, {
297
+ cache: cache()
298
+ });
299
+ yield expect(adapter.usePrezlyClient().contentDelivery.allStories()).rejects.toThrow('page unavailable');
300
+ yield tick();
301
+ expect(fetchMock).toHaveBeenCalledTimes(9); // newsroom + the first bounded batch only
302
+ fail = false;
303
+ expect(yield adapter.usePrezlyClient().contentDelivery.allStories()).toHaveLength(300);
304
+ }));