@modern-js/plugin-data-loader 2.4.0 → 2.5.0-alpha.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 (33) hide show
  1. package/dist/{js/node → cjs}/cli/create-request.js +17 -26
  2. package/dist/cjs/cli/data.js +162 -0
  3. package/dist/{js/node → cjs}/cli/generate-client.js +1 -1
  4. package/dist/{js/node → cjs}/cli/loader.js +12 -34
  5. package/dist/{js/node → cjs}/common/constants.js +0 -0
  6. package/dist/cjs/runtime/index.js +159 -0
  7. package/dist/cjs/runtime/response.js +102 -0
  8. package/dist/cjs/server/index.js +64 -0
  9. package/dist/{js/treeshaking → esm}/cli/create-request.js +41 -2
  10. package/dist/esm/cli/data.js +820 -0
  11. package/dist/{js/treeshaking → esm}/cli/generate-client.js +1 -1
  12. package/dist/{js/treeshaking → esm}/cli/loader.js +2 -2
  13. package/dist/{js/treeshaking → esm}/common/constants.js +0 -0
  14. package/dist/{js/treeshaking/server → esm/runtime}/index.js +69 -225
  15. package/dist/esm/runtime/response.js +284 -0
  16. package/dist/esm/server/index.js +176 -0
  17. package/dist/{js/modern → esm-node}/cli/create-request.js +17 -26
  18. package/dist/esm-node/cli/data.js +142 -0
  19. package/dist/{js/modern → esm-node}/cli/generate-client.js +1 -1
  20. package/dist/esm-node/cli/loader.js +18 -0
  21. package/dist/{js/modern → esm-node}/common/constants.js +0 -0
  22. package/dist/esm-node/runtime/index.js +143 -0
  23. package/dist/esm-node/runtime/response.js +79 -0
  24. package/dist/esm-node/server/index.js +40 -0
  25. package/dist/types/cli/create-request.d.ts +2 -1
  26. package/dist/types/cli/data.d.ts +6 -0
  27. package/dist/types/runtime/index.d.ts +15 -0
  28. package/dist/types/runtime/response.d.ts +2 -0
  29. package/dist/types/server/index.d.ts +0 -15
  30. package/package.json +24 -14
  31. package/dist/js/modern/cli/loader.js +0 -40
  32. package/dist/js/modern/server/index.js +0 -237
  33. package/dist/js/node/server/index.js +0 -261
@@ -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("/node/cli/", "/treeshaking/cli/").replace(/\\/g, "/");
8
+ var requestCreatorPath = path.join(__dirname, "./create-request").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) {
@@ -128,10 +128,10 @@ function loader(source) {
128
128
  }
129
129
  function _loader() {
130
130
  _loader = _asyncToGenerator(function(source) {
131
- var ref, target, options, code;
131
+ var _this__compiler, target, options, code;
132
132
  return __generator(this, function(_state) {
133
133
  this.cacheable();
134
- target = (ref = this._compiler) === null || ref === void 0 ? void 0 : ref.options.target;
134
+ target = (_this__compiler = this._compiler) === null || _this__compiler === void 0 ? void 0 : _this__compiler.options.target;
135
135
  if (target === "node") {
136
136
  return [
137
137
  2,
File without changes
@@ -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,11 @@ 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";
179
+ import { transformNestedRoutes } from "@modern-js/utils";
180
+ import { createStaticHandler, ErrorResponse, UNSAFE_DEFERRED_SYMBOL as DEFERRED_SYMBOL } from "@modern-js/utils/remix-router";
227
181
  import { LOADER_ID_PARAM } from "../common/constants";
182
+ import { createDeferredReadableStream } from "./response";
228
183
  installGlobals();
229
184
  var redirectStatusCodes = /* @__PURE__ */ new Set([
230
185
  301,
@@ -233,87 +188,27 @@ var redirectStatusCodes = /* @__PURE__ */ new Set([
233
188
  307,
234
189
  308
235
190
  ]);
236
- function isRedirectResponse(response) {
237
- return redirectStatusCodes.has(response.status);
191
+ function isRedirectResponse(status) {
192
+ return redirectStatusCodes.has(status);
238
193
  }
239
194
  function isResponse(value) {
240
195
  return value != null && typeof value.status === "number" && typeof value.statusText === "string" && typeof value.headers === "object" && typeof value.body !== "undefined";
241
196
  }
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");
250
- }
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
- });
197
+ function convertModernRedirectResponse(headers) {
198
+ var newHeaders = new Headers(headers);
199
+ newHeaders.set("X-Modernjs-Redirect", headers.get("Location"));
200
+ newHeaders.delete("Location");
201
+ return new NodeResponse(null, {
202
+ status: 204,
203
+ headers: newHeaders
306
204
  });
307
- return function callRouteLoader(_) {
308
- return _ref.apply(this, arguments);
309
- };
310
- }();
205
+ }
311
206
  var createLoaderHeaders = function(requestHeaders) {
312
207
  var headers = new Headers();
313
208
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
314
209
  try {
315
210
  for(var _iterator = Object.entries(requestHeaders)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
316
- var _value = _slicedToArray(_step.value, 2), key = _value[0], values = _value[1];
211
+ var _step_value = _slicedToArray(_step.value, 2), key = _step_value[0], values = _step_value[1];
317
212
  if (values) {
318
213
  if (Array.isArray(values)) {
319
214
  var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
@@ -370,7 +265,7 @@ var createLoaderRequest = function(context) {
370
265
  };
371
266
  var sendLoaderResponse = function() {
372
267
  var _ref = _asyncToGenerator(function(res, nodeResponse) {
373
- var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _value, key, value;
268
+ var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, key, value;
374
269
  return __generator(this, function(_state) {
375
270
  switch(_state.label){
376
271
  case 0:
@@ -379,7 +274,7 @@ var sendLoaderResponse = function() {
379
274
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
380
275
  try {
381
276
  for(_iterator = nodeResponse.headers.entries()[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
382
- _value = _slicedToArray(_step.value, 2), key = _value[0], value = _value[1];
277
+ _step_value = _slicedToArray(_step.value, 2), key = _step_value[0], value = _step_value[1];
383
278
  res.setHeader(key, value);
384
279
  }
385
280
  } catch (err) {
@@ -424,12 +319,6 @@ var sendLoaderResponse = function() {
424
319
  return _ref.apply(this, arguments);
425
320
  };
426
321
  }();
427
- var getPathWithoutEntry = function(pathname, entryPath) {
428
- if (entryPath === "/") {
429
- return pathname;
430
- }
431
- return pathname.replace(entryPath, "");
432
- };
433
322
  var matchEntry = function(pathname, entries) {
434
323
  return entries.find(function(entry) {
435
324
  return pathname.startsWith(entry.urlPath);
@@ -437,93 +326,77 @@ var matchEntry = function(pathname, entries) {
437
326
  };
438
327
  var handleRequest = function() {
439
328
  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;
329
+ var context, serverRoutes, routes, method, query, routeId, entry, dataRoutes, staticHandler, res, request, response, deferredData, body, init, headers, error, message;
441
330
  return __generator(this, function(_state) {
442
331
  switch(_state.label){
443
332
  case 0:
444
- context = param.context, serverRoutes = param.serverRoutes, distDir = param.distDir;
333
+ context = param.context, serverRoutes = param.serverRoutes, routes = param.routes;
445
334
  method = context.method, query = context.query;
446
335
  routeId = query[LOADER_ID_PARAM];
447
- if (!routeId || method.toLowerCase() !== "get") {
448
- return [
449
- 2
450
- ];
336
+ if (!routeId) {
337
+ throw new Error("Missing parameter: ".concat(LOADER_ID_PARAM));
338
+ }
339
+ if (method.toLowerCase() !== "get") {
340
+ throw new Error("Only support httpp GET method");
451
341
  }
452
342
  entry = matchEntry(context.path, serverRoutes);
453
343
  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) {
466
- return [
467
- 2
468
- ];
344
+ throw new Error("Route is not matched");
469
345
  }
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
- ];
479
- }
480
- match = matches === null || matches === void 0 ? void 0 : matches.find(function(match2) {
481
- return match2.route.id === routeId;
346
+ dataRoutes = transformNestedRoutes(routes);
347
+ staticHandler = createStaticHandler(dataRoutes, {
348
+ basename: entry.urlPath
482
349
  });
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
- }
350
+ res = context.res;
490
351
  request = createLoaderRequest(context);
491
- _state.label = 2;
492
- case 2:
352
+ _state.label = 1;
353
+ case 1:
493
354
  _state.trys.push([
494
- 2,
495
- 4,
355
+ 1,
356
+ 3,
496
357
  ,
497
- 5
358
+ 4
498
359
  ]);
499
360
  return [
500
361
  4,
501
- callRouteLoader({
502
- loader: match.route.loader,
503
- routeId: match.route.id,
504
- params: match.params,
505
- request: request,
506
- loadContext: {}
362
+ staticHandler.queryRoute(request, {
363
+ routeId: routeId,
364
+ requestContext: context
507
365
  })
508
366
  ];
509
- case 3:
367
+ case 2:
510
368
  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
369
+ if (isResponse(response) && isRedirectResponse(response.status)) {
370
+ response = convertModernRedirectResponse(response.headers);
371
+ } else if (DEFERRED_SYMBOL in response) {
372
+ deferredData = response[DEFERRED_SYMBOL];
373
+ body = createDeferredReadableStream(deferredData, request.signal);
374
+ init = deferredData.init || {};
375
+ if (init.status && isRedirectResponse(init.status)) {
376
+ if (!init.headers) {
377
+ throw new Error("redirect response includes no headers");
378
+ }
379
+ response = convertModernRedirectResponse(new Headers(init.headers));
380
+ } else {
381
+ headers = new Headers(init.headers);
382
+ headers.set("Content-Type", "text/modernjs-deferred");
383
+ init.headers = headers;
384
+ response = new NodeResponse(body, init);
385
+ }
386
+ } else {
387
+ response = isResponse(response) ? response : new NodeResponse(JSON.stringify(response), {
388
+ headers: {
389
+ "Content-Type": "application/json; charset=utf-8"
390
+ }
518
391
  });
519
392
  }
520
393
  return [
521
394
  3,
522
- 5
395
+ 4
523
396
  ];
524
- case 4:
397
+ case 3:
525
398
  error = _state.sent();
526
- message = String(error);
399
+ message = _instanceof(error, ErrorResponse) ? error.data : String(error);
527
400
  response = new NodeResponse(message, {
528
401
  status: 500,
529
402
  headers: {
@@ -532,9 +405,9 @@ var handleRequest = function() {
532
405
  });
533
406
  return [
534
407
  3,
535
- 5
408
+ 4
536
409
  ];
537
- case 5:
410
+ case 4:
538
411
  sendLoaderResponse(res, response);
539
412
  return [
540
413
  2
@@ -546,33 +419,4 @@ var handleRequest = function() {
546
419
  return _ref.apply(this, arguments);
547
420
  };
548
421
  }();
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 };
422
+ export { handleRequest, isRedirectResponse, isResponse, matchEntry };