@modern-js/plugin-data-loader 2.6.1-alpha.0 → 2.8.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.
Files changed (48) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +2 -2
  3. package/dist/cjs/cli/{create-request.js → createRequest.js} +17 -6
  4. package/dist/cjs/cli/data.js +162 -0
  5. package/dist/cjs/cli/{generate-client.js → generateClient.js} +4 -4
  6. package/dist/cjs/cli/loader.js +2 -2
  7. package/dist/cjs/common/constants.js +3 -0
  8. package/dist/cjs/runtime/index.js +180 -0
  9. package/dist/cjs/runtime/response.js +102 -0
  10. package/dist/cjs/server/index.js +22 -196
  11. package/dist/esm/cli/{create-request.js → createRequest.js} +42 -3
  12. package/dist/esm/cli/data.js +820 -0
  13. package/dist/esm/cli/{generate-client.js → generateClient.js} +1 -1
  14. package/dist/esm/cli/loader.js +1 -1
  15. package/dist/esm/common/constants.js +2 -1
  16. package/dist/{js/treeshaking/server → esm/runtime}/index.js +84 -220
  17. package/dist/esm/runtime/response.js +284 -0
  18. package/dist/esm/server/index.js +38 -447
  19. package/dist/esm-node/cli/{create-request.js → createRequest.js} +19 -4
  20. package/dist/esm-node/cli/data.js +142 -0
  21. package/dist/esm-node/cli/{generate-client.js → generateClient.js} +1 -1
  22. package/dist/esm-node/cli/loader.js +1 -1
  23. package/dist/esm-node/common/constants.js +2 -0
  24. package/dist/esm-node/runtime/index.js +162 -0
  25. package/dist/esm-node/runtime/response.js +79 -0
  26. package/dist/esm-node/server/index.js +21 -196
  27. package/dist/types/cli/{create-request.d.ts → createRequest.d.ts} +2 -1
  28. package/dist/types/cli/data.d.ts +6 -0
  29. package/dist/types/common/constants.d.ts +2 -1
  30. package/dist/types/runtime/index.d.ts +15 -0
  31. package/dist/types/runtime/response.d.ts +2 -0
  32. package/dist/types/server/index.d.ts +0 -15
  33. package/package.json +22 -12
  34. package/dist/js/modern/cli/create-request.js +0 -66
  35. package/dist/js/modern/cli/generate-client.js +0 -42
  36. package/dist/js/modern/cli/loader.js +0 -40
  37. package/dist/js/modern/common/constants.js +0 -6
  38. package/dist/js/modern/server/index.js +0 -237
  39. package/dist/js/node/cli/create-request.js +0 -90
  40. package/dist/js/node/cli/generate-client.js +0 -71
  41. package/dist/js/node/cli/loader.js +0 -61
  42. package/dist/js/node/common/constants.js +0 -30
  43. package/dist/js/node/server/index.js +0 -261
  44. package/dist/js/treeshaking/cli/create-request.js +0 -186
  45. package/dist/js/treeshaking/cli/generate-client.js +0 -45
  46. package/dist/js/treeshaking/cli/loader.js +0 -154
  47. package/dist/js/treeshaking/common/constants.js +0 -3
  48. /package/dist/types/cli/{generate-client.d.ts → generateClient.d.ts} +0 -0
@@ -5,7 +5,7 @@ var generateClient = function(param) {
5
5
  var loadersMap = require(mapFile);
6
6
  var requestCode = "";
7
7
  var exportsCode = "";
8
- var requestCreatorPath = path.join(__dirname, "./create-request").replace("/cjs/cli/", "/esm/cli/").replace(/\\/g, "/");
8
+ var requestCreatorPath = path.join(__dirname, "./createRequest").replace("/cjs/cli/", "/esm/cli/").replace(/\\/g, "/");
9
9
  var importCode = "\n import { createRequest } from '".concat(requestCreatorPath, "';\n ");
10
10
  if (!loaderId) {
11
11
  requestCode = Object.keys(loadersMap).map(function(loaderId2) {
@@ -122,7 +122,7 @@ var __generator = this && this.__generator || function(thisArg, body) {
122
122
  };
123
123
  }
124
124
  };
125
- import { generateClient } from "./generate-client";
125
+ import { generateClient } from "./generateClient";
126
126
  function loader(source) {
127
127
  return _loader.apply(this, arguments);
128
128
  }
@@ -1,3 +1,4 @@
1
1
  var LOADER_ID_PARAM = "__loader";
2
2
  var DIRECT_PARAM = "__ssrDirect";
3
- export { DIRECT_PARAM, LOADER_ID_PARAM };
3
+ var CONTENT_TYPE_DEFERRED = "text/modernjs-deferred";
4
+ export { CONTENT_TYPE_DEFERRED, DIRECT_PARAM, LOADER_ID_PARAM };
@@ -35,18 +35,12 @@ function _asyncToGenerator(fn) {
35
35
  });
36
36
  };
37
37
  }
38
- function _defineProperty(obj, key, value) {
39
- if (key in obj) {
40
- Object.defineProperty(obj, key, {
41
- value: value,
42
- enumerable: true,
43
- configurable: true,
44
- writable: true
45
- });
38
+ function _instanceof(left, right) {
39
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
40
+ return !!right[Symbol.hasInstance](left);
46
41
  } else {
47
- obj[key] = value;
42
+ return left instanceof right;
48
43
  }
49
- return obj;
50
44
  }
51
45
  function _iterableToArrayLimit(arr, i) {
52
46
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
@@ -75,45 +69,6 @@ function _iterableToArrayLimit(arr, i) {
75
69
  function _nonIterableRest() {
76
70
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
77
71
  }
78
- function _objectSpread(target) {
79
- for(var i = 1; i < arguments.length; i++){
80
- var source = arguments[i] != null ? arguments[i] : {};
81
- var ownKeys = Object.keys(source);
82
- if (typeof Object.getOwnPropertySymbols === "function") {
83
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
84
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
85
- }));
86
- }
87
- ownKeys.forEach(function(key) {
88
- _defineProperty(target, key, source[key]);
89
- });
90
- }
91
- return target;
92
- }
93
- function ownKeys(object, enumerableOnly) {
94
- var keys = Object.keys(object);
95
- if (Object.getOwnPropertySymbols) {
96
- var symbols = Object.getOwnPropertySymbols(object);
97
- if (enumerableOnly) {
98
- symbols = symbols.filter(function(sym) {
99
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
100
- });
101
- }
102
- keys.push.apply(keys, symbols);
103
- }
104
- return keys;
105
- }
106
- function _objectSpreadProps(target, source) {
107
- source = source != null ? source : {};
108
- if (Object.getOwnPropertyDescriptors) {
109
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
110
- } else {
111
- ownKeys(Object(source)).forEach(function(key) {
112
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
113
- });
114
- }
115
- return target;
116
- }
117
72
  function _slicedToArray(arr, i) {
118
73
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
119
74
  }
@@ -220,11 +175,12 @@ var __generator = this && this.__generator || function(thisArg, body) {
220
175
  };
221
176
  }
222
177
  };
223
- import path from "path";
224
178
  import { installGlobals, writeReadableStreamToWritable, Response as NodeResponse } from "@remix-run/node";
225
- import { matchRoutes } from "react-router-dom";
226
- import { MAIN_ENTRY_NAME, SERVER_BUNDLE_DIRECTORY } from "@modern-js/utils";
227
- import { LOADER_ID_PARAM } from "../common/constants";
179
+ import { transformNestedRoutes } from "@modern-js/utils/nestedRoutes";
180
+ import { createStaticHandler, ErrorResponse, UNSAFE_DEFERRED_SYMBOL as DEFERRED_SYMBOL } from "@modern-js/utils/remix-router";
181
+ import { isPlainObject } from "@modern-js/utils/lodash";
182
+ import { CONTENT_TYPE_DEFERRED, LOADER_ID_PARAM } from "../common/constants";
183
+ import { createDeferredReadableStream } from "./response";
228
184
  installGlobals();
229
185
  var redirectStatusCodes = /* @__PURE__ */ new Set([
230
186
  301,
@@ -233,81 +189,39 @@ var redirectStatusCodes = /* @__PURE__ */ new Set([
233
189
  307,
234
190
  308
235
191
  ]);
236
- function isRedirectResponse(response) {
237
- return redirectStatusCodes.has(response.status);
192
+ function isRedirectResponse(status) {
193
+ return redirectStatusCodes.has(status);
238
194
  }
239
195
  function isResponse(value) {
240
196
  return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";
241
197
  }
242
- var json = function(data) {
243
- var init = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
244
- var responseInit = typeof init === "number" ? {
245
- status: init
246
- } : init;
247
- var headers = new Headers(responseInit.headers);
248
- if (!headers.has("Content-Type")) {
249
- headers.set("Content-Type", "application/json; charset=utf-8");
198
+ function sortByUrlPath(entries) {
199
+ entries.sort(function(a, b) {
200
+ var length1 = a.urlPath.length;
201
+ var length2 = b.urlPath.length;
202
+ if (length1 < length2) {
203
+ return 1;
204
+ }
205
+ if (length1 > length2) {
206
+ return -1;
207
+ }
208
+ return 0;
209
+ });
210
+ return entries;
211
+ }
212
+ function convertModernRedirectResponse(headers, basename) {
213
+ var newHeaders = new Headers(headers);
214
+ var redirectUrl = headers.get("Location");
215
+ if (basename !== "/") {
216
+ redirectUrl = redirectUrl.replace(basename, "");
250
217
  }
251
- return new NodeResponse(JSON.stringify(data), _objectSpreadProps(_objectSpread({}, responseInit), {
252
- headers: headers
253
- }));
254
- };
255
- var callRouteLoader = function() {
256
- var _ref = _asyncToGenerator(function(param) {
257
- var routeId, loader, params, request, loadContext, result, error;
258
- return __generator(this, function(_state) {
259
- switch(_state.label){
260
- case 0:
261
- routeId = param.routeId, loader = param.loader, params = param.params, request = param.request, loadContext = param.loadContext;
262
- if (!loader) {
263
- throw new Error("You made a ".concat(request.method, " request to ").concat(request.url, ' but did not provide a default component or `loader` for route "').concat(routeId, '", so there is no way to handle the request.'));
264
- }
265
- _state.label = 1;
266
- case 1:
267
- _state.trys.push([
268
- 1,
269
- 3,
270
- ,
271
- 4
272
- ]);
273
- return [
274
- 4,
275
- loader({
276
- request: request,
277
- params: params
278
- })
279
- ];
280
- case 2:
281
- result = _state.sent();
282
- return [
283
- 3,
284
- 4
285
- ];
286
- case 3:
287
- error = _state.sent();
288
- if (!isResponse(error)) {
289
- throw error;
290
- }
291
- result = error;
292
- return [
293
- 3,
294
- 4
295
- ];
296
- case 4:
297
- if (result === void 0) {
298
- throw new Error('You defined a loader for route "'.concat(routeId, "\" but didn't return anything from your `loader` function. Please return a value or `null`."));
299
- }
300
- return [
301
- 2,
302
- isResponse(result) ? result : json(result)
303
- ];
304
- }
305
- });
218
+ newHeaders.set("X-Modernjs-Redirect", redirectUrl);
219
+ newHeaders.delete("Location");
220
+ return new NodeResponse(null, {
221
+ status: 204,
222
+ headers: newHeaders
306
223
  });
307
- return function callRouteLoader(_) {
308
- return _ref.apply(this, arguments);
309
- };
310
- }();
224
+ }
311
225
  var createLoaderHeaders = function(requestHeaders) {
312
226
  var headers = new Headers();
313
227
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -424,106 +338,85 @@ var sendLoaderResponse = function() {
424
338
  return _ref.apply(this, arguments);
425
339
  };
426
340
  }();
427
- var getPathWithoutEntry = function(pathname, entryPath) {
428
- if (entryPath === "/") {
429
- return pathname;
430
- }
431
- return pathname.replace(entryPath, "");
432
- };
433
341
  var matchEntry = function(pathname, entries) {
342
+ sortByUrlPath(entries);
434
343
  return entries.find(function(entry) {
435
344
  return pathname.startsWith(entry.urlPath);
436
345
  });
437
346
  };
438
347
  var handleRequest = function() {
439
348
  var _ref = _asyncToGenerator(function(param) {
440
- var context, serverRoutes, distDir, method, query, routeId, entry, routesPath, routes, res, pathname, matches, match, request, response, headers, error, message;
349
+ var context, serverRoutes, routes, method, query, routeId, entry, basename, dataRoutes, staticHandler, res, request, response, deferredData, body, init, headers, error, message;
441
350
  return __generator(this, function(_state) {
442
351
  switch(_state.label){
443
352
  case 0:
444
- context = param.context, serverRoutes = param.serverRoutes, distDir = param.distDir;
353
+ context = param.context, serverRoutes = param.serverRoutes, routes = param.routes;
445
354
  method = context.method, query = context.query;
446
355
  routeId = query[LOADER_ID_PARAM];
447
- if (!routeId || method.toLowerCase() !== "get") {
448
- return [
449
- 2
450
- ];
451
- }
452
356
  entry = matchEntry(context.path, serverRoutes);
453
- if (!entry) {
454
- return [
455
- 2
456
- ];
457
- }
458
- routesPath = path.join(distDir, SERVER_BUNDLE_DIRECTORY, "".concat(entry.entryName || MAIN_ENTRY_NAME, "-server-loaders"));
459
- return [
460
- 4,
461
- import(routesPath)
462
- ];
463
- case 1:
464
- routes = _state.sent().routes;
465
- if (!routes) {
357
+ if (!routeId || !entry) {
466
358
  return [
467
359
  2
468
360
  ];
469
361
  }
470
- res = context.res;
471
- pathname = getPathWithoutEntry(context.path, entry.urlPath);
472
- matches = matchRoutes(routes, pathname);
473
- if (!matches) {
474
- res.statusCode = 403;
475
- res.end("Route ".concat(pathname, " was not matched"));
476
- return [
477
- 2
478
- ];
362
+ if (method.toLowerCase() !== "get") {
363
+ throw new Error("CSR data loader request only support http GET method");
479
364
  }
480
- match = matches === null || matches === void 0 ? void 0 : matches.find(function(match2) {
481
- return match2.route.id === routeId;
365
+ basename = entry.urlPath;
366
+ dataRoutes = transformNestedRoutes(routes);
367
+ staticHandler = createStaticHandler(dataRoutes, {
368
+ basename: basename
482
369
  });
483
- if (!match) {
484
- res.statusCode = 403;
485
- res.end("Route ".concat(routeId, " does not match URL ").concat(context.path));
486
- return [
487
- 2
488
- ];
489
- }
370
+ res = context.res;
490
371
  request = createLoaderRequest(context);
491
- _state.label = 2;
492
- case 2:
372
+ _state.label = 1;
373
+ case 1:
493
374
  _state.trys.push([
494
- 2,
495
- 4,
375
+ 1,
376
+ 3,
496
377
  ,
497
- 5
378
+ 4
498
379
  ]);
499
380
  return [
500
381
  4,
501
- callRouteLoader({
502
- loader: match.route.loader,
503
- routeId: match.route.id,
504
- params: match.params,
505
- request: request,
506
- loadContext: {}
382
+ staticHandler.queryRoute(request, {
383
+ routeId: routeId,
384
+ requestContext: context
507
385
  })
508
386
  ];
509
- case 3:
387
+ case 2:
510
388
  response = _state.sent();
511
- if (isRedirectResponse(response)) {
512
- headers = new Headers(response.headers);
513
- headers.set("X-Modernjs-Redirect", headers.get("Location"));
514
- headers.delete("Location");
515
- response = new NodeResponse(null, {
516
- status: 204,
517
- headers: headers
389
+ if (isResponse(response) && isRedirectResponse(response.status)) {
390
+ response = convertModernRedirectResponse(response.headers, basename);
391
+ } else if (isPlainObject(response) && DEFERRED_SYMBOL in response) {
392
+ deferredData = response[DEFERRED_SYMBOL];
393
+ body = createDeferredReadableStream(deferredData, request.signal);
394
+ init = deferredData.init || {};
395
+ if (init.status && isRedirectResponse(init.status)) {
396
+ if (!init.headers) {
397
+ throw new Error("redirect response includes no headers");
398
+ }
399
+ response = convertModernRedirectResponse(new Headers(init.headers), basename);
400
+ } else {
401
+ headers = new Headers(init.headers);
402
+ headers.set("Content-Type", CONTENT_TYPE_DEFERRED);
403
+ init.headers = headers;
404
+ response = new NodeResponse(body, init);
405
+ }
406
+ } else {
407
+ response = isResponse(response) ? response : new NodeResponse(JSON.stringify(response), {
408
+ headers: {
409
+ "Content-Type": "application/json; charset=utf-8"
410
+ }
518
411
  });
519
412
  }
520
413
  return [
521
414
  3,
522
- 5
415
+ 4
523
416
  ];
524
- case 4:
417
+ case 3:
525
418
  error = _state.sent();
526
- message = String(error);
419
+ message = _instanceof(error, ErrorResponse) ? error.data : String(error);
527
420
  response = new NodeResponse(message, {
528
421
  status: 500,
529
422
  headers: {
@@ -532,9 +425,9 @@ var handleRequest = function() {
532
425
  });
533
426
  return [
534
427
  3,
535
- 5
428
+ 4
536
429
  ];
537
- case 5:
430
+ case 4:
538
431
  sendLoaderResponse(res, response);
539
432
  return [
540
433
  2
@@ -546,33 +439,4 @@ var handleRequest = function() {
546
439
  return _ref.apply(this, arguments);
547
440
  };
548
441
  }();
549
- var server_default = function() {
550
- return {
551
- name: "@modern-js/plugin-data-loader",
552
- setup: function() {
553
- return {
554
- preparebeforeRouteHandler: function preparebeforeRouteHandler(param) {
555
- var serverRoutes = param.serverRoutes, distDir = param.distDir;
556
- return function() {
557
- var _ref = _asyncToGenerator(function(context) {
558
- return __generator(this, function(_state) {
559
- return [
560
- 2,
561
- handleRequest({
562
- serverRoutes: serverRoutes,
563
- distDir: distDir,
564
- context: context
565
- })
566
- ];
567
- });
568
- });
569
- return function(context) {
570
- return _ref.apply(this, arguments);
571
- };
572
- }();
573
- }
574
- };
575
- }
576
- };
577
- };
578
- export { server_default as default, getPathWithoutEntry, handleRequest, isRedirectResponse, isResponse };
442
+ export { handleRequest, isRedirectResponse, isResponse, matchEntry };