@modern-js/runtime-utils 2.69.4 → 3.0.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 (135) hide show
  1. package/dist/cjs/browser/deferreds.js +141 -145
  2. package/dist/cjs/browser/index.js +62 -21
  3. package/dist/cjs/browser/nestedRoutes.js +121 -147
  4. package/dist/cjs/merge.js +51 -44
  5. package/dist/cjs/node/fileReader.js +88 -97
  6. package/dist/cjs/node/index.js +87 -33
  7. package/dist/cjs/node/loaderContext/createLoaderCtx.js +43 -36
  8. package/dist/cjs/node/loaderContext/createRequestCtx.js +43 -41
  9. package/dist/cjs/node/loaderContext/index.js +38 -29
  10. package/dist/cjs/node/serialize.js +46 -40
  11. package/dist/cjs/node/storer/container.js +62 -58
  12. package/dist/cjs/node/storer/index.js +39 -31
  13. package/dist/cjs/node/storer/storage.js +82 -92
  14. package/dist/cjs/node/stream.js +89 -91
  15. package/dist/cjs/parsed.js +40 -38
  16. package/dist/cjs/router.js +88 -19
  17. package/dist/cjs/rsc.js +58 -0
  18. package/dist/cjs/server/index.js +55 -19
  19. package/dist/cjs/server/nestedRoutes.js +43 -39
  20. package/dist/cjs/time.js +53 -47
  21. package/dist/cjs/universal/async_storage.js +53 -37
  22. package/dist/cjs/universal/async_storage.server.js +63 -74
  23. package/dist/cjs/universal/cache.js +330 -381
  24. package/dist/cjs/universal/request.js +73 -65
  25. package/dist/cjs/url.js +33 -28
  26. package/dist/esm/browser/deferreds.mjs +118 -0
  27. package/dist/esm/browser/nestedRoutes.mjs +104 -0
  28. package/dist/esm/merge.mjs +26 -0
  29. package/dist/esm/node/fileReader.mjs +47 -0
  30. package/dist/{esm-node/node/index.js → esm/node/index.mjs} +2 -5
  31. package/dist/esm/node/loaderContext/createLoaderCtx.mjs +14 -0
  32. package/dist/esm/node/loaderContext/createRequestCtx.mjs +16 -0
  33. package/dist/{esm-node/node/loaderContext/index.js → esm/node/loaderContext/index.mjs} +1 -4
  34. package/dist/esm/node/serialize.mjs +5 -0
  35. package/dist/esm/node/storer/container.mjs +38 -0
  36. package/dist/{esm-node/node/storer/index.js → esm/node/storer/index.mjs} +2 -6
  37. package/dist/esm/node/storer/storage.mjs +53 -0
  38. package/dist/esm/node/stream.mjs +68 -0
  39. package/dist/esm/parsed.mjs +12 -0
  40. package/dist/esm/router.mjs +18 -0
  41. package/dist/esm/rsc.mjs +1 -0
  42. package/dist/esm/server/nestedRoutes.mjs +15 -0
  43. package/dist/esm/time.mjs +27 -0
  44. package/dist/esm/universal/async_storage.mjs +7 -0
  45. package/dist/esm/universal/async_storage.server.mjs +32 -0
  46. package/dist/esm/universal/cache.mjs +326 -0
  47. package/dist/esm/universal/request.mjs +40 -0
  48. package/dist/esm/url.mjs +5 -0
  49. package/dist/esm-node/browser/deferreds.mjs +118 -0
  50. package/dist/esm-node/browser/index.mjs +2 -0
  51. package/dist/esm-node/browser/nestedRoutes.mjs +104 -0
  52. package/dist/esm-node/merge.mjs +26 -0
  53. package/dist/esm-node/node/fileReader.mjs +47 -0
  54. package/dist/esm-node/node/index.mjs +5 -0
  55. package/dist/esm-node/node/loaderContext/createLoaderCtx.mjs +14 -0
  56. package/dist/esm-node/node/loaderContext/createRequestCtx.mjs +16 -0
  57. package/dist/esm-node/node/loaderContext/index.mjs +4 -0
  58. package/dist/esm-node/node/serialize.mjs +5 -0
  59. package/dist/esm-node/node/storer/container.mjs +38 -0
  60. package/dist/esm-node/node/storer/index.mjs +7 -0
  61. package/dist/esm-node/node/storer/storage.mjs +53 -0
  62. package/dist/esm-node/node/stream.mjs +68 -0
  63. package/dist/esm-node/parsed.mjs +12 -0
  64. package/dist/esm-node/router.mjs +18 -0
  65. package/dist/esm-node/rsc.mjs +1 -0
  66. package/dist/esm-node/server/index.mjs +1 -0
  67. package/dist/esm-node/server/nestedRoutes.mjs +15 -0
  68. package/dist/esm-node/time.mjs +27 -0
  69. package/dist/esm-node/universal/async_storage.mjs +24 -0
  70. package/dist/esm-node/universal/async_storage.server.mjs +32 -0
  71. package/dist/esm-node/universal/cache.mjs +326 -0
  72. package/dist/esm-node/universal/request.mjs +40 -0
  73. package/dist/esm-node/url.mjs +5 -0
  74. package/dist/types/browser/nestedRoutes.d.ts +2 -1
  75. package/dist/types/node/stream.d.ts +1 -1
  76. package/dist/types/router.d.ts +6 -1
  77. package/dist/types/rsc.d.ts +1 -0
  78. package/dist/types/universal/async_storage.d.ts +1 -1
  79. package/dist/types/universal/async_storage.server.d.ts +1 -1
  80. package/package.json +36 -46
  81. package/rslib.config.mts +27 -0
  82. package/rstest.config.ts +26 -0
  83. package/dist/cjs/node/router.js +0 -22
  84. package/dist/cjs/remixRouter.js +0 -43
  85. package/dist/esm/browser/deferreds.js +0 -227
  86. package/dist/esm/browser/index.js +0 -2
  87. package/dist/esm/browser/nestedRoutes.js +0 -177
  88. package/dist/esm/merge.js +0 -33
  89. package/dist/esm/node/fileReader.js +0 -140
  90. package/dist/esm/node/index.js +0 -8
  91. package/dist/esm/node/loaderContext/createLoaderCtx.js +0 -24
  92. package/dist/esm/node/loaderContext/createRequestCtx.js +0 -24
  93. package/dist/esm/node/loaderContext/index.js +0 -7
  94. package/dist/esm/node/router.js +0 -1
  95. package/dist/esm/node/serialize.js +0 -9
  96. package/dist/esm/node/storer/container.js +0 -94
  97. package/dist/esm/node/storer/index.js +0 -11
  98. package/dist/esm/node/storer/storage.js +0 -135
  99. package/dist/esm/node/stream.js +0 -87
  100. package/dist/esm/parsed.js +0 -20
  101. package/dist/esm/remixRouter.js +0 -7
  102. package/dist/esm/router.js +0 -1
  103. package/dist/esm/server/index.js +0 -1
  104. package/dist/esm/server/nestedRoutes.js +0 -23
  105. package/dist/esm/time.js +0 -32
  106. package/dist/esm/universal/async_storage.js +0 -18
  107. package/dist/esm/universal/async_storage.server.js +0 -43
  108. package/dist/esm/universal/cache.js +0 -1032
  109. package/dist/esm/universal/request.js +0 -51
  110. package/dist/esm/url.js +0 -10
  111. package/dist/esm-node/browser/deferreds.js +0 -138
  112. package/dist/esm-node/browser/nestedRoutes.js +0 -142
  113. package/dist/esm-node/merge.js +0 -29
  114. package/dist/esm-node/node/fileReader.js +0 -68
  115. package/dist/esm-node/node/loaderContext/createLoaderCtx.js +0 -19
  116. package/dist/esm-node/node/loaderContext/createRequestCtx.js +0 -24
  117. package/dist/esm-node/node/router.js +0 -1
  118. package/dist/esm-node/node/serialize.js +0 -9
  119. package/dist/esm-node/node/storer/container.js +0 -44
  120. package/dist/esm-node/node/storer/storage.js +0 -73
  121. package/dist/esm-node/node/stream.js +0 -80
  122. package/dist/esm-node/parsed.js +0 -20
  123. package/dist/esm-node/remixRouter.js +0 -7
  124. package/dist/esm-node/router.js +0 -1
  125. package/dist/esm-node/server/nestedRoutes.js +0 -21
  126. package/dist/esm-node/time.js +0 -31
  127. package/dist/esm-node/universal/async_storage.js +0 -18
  128. package/dist/esm-node/universal/async_storage.server.js +0 -45
  129. package/dist/esm-node/universal/cache.js +0 -401
  130. package/dist/esm-node/universal/request.js +0 -50
  131. package/dist/esm-node/url.js +0 -10
  132. package/dist/types/node/router.d.ts +0 -1
  133. package/dist/types/remixRouter.d.ts +0 -2
  134. /package/dist/{esm-node/browser/index.js → esm/browser/index.mjs} +0 -0
  135. /package/dist/{esm-node/server/index.js → esm/server/index.mjs} +0 -0
@@ -1,78 +1,86 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var request_exports = {};
20
- __export(request_exports, {
21
- getHost: () => getHost,
22
- getPathname: () => getPathname,
23
- parseCookie: () => parseCookie,
24
- parseHeaders: () => parseHeaders,
25
- parseQuery: () => parseQuery
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ getHost: ()=>getHost,
28
+ getPathname: ()=>getPathname,
29
+ parseCookie: ()=>parseCookie,
30
+ parseHeaders: ()=>parseHeaders,
31
+ parseQuery: ()=>parseQuery
26
32
  });
27
- module.exports = __toCommonJS(request_exports);
28
33
  function parseQuery(req) {
29
- const query = {};
30
- const { url } = req;
31
- const q = url.split("?")[1];
32
- if (q) {
33
- const search = new URLSearchParams(q);
34
- search.forEach((v, k) => {
35
- query[k] = v;
36
- });
37
- }
38
- return query;
34
+ const query = {};
35
+ const { url } = req;
36
+ const q = url.split('?')[1];
37
+ if (q) {
38
+ const search = new URLSearchParams(q);
39
+ search.forEach((v, k)=>{
40
+ query[k] = v;
41
+ });
42
+ }
43
+ return query;
39
44
  }
40
45
  function parseHeaders(request) {
41
- const headersData = {};
42
- request.headers.forEach((value, key) => {
43
- headersData[key] = value;
44
- });
45
- return headersData;
46
+ const headersData = {};
47
+ request.headers.forEach((value, key)=>{
48
+ headersData[key] = value;
49
+ });
50
+ return headersData;
46
51
  }
47
52
  function getPathname(request) {
48
- const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/);
49
- return match ? match[1] : "/";
53
+ const match = request.url.match(/^https?:\/\/[^/]+(\/[^?]*)/);
54
+ return match ? match[1] : '/';
50
55
  }
51
56
  function getHost(request) {
52
- const { headers } = request;
53
- let host = headers.get("X-Forwarded-Host");
54
- if (!host) {
55
- host = headers.get("Host");
56
- }
57
- host = (host === null || host === void 0 ? void 0 : host.split(/\s*,\s*/, 1)[0]) || "undefined";
58
- return host;
57
+ const { headers } = request;
58
+ let host = headers.get('X-Forwarded-Host');
59
+ if (!host) host = headers.get('Host');
60
+ host = host?.split(/\s*,\s*/, 1)[0] || 'undefined';
61
+ return host;
59
62
  }
60
63
  function parseCookie(req) {
61
- const _cookie = req.headers.get("Cookie");
62
- const cookie = {};
63
- _cookie === null || _cookie === void 0 ? void 0 : _cookie.trim().split(";").forEach((item) => {
64
- const [k, v] = item.trim().split("=");
65
- if (k) {
66
- cookie[k] = v;
67
- }
68
- });
69
- return cookie;
64
+ const _cookie = req.headers.get('Cookie');
65
+ const cookie = {};
66
+ _cookie?.trim().split(';').forEach((item)=>{
67
+ const [k, v] = item.trim().split('=');
68
+ if (k) cookie[k] = v;
69
+ });
70
+ return cookie;
70
71
  }
71
- // Annotate the CommonJS export names for ESM import in node:
72
- 0 && (module.exports = {
73
- getHost,
74
- getPathname,
75
- parseCookie,
76
- parseHeaders,
77
- parseQuery
72
+ exports.getHost = __webpack_exports__.getHost;
73
+ exports.getPathname = __webpack_exports__.getPathname;
74
+ exports.parseCookie = __webpack_exports__.parseCookie;
75
+ exports.parseHeaders = __webpack_exports__.parseHeaders;
76
+ exports.parseQuery = __webpack_exports__.parseQuery;
77
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
78
+ "getHost",
79
+ "getPathname",
80
+ "parseCookie",
81
+ "parseHeaders",
82
+ "parseQuery"
83
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
84
+ Object.defineProperty(exports, '__esModule', {
85
+ value: true
78
86
  });
package/dist/cjs/url.js CHANGED
@@ -1,34 +1,39 @@
1
1
  "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var url_exports = {};
20
- __export(url_exports, {
21
- normalizePathname: () => normalizePathname
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ normalizePathname: ()=>normalizePathname
22
28
  });
23
- module.exports = __toCommonJS(url_exports);
24
29
  function normalizePathname(pathname) {
25
- const normalized = "/" + pathname.replace(/^\/+|\/+$/g, "");
26
- if (normalized === "/") {
30
+ const normalized = '/' + pathname.replace(/^\/+|\/+$/g, '');
27
31
  return normalized;
28
- }
29
- return normalized;
30
32
  }
31
- // Annotate the CommonJS export names for ESM import in node:
32
- 0 && (module.exports = {
33
- normalizePathname
33
+ exports.normalizePathname = __webpack_exports__.normalizePathname;
34
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
35
+ "normalizePathname"
36
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
37
+ Object.defineProperty(exports, '__esModule', {
38
+ value: true
34
39
  });
@@ -0,0 +1,118 @@
1
+ function invariant(value, message) {
2
+ if (false === value || null == value) throw new Error(message);
3
+ }
4
+ class AbortedDeferredError extends Error {
5
+ }
6
+ function isTrackedPromise(value) {
7
+ return value instanceof Promise && true === value._tracked;
8
+ }
9
+ function unwrapTrackedPromise(value) {
10
+ if (!isTrackedPromise(value)) return value;
11
+ if (value._error) throw value._error;
12
+ return value._data;
13
+ }
14
+ class DeferredData {
15
+ trackPromise(key, value) {
16
+ if (!(value instanceof Promise)) return value;
17
+ this.deferredKeys.push(key);
18
+ this.pendingKeysSet.add(key);
19
+ const promise = Promise.race([
20
+ value,
21
+ this.abortPromise
22
+ ]).then((data)=>this.onSettle(promise, key, void 0, data), (error)=>this.onSettle(promise, key, error));
23
+ promise.catch(()=>{});
24
+ Object.defineProperty(promise, '_tracked', {
25
+ get: ()=>true
26
+ });
27
+ return promise;
28
+ }
29
+ onSettle(promise, key, error, data) {
30
+ if (this.controller.signal.aborted && error instanceof AbortedDeferredError) {
31
+ this.unlistenAbortSignal();
32
+ Object.defineProperty(promise, '_error', {
33
+ get: ()=>error
34
+ });
35
+ return Promise.reject(error);
36
+ }
37
+ this.pendingKeysSet.delete(key);
38
+ if (this.done) this.unlistenAbortSignal();
39
+ if (void 0 === error && void 0 === data) {
40
+ const undefinedError = new Error(`Deferred data for key "${key}" resolved/rejected with \`undefined\`, you must resolve/reject with a value or \`null\`.`);
41
+ Object.defineProperty(promise, '_error', {
42
+ get: ()=>undefinedError
43
+ });
44
+ this.emit(false, key);
45
+ return Promise.reject(undefinedError);
46
+ }
47
+ if (void 0 === data) {
48
+ Object.defineProperty(promise, '_error', {
49
+ get: ()=>error
50
+ });
51
+ this.emit(false, key);
52
+ return Promise.reject(error);
53
+ }
54
+ Object.defineProperty(promise, '_data', {
55
+ get: ()=>data
56
+ });
57
+ this.emit(false, key);
58
+ return data;
59
+ }
60
+ emit(aborted, settledKey) {
61
+ this.subscribers.forEach((subscriber)=>subscriber(aborted, settledKey));
62
+ }
63
+ subscribe(fn) {
64
+ this.subscribers.add(fn);
65
+ return ()=>this.subscribers.delete(fn);
66
+ }
67
+ cancel() {
68
+ this.controller.abort();
69
+ this.pendingKeysSet.forEach((v, k)=>this.pendingKeysSet.delete(k));
70
+ this.emit(true);
71
+ }
72
+ async resolveData(signal) {
73
+ let aborted = false;
74
+ if (!this.done) {
75
+ const onAbort = ()=>this.cancel();
76
+ signal.addEventListener('abort', onAbort);
77
+ aborted = await new Promise((resolve)=>{
78
+ this.subscribe((aborted)=>{
79
+ signal.removeEventListener('abort', onAbort);
80
+ if (aborted || this.done) resolve(aborted);
81
+ });
82
+ });
83
+ }
84
+ return aborted;
85
+ }
86
+ get done() {
87
+ return 0 === this.pendingKeysSet.size;
88
+ }
89
+ get unwrappedData() {
90
+ invariant(null !== this.data && this.done, 'Can only unwrap data on initialized and settled deferreds');
91
+ return Object.entries(this.data).reduce((acc, [key, value])=>Object.assign(acc, {
92
+ [key]: unwrapTrackedPromise(value)
93
+ }), {});
94
+ }
95
+ get pendingKeys() {
96
+ return Array.from(this.pendingKeysSet);
97
+ }
98
+ constructor(data, responseInit){
99
+ this.pendingKeysSet = new Set();
100
+ this.subscribers = new Set();
101
+ this.__modern_deferred = true;
102
+ this.deferredKeys = [];
103
+ invariant(data && 'object' == typeof data && !Array.isArray(data), 'defer() only accepts plain objects');
104
+ let reject;
105
+ this.abortPromise = new Promise((_, r)=>reject = r);
106
+ this.controller = new AbortController();
107
+ const onAbort = ()=>reject(new AbortedDeferredError('Deferred data aborted'));
108
+ this.unlistenAbortSignal = ()=>this.controller.signal.removeEventListener('abort', onAbort);
109
+ this.controller.signal.addEventListener('abort', onAbort);
110
+ this.data = Object.entries(data).reduce((acc, [key, value])=>Object.assign(acc, {
111
+ [key]: this.trackPromise(key, value)
112
+ }), {});
113
+ if (this.done) this.unlistenAbortSignal();
114
+ this.init = responseInit;
115
+ }
116
+ }
117
+ const activeDeferreds = new Map();
118
+ export { AbortedDeferredError, DeferredData, activeDeferreds, invariant };
@@ -0,0 +1,104 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
3
+ import { Suspense } from "react";
4
+ import { Outlet, Route, createRoutesFromElements } from "react-router";
5
+ import { time } from "../time";
6
+ import { getAsyncLocalStorage } from "../universal/async_storage";
7
+ import { DeferredData, activeDeferreds as external_deferreds_activeDeferreds } from "./deferreds";
8
+ const privateDefer = (data)=>new DeferredData(data);
9
+ const transformNestedRoutes = (routes)=>{
10
+ const routeElements = [];
11
+ for (const route of routes){
12
+ const routeElement = renderNestedRoute(route);
13
+ routeElements.push(routeElement);
14
+ }
15
+ return createRoutesFromElements(routeElements);
16
+ };
17
+ const renderNestedRoute = (nestedRoute, options = {})=>{
18
+ const { children, index, id, component, isRoot, lazyImport, config, handle } = nestedRoute;
19
+ const Component = component;
20
+ const { parent, props = {} } = options;
21
+ const routeProps = {
22
+ caseSensitive: nestedRoute.caseSensitive,
23
+ path: nestedRoute.path,
24
+ id: nestedRoute.id,
25
+ loader: createLoader(nestedRoute),
26
+ action: nestedRoute.action,
27
+ hasErrorBoundary: nestedRoute.hasErrorBoundary,
28
+ shouldRevalidate: nestedRoute.shouldRevalidate,
29
+ handle: {
30
+ ...handle,
31
+ ...'object' == typeof config ? config?.handle : {}
32
+ },
33
+ index: nestedRoute.index,
34
+ element: nestedRoute.element,
35
+ errorElement: nestedRoute.errorElement
36
+ };
37
+ if (nestedRoute.error) {
38
+ const errorElement = /*#__PURE__*/ jsx(nestedRoute.error, {});
39
+ routeProps.errorElement = errorElement;
40
+ }
41
+ let element;
42
+ if (Component) if (parent?.loading && lazyImport) {
43
+ const Loading = parent.loading;
44
+ element = isLoadableComponent(Component) ? /*#__PURE__*/ jsx(Component, {
45
+ fallback: /*#__PURE__*/ jsx(Loading, {})
46
+ }) : /*#__PURE__*/ jsx(Suspense, {
47
+ fallback: /*#__PURE__*/ jsx(Loading, {}),
48
+ children: /*#__PURE__*/ jsx(Component, {})
49
+ });
50
+ } else element = isLoadableComponent(Component) && lazyImport ? /*#__PURE__*/ jsx(Component, {}) : isRoot ? /*#__PURE__*/ jsx(Component, {
51
+ ...props
52
+ }) : lazyImport ? /*#__PURE__*/ jsx(Suspense, {
53
+ fallback: null,
54
+ children: /*#__PURE__*/ jsx(Component, {})
55
+ }) : /*#__PURE__*/ jsx(Component, {});
56
+ else {
57
+ nestedRoute.loading = parent?.loading;
58
+ routeProps.element = /*#__PURE__*/ jsx(Outlet, {});
59
+ }
60
+ if (element) routeProps.element = element;
61
+ const childElements = children?.map((childRoute)=>renderNestedRoute(childRoute, {
62
+ parent: nestedRoute
63
+ }));
64
+ const routeElement = index ? /*#__PURE__*/ jsx(Route, {
65
+ ...routeProps,
66
+ index: true
67
+ }, id) : /*#__PURE__*/ jsx(Route, {
68
+ ...routeProps,
69
+ index: false,
70
+ children: childElements
71
+ }, id);
72
+ return routeElement;
73
+ };
74
+ function isPlainObject(value) {
75
+ return null != value && 'object' == typeof value && Object.getPrototypeOf(value) === Object.prototype;
76
+ }
77
+ function createLoader(route) {
78
+ const { loader } = route;
79
+ if (loader) return async (args)=>{
80
+ if ('function' == typeof route.lazyImport) route.lazyImport();
81
+ const end = time();
82
+ const res = await loader(args);
83
+ let activeDeferreds = null;
84
+ activeDeferreds = "u" < typeof document ? (await getAsyncLocalStorage())?.useContext()?.activeDeferreds : external_deferreds_activeDeferreds;
85
+ if (isPlainObject(res)) {
86
+ const deferredData = privateDefer(res);
87
+ activeDeferreds.set(route.id, deferredData);
88
+ }
89
+ const cost = end();
90
+ if ("u" < typeof document) {
91
+ const storage = await getAsyncLocalStorage();
92
+ storage?.useContext().monitors?.timing(`${LOADER_REPORTER_NAME}-${route.id?.replace(/\//g, '_')}`, cost);
93
+ }
94
+ return res;
95
+ };
96
+ return ()=>{
97
+ if ('function' == typeof route.lazyImport) route.lazyImport();
98
+ return null;
99
+ };
100
+ }
101
+ function isLoadableComponent(component) {
102
+ return component && 'Loadable' === component.displayName && component.preload && 'function' == typeof component.preload;
103
+ }
104
+ export { renderNestedRoute, transformNestedRoutes };
@@ -0,0 +1,26 @@
1
+ function isObject(obj) {
2
+ return obj && 'object' == typeof obj && !Array.isArray(obj);
3
+ }
4
+ function isComplexInstance(obj) {
5
+ if (!isObject(obj)) return false;
6
+ const hasMethods = 'function' == typeof obj.init || 'function' == typeof obj.changeLanguage || 'function' == typeof obj.t;
7
+ const hasInternalProps = void 0 !== obj.isInitialized || void 0 !== obj.language || void 0 !== obj.store;
8
+ return hasMethods || hasInternalProps;
9
+ }
10
+ function merge(target, ...sources) {
11
+ if (!sources.length) return target;
12
+ const source = sources.shift();
13
+ if (isObject(target) && isObject(source)) for(const key in source)if (isComplexInstance(source[key])) Object.assign(target, {
14
+ [key]: source[key]
15
+ });
16
+ else if (isObject(source[key])) {
17
+ if (!target[key]) Object.assign(target, {
18
+ [key]: {}
19
+ });
20
+ merge(target[key], source[key]);
21
+ } else Object.assign(target, {
22
+ [key]: source[key]
23
+ });
24
+ return merge(target, ...sources);
25
+ }
26
+ export { merge };
@@ -0,0 +1,47 @@
1
+ import fs_extra from "@modern-js/utils/fs-extra";
2
+ import { createMemoryStorage } from "./storer";
3
+ class FileReader {
4
+ async readFile(path, encoding = 'utf-8') {
5
+ const { fs } = this;
6
+ const _readfile = this._readFileFactory(fs);
7
+ return _readfile(path, encoding);
8
+ }
9
+ async readFileFromSystem(path, encoding = 'utf-8') {
10
+ const _readfile = this._readFileFactory(fs_extra);
11
+ return _readfile(path, encoding);
12
+ }
13
+ _readFileFactory(fs) {
14
+ return async (path, encoding = 'utf-8')=>{
15
+ const cache = await this.storage.get(path);
16
+ if (null === cache) return null;
17
+ if (cache) return this.encodingContent(cache, encoding);
18
+ const isExistFile = await new Promise((resolve)=>{
19
+ fs.stat(path, (err, stats)=>{
20
+ if (err) return void resolve(false);
21
+ stats.isFile() ? resolve(true) : resolve(false);
22
+ });
23
+ });
24
+ if (isExistFile) {
25
+ const content = await fs.promises.readFile(path);
26
+ this.storage.set(path, content);
27
+ return this.encodingContent(content, encoding);
28
+ }
29
+ this.storage.set(path, null);
30
+ return null;
31
+ };
32
+ }
33
+ reset(fs) {
34
+ fs && (this.fs = fs);
35
+ return this.storage.clear?.();
36
+ }
37
+ encodingContent(value, encoding) {
38
+ if ('utf-8' === encoding) return value.toString();
39
+ return value;
40
+ }
41
+ constructor(storage){
42
+ this.fs = fs_extra;
43
+ this.storage = storage;
44
+ }
45
+ }
46
+ const fileReader = new FileReader(createMemoryStorage('__file__system'));
47
+ export { FileReader, fileReader };
@@ -1,8 +1,5 @@
1
- import { storage } from "../universal/async_storage.server";
1
+ import { storage } from "../universal/async_storage.server.mjs";
2
2
  import { serializeJson } from "./serialize";
3
3
  export * from "./loaderContext";
4
4
  export * from "./stream";
5
- export {
6
- serializeJson,
7
- storage
8
- };
5
+ export { serializeJson, storage };
@@ -0,0 +1,14 @@
1
+ class LoaderContext {
2
+ getDefaultValue() {
3
+ if (!this.defaultValue) throw new Error("Can't get defaultValue before initialed");
4
+ return this.defaultValue;
5
+ }
6
+ constructor(defaultValue){
7
+ this.defaultValue = defaultValue;
8
+ this.symbol = Symbol('loaderContext');
9
+ }
10
+ }
11
+ function createLoaderContext(defaultValue) {
12
+ return new LoaderContext(defaultValue);
13
+ }
14
+ export { LoaderContext, createLoaderContext };
@@ -0,0 +1,16 @@
1
+ function createRequestContext(context) {
2
+ const _context = context || new Map();
3
+ function get(key) {
4
+ if ('string' == typeof key) return _context.get(key);
5
+ return _context.get(key.symbol) || key.getDefaultValue();
6
+ }
7
+ function set(key, value) {
8
+ if ('string' == typeof key) _context.set(key, value);
9
+ else _context.set(key.symbol, value);
10
+ }
11
+ return {
12
+ set,
13
+ get
14
+ };
15
+ }
16
+ export { createRequestContext };
@@ -1,7 +1,4 @@
1
1
  import { createLoaderContext } from "./createLoaderCtx";
2
2
  import { createRequestContext } from "./createRequestCtx";
3
3
  const reporterCtx = createLoaderContext();
4
- export {
5
- createRequestContext,
6
- reporterCtx
7
- };
4
+ export { createRequestContext, reporterCtx };
@@ -0,0 +1,5 @@
1
+ import serialize_javascript from "serialize-javascript";
2
+ const serializeJson = (data)=>serialize_javascript(data, {
3
+ isJSON: true
4
+ });
5
+ export { serializeJson };
@@ -0,0 +1,38 @@
1
+ import { LRUCache } from "lru-cache";
2
+ class MemoryContainer {
3
+ async get(key) {
4
+ return this.cache.get(key);
5
+ }
6
+ async set(key, value) {
7
+ this.cache.set(key, value);
8
+ return this;
9
+ }
10
+ async has(key) {
11
+ return this.cache.has(key);
12
+ }
13
+ async delete(key) {
14
+ const exist = await this.has(key);
15
+ if (exist) this.cache.delete(key);
16
+ return exist;
17
+ }
18
+ forEach(callbackFn) {
19
+ this.cache.forEach((value, key)=>{
20
+ callbackFn(value, key, this);
21
+ });
22
+ }
23
+ constructor({ max, maxAge } = {}){
24
+ this.cache = new LRUCache({
25
+ maxSize: (max || 256) * MemoryContainer.MB,
26
+ ttl: maxAge || MemoryContainer.hour,
27
+ sizeCalculation: (value, key)=>JSON.stringify(value).length
28
+ });
29
+ }
30
+ }
31
+ MemoryContainer.BYTE = 1;
32
+ MemoryContainer.KB = 1024 * MemoryContainer.BYTE;
33
+ MemoryContainer.MB = 1024 * MemoryContainer.KB;
34
+ MemoryContainer.ms = 1;
35
+ MemoryContainer.second = 1000 * MemoryContainer.ms;
36
+ MemoryContainer.minute = 60 * MemoryContainer.second;
37
+ MemoryContainer.hour = 60 * MemoryContainer.minute;
38
+ export { MemoryContainer };
@@ -1,11 +1,7 @@
1
1
  import { MemoryContainer } from "./container";
2
2
  import { Storage } from "./storage";
3
- import { Storage as Storage2 } from "./storage";
4
3
  const memoryContainer = new MemoryContainer();
5
4
  function createMemoryStorage(namespace) {
6
- return new Storage(namespace, memoryContainer);
5
+ return new Storage(namespace, memoryContainer);
7
6
  }
8
- export {
9
- Storage2 as Storage,
10
- createMemoryStorage
11
- };
7
+ export { Storage, createMemoryStorage };