one 1.2.17 → 1.2.19

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 (109) hide show
  1. package/dist/cjs/createHandleRequest.cjs +7 -2
  2. package/dist/cjs/createHandleRequest.js +8 -3
  3. package/dist/cjs/createHandleRequest.js.map +1 -1
  4. package/dist/cjs/createHandleRequest.native.js +8 -2
  5. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  6. package/dist/cjs/experimental-useLoaderState.cjs +64 -0
  7. package/dist/cjs/experimental-useLoaderState.js +44 -0
  8. package/dist/cjs/experimental-useLoaderState.js.map +6 -0
  9. package/dist/cjs/experimental-useLoaderState.native.js +69 -0
  10. package/dist/cjs/experimental-useLoaderState.native.js.map +1 -0
  11. package/dist/cjs/getDevServer.cjs +29 -0
  12. package/dist/cjs/getDevServer.js +24 -0
  13. package/dist/cjs/getDevServer.js.map +6 -0
  14. package/dist/cjs/getDevServer.native.js +40 -0
  15. package/dist/cjs/getDevServer.native.js.map +1 -0
  16. package/dist/cjs/getURL.native.js +8 -18
  17. package/dist/cjs/getURL.native.js.map +1 -1
  18. package/dist/cjs/index.cjs +1 -0
  19. package/dist/cjs/index.js +1 -0
  20. package/dist/cjs/index.js.map +1 -1
  21. package/dist/cjs/index.native.js +1 -0
  22. package/dist/cjs/index.native.js.map +1 -1
  23. package/dist/cjs/server/oneServe.cjs +8 -6
  24. package/dist/cjs/server/oneServe.js +5 -5
  25. package/dist/cjs/server/oneServe.js.map +1 -1
  26. package/dist/cjs/server/oneServe.native.js +8 -6
  27. package/dist/cjs/server/oneServe.native.js.map +1 -1
  28. package/dist/cjs/setup.native.js.map +6 -1
  29. package/dist/cjs/useLoader.cjs +117 -36
  30. package/dist/cjs/useLoader.js +108 -33
  31. package/dist/cjs/useLoader.js.map +2 -2
  32. package/dist/cjs/useLoader.native.js +151 -55
  33. package/dist/cjs/useLoader.native.js.map +1 -1
  34. package/dist/cjs/utils/cleanUrl.cjs +6 -5
  35. package/dist/cjs/utils/cleanUrl.js +4 -8
  36. package/dist/cjs/utils/cleanUrl.js.map +1 -1
  37. package/dist/cjs/utils/cleanUrl.native.js +6 -3
  38. package/dist/cjs/utils/cleanUrl.native.js.map +1 -1
  39. package/dist/esm/createHandleRequest.js +8 -3
  40. package/dist/esm/createHandleRequest.js.map +1 -1
  41. package/dist/esm/createHandleRequest.mjs +7 -2
  42. package/dist/esm/createHandleRequest.mjs.map +1 -1
  43. package/dist/esm/createHandleRequest.native.js +8 -2
  44. package/dist/esm/createHandleRequest.native.js.map +1 -1
  45. package/dist/esm/experimental-useLoaderState.js +32 -0
  46. package/dist/esm/experimental-useLoaderState.js.map +6 -0
  47. package/dist/esm/experimental-useLoaderState.mjs +41 -0
  48. package/dist/esm/experimental-useLoaderState.mjs.map +1 -0
  49. package/dist/esm/experimental-useLoaderState.native.js +43 -0
  50. package/dist/esm/experimental-useLoaderState.native.js.map +1 -0
  51. package/dist/esm/getDevServer.js +8 -0
  52. package/dist/esm/getDevServer.js.map +6 -0
  53. package/dist/esm/getDevServer.mjs +6 -0
  54. package/dist/esm/getDevServer.mjs.map +1 -0
  55. package/dist/esm/getDevServer.native.js +3 -0
  56. package/dist/esm/getDevServer.native.js.map +1 -0
  57. package/dist/esm/getURL.native.js +3 -2
  58. package/dist/esm/getURL.native.js.map +1 -1
  59. package/dist/esm/index.js +2 -1
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/index.mjs +2 -2
  62. package/dist/esm/index.mjs.map +1 -1
  63. package/dist/esm/index.native.js +2 -2
  64. package/dist/esm/index.native.js.map +1 -1
  65. package/dist/esm/server/oneServe.js +5 -5
  66. package/dist/esm/server/oneServe.js.map +1 -1
  67. package/dist/esm/server/oneServe.mjs +7 -5
  68. package/dist/esm/server/oneServe.mjs.map +1 -1
  69. package/dist/esm/server/oneServe.native.js +7 -5
  70. package/dist/esm/server/oneServe.native.js.map +1 -1
  71. package/dist/esm/useLoader.js +110 -35
  72. package/dist/esm/useLoader.js.map +2 -2
  73. package/dist/esm/useLoader.mjs +117 -38
  74. package/dist/esm/useLoader.mjs.map +1 -1
  75. package/dist/esm/useLoader.native.js +151 -57
  76. package/dist/esm/useLoader.native.js.map +1 -1
  77. package/dist/esm/utils/cleanUrl.js +4 -8
  78. package/dist/esm/utils/cleanUrl.js.map +1 -1
  79. package/dist/esm/utils/cleanUrl.mjs +6 -5
  80. package/dist/esm/utils/cleanUrl.mjs.map +1 -1
  81. package/dist/esm/utils/cleanUrl.native.js +6 -3
  82. package/dist/esm/utils/cleanUrl.native.js.map +1 -1
  83. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  84. package/package.json +10 -10
  85. package/src/createHandleRequest.ts +6 -2
  86. package/src/getDevServer.native.ts +5 -0
  87. package/src/getDevServer.ts +5 -0
  88. package/src/getURL.native.ts +10 -5
  89. package/src/index.ts +1 -1
  90. package/src/server/oneServe.ts +12 -6
  91. package/src/types.ts +1 -0
  92. package/src/useLoader.ts +206 -90
  93. package/src/utils/cleanUrl.ts +7 -10
  94. package/types/createHandleRequest.d.ts.map +1 -1
  95. package/types/experimental-useLoaderState.d.ts.map +1 -0
  96. package/types/getDevServer.d.ts +5 -0
  97. package/types/getDevServer.d.ts.map +1 -0
  98. package/types/getDevServer.native.d.ts +2 -0
  99. package/types/getDevServer.native.d.ts.map +1 -0
  100. package/types/getURL.native.d.ts.map +1 -1
  101. package/types/index.d.ts +1 -1
  102. package/types/index.d.ts.map +1 -1
  103. package/types/server/oneServe.d.ts.map +1 -1
  104. package/types/types.d.ts +1 -0
  105. package/types/types.d.ts.map +1 -1
  106. package/types/useLoader.d.ts +9 -0
  107. package/types/useLoader.d.ts.map +1 -1
  108. package/types/utils/cleanUrl.d.ts +1 -1
  109. package/types/utils/cleanUrl.d.ts.map +1 -1
@@ -1,50 +1,123 @@
1
- import { useEffect, useRef } from "react";
2
- import { useActiveParams, useParams, usePathname } from "./hooks";
1
+ import { useCallback, useSyncExternalStore } from "react";
2
+ import { useParams, usePathname } from "./hooks";
3
3
  import { resolveHref } from "./link/href";
4
4
  import { preloadingLoader } from "./router/router";
5
5
  import { getLoaderPath } from "./utils/cleanUrl";
6
6
  import { dynamicImport } from "./utils/dynamicImport";
7
7
  import { weakKey } from "./utils/weakKey";
8
8
  import { useServerContext } from "./vite/one-server-only";
9
- const promises = {}, errors = {}, loadedData = {};
10
- function useLoader(loader) {
11
- const { loaderProps: loaderPropsFromServerContext, loaderData: loaderDataFromServerContext } = useServerContext() || {};
12
- if (typeof window > "u")
13
- return useAsyncFn(
9
+ const loaderState = {}, subscribers = /* @__PURE__ */ new Set();
10
+ function updateState(path, updates) {
11
+ loaderState[path] = { ...loaderState[path], ...updates }, subscribers.forEach((callback) => {
12
+ callback();
13
+ });
14
+ }
15
+ function subscribe(callback) {
16
+ return subscribers.add(callback), () => subscribers.delete(callback);
17
+ }
18
+ function getLoaderState(path, preloadedData2) {
19
+ return loaderState[path] || (loaderState[path] = {
20
+ data: preloadedData2,
21
+ error: void 0,
22
+ promise: void 0,
23
+ state: "idle",
24
+ hasLoadedOnce: !!preloadedData2
25
+ }), loaderState[path];
26
+ }
27
+ async function refetchLoader(pathname2) {
28
+ updateState(pathname2, {
29
+ state: "loading",
30
+ error: null
31
+ });
32
+ try {
33
+ const cacheBust = `${Date.now()}`, loaderJSUrl2 = getLoaderPath(pathname2, !0, cacheBust), result2 = await (await dynamicImport(loaderJSUrl2)).loader();
34
+ updateState(pathname2, {
35
+ data: result2,
36
+ state: "idle",
37
+ timestamp: Date.now(),
38
+ hasLoadedOnce: !0
39
+ });
40
+ } catch (err) {
41
+ throw updateState(pathname2, {
42
+ error: err,
43
+ state: "idle"
44
+ }), err;
45
+ }
46
+ }
47
+ function useLoaderState(loader) {
48
+ const { loaderProps: loaderPropsFromServerContext, loaderData: loaderDataFromServerContext } = useServerContext() || {}, params = useParams(), pathname = usePathname(), currentPath = resolveHref({ pathname, params }).replace(/index$/, "");
49
+ if (typeof window > "u" && loader)
50
+ return { data: useAsyncFn(
14
51
  loader,
15
52
  loaderPropsFromServerContext || {
16
- path: usePathname(),
17
- params: useActiveParams()
53
+ path: pathname,
54
+ params
18
55
  }
19
- );
20
- const params = useParams(), pathname = usePathname(), currentPath = resolveHref({ pathname, params }).replace(/index$/, "").replace(/\?.*/, ""), preloadedData = loaderPropsFromServerContext?.path === currentPath ? loaderDataFromServerContext : void 0, currentData = useRef(preloadedData);
21
- if (useEffect(() => {
22
- preloadedData && (loadedData[currentPath] = preloadedData);
23
- }, [preloadedData]), errors[currentPath])
24
- throw errors[currentPath];
25
- const loaded = loadedData[currentPath];
26
- if (typeof loaded < "u")
27
- return loaded;
28
- if (!preloadedData) {
29
- if (preloadingLoader[currentPath] && (typeof preloadingLoader[currentPath] == "function" && (preloadingLoader[currentPath] = preloadingLoader[currentPath]()), promises[currentPath] = preloadingLoader[currentPath].then((val) => {
30
- loadedData[currentPath] = val;
31
- }).catch((err) => {
32
- console.error("Error loading loader", err), errors[currentPath] = err, delete promises[currentPath], delete preloadingLoader[currentPath];
33
- })), !promises[currentPath]) {
34
- const getData = async () => {
35
- const loaderJSUrl = getLoaderPath(currentPath, !0);
56
+ ), refetch: async () => {
57
+ }, state: "idle" };
58
+ const preloadedData = loaderPropsFromServerContext?.path === currentPath ? loaderDataFromServerContext : void 0, loaderStateEntry = useSyncExternalStore(
59
+ subscribe,
60
+ () => getLoaderState(currentPath, preloadedData),
61
+ () => getLoaderState(currentPath, preloadedData)
62
+ ), refetch = useCallback(() => refetchLoader(currentPath), [currentPath]);
63
+ if (!loader)
64
+ return {
65
+ refetch,
66
+ state: loaderStateEntry.state
67
+ };
68
+ if (!loaderStateEntry.data && !loaderStateEntry.promise && !loaderStateEntry.hasLoadedOnce && loader)
69
+ if (preloadingLoader[currentPath]) {
70
+ typeof preloadingLoader[currentPath] == "function" && (preloadingLoader[currentPath] = preloadingLoader[currentPath]());
71
+ const promise2 = preloadingLoader[currentPath].then((val) => {
72
+ delete preloadingLoader[currentPath], updateState(currentPath, {
73
+ data: val,
74
+ hasLoadedOnce: !0,
75
+ promise: void 0
76
+ });
77
+ }).catch((err) => {
78
+ console.error("Error running loader()", err), delete preloadingLoader[currentPath], updateState(currentPath, {
79
+ error: err,
80
+ promise: void 0
81
+ });
82
+ });
83
+ loaderStateEntry.promise = promise2;
84
+ } else {
85
+ const loadData = async () => {
36
86
  try {
37
- const response = await (async () => await dynamicImport(loaderJSUrl))();
38
- return loadedData[currentPath] = response.loader(), loadedData[currentPath];
87
+ const loaderJSUrl = getLoaderPath(currentPath, !0), module = await dynamicImport(loaderJSUrl), result = await module.loader();
88
+ updateState(currentPath, {
89
+ data: result,
90
+ hasLoadedOnce: !0,
91
+ promise: void 0
92
+ });
39
93
  } catch (err) {
40
- return console.error(`Error calling loader: ${err}`), errors[currentPath] = err, delete promises[currentPath], null;
94
+ updateState(currentPath, {
95
+ error: err,
96
+ promise: void 0
97
+ });
41
98
  }
42
- };
43
- promises[currentPath] = getData();
99
+ }, promise = loadData();
100
+ loaderStateEntry.promise = promise;
44
101
  }
45
- throw promises[currentPath];
46
- }
47
- return currentData.current;
102
+ if (loader) {
103
+ if (loaderStateEntry.error && !loaderStateEntry.hasLoadedOnce)
104
+ throw loaderStateEntry.error;
105
+ if (loaderStateEntry.data === void 0 && loaderStateEntry.promise && !loaderStateEntry.hasLoadedOnce)
106
+ throw loaderStateEntry.promise;
107
+ return {
108
+ data: loaderStateEntry.data,
109
+ refetch,
110
+ state: loaderStateEntry.state
111
+ };
112
+ } else
113
+ return {
114
+ refetch,
115
+ state: loaderStateEntry.state
116
+ };
117
+ }
118
+ function useLoader(loader2) {
119
+ const { data: data2 } = useLoaderState(loader2);
120
+ return data2;
48
121
  }
49
122
  const results = /* @__PURE__ */ new Map(), started = /* @__PURE__ */ new Map();
50
123
  function useAsyncFn(val, props) {
@@ -64,6 +137,8 @@ function useAsyncFn(val, props) {
64
137
  return current;
65
138
  }
66
139
  export {
67
- useLoader
140
+ refetchLoader,
141
+ useLoader,
142
+ useLoaderState
68
143
  };
69
144
  //# sourceMappingURL=useLoader.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/useLoader.ts"],
4
- "mappings": "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",
5
- "names": []
4
+ "mappings": "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",
5
+ "names": ["preloadedData", "pathname", "loaderJSUrl", "result", "promise", "loader", "data"]
6
6
  }
@@ -1,56 +1,135 @@
1
- import { useEffect, useRef } from "react";
2
- import { useActiveParams, useParams, usePathname } from "./hooks.mjs";
1
+ import { useCallback, useSyncExternalStore } from "react";
2
+ import { useParams, usePathname } from "./hooks.mjs";
3
3
  import { resolveHref } from "./link/href.mjs";
4
4
  import { preloadingLoader } from "./router/router.mjs";
5
5
  import { getLoaderPath } from "./utils/cleanUrl.mjs";
6
6
  import { dynamicImport } from "./utils/dynamicImport.mjs";
7
7
  import { weakKey } from "./utils/weakKey.mjs";
8
8
  import { useServerContext } from "./vite/one-server-only.mjs";
9
- const promises = {},
10
- errors = {},
11
- loadedData = {};
12
- function useLoader(loader) {
13
- const {
14
- loaderProps: loaderPropsFromServerContext,
15
- loaderData: loaderDataFromServerContext
16
- } = useServerContext() || {};
17
- if (typeof window > "u") return useAsyncFn(loader, loaderPropsFromServerContext || {
18
- path: usePathname(),
19
- params: useActiveParams()
9
+ const loaderState = {},
10
+ subscribers = /* @__PURE__ */new Set();
11
+ function updateState(path, updates) {
12
+ loaderState[path] = {
13
+ ...loaderState[path],
14
+ ...updates
15
+ }, subscribers.forEach(callback => {
16
+ callback();
17
+ });
18
+ }
19
+ function subscribe(callback) {
20
+ return subscribers.add(callback), () => subscribers.delete(callback);
21
+ }
22
+ function getLoaderState(path, preloadedData2) {
23
+ return loaderState[path] || (loaderState[path] = {
24
+ data: preloadedData2,
25
+ error: void 0,
26
+ promise: void 0,
27
+ state: "idle",
28
+ hasLoadedOnce: !!preloadedData2
29
+ }), loaderState[path];
30
+ }
31
+ async function refetchLoader(pathname2) {
32
+ updateState(pathname2, {
33
+ state: "loading",
34
+ error: null
20
35
  });
21
- const params = useParams(),
36
+ try {
37
+ const cacheBust = `${Date.now()}`,
38
+ loaderJSUrl2 = getLoaderPath(pathname2, !0, cacheBust),
39
+ result2 = await (await dynamicImport(loaderJSUrl2)).loader();
40
+ updateState(pathname2, {
41
+ data: result2,
42
+ state: "idle",
43
+ timestamp: Date.now(),
44
+ hasLoadedOnce: !0
45
+ });
46
+ } catch (err) {
47
+ throw updateState(pathname2, {
48
+ error: err,
49
+ state: "idle"
50
+ }), err;
51
+ }
52
+ }
53
+ function useLoaderState(loader) {
54
+ const {
55
+ loaderProps: loaderPropsFromServerContext,
56
+ loaderData: loaderDataFromServerContext
57
+ } = useServerContext() || {},
58
+ params = useParams(),
22
59
  pathname = usePathname(),
23
60
  currentPath = resolveHref({
24
61
  pathname,
25
62
  params
26
- }).replace(/index$/, "").replace(/\?.*/, ""),
27
- preloadedData = loaderPropsFromServerContext?.path === currentPath ? loaderDataFromServerContext : void 0,
28
- currentData = useRef(preloadedData);
29
- if (useEffect(() => {
30
- preloadedData && (loadedData[currentPath] = preloadedData);
31
- }, [preloadedData]), errors[currentPath]) throw errors[currentPath];
32
- const loaded = loadedData[currentPath];
33
- if (typeof loaded < "u") return loaded;
34
- if (!preloadedData) {
35
- if (preloadingLoader[currentPath] && (typeof preloadingLoader[currentPath] == "function" && (preloadingLoader[currentPath] = preloadingLoader[currentPath]()), promises[currentPath] = preloadingLoader[currentPath].then(val => {
36
- loadedData[currentPath] = val;
63
+ }).replace(/index$/, "");
64
+ if (typeof window > "u" && loader) return {
65
+ data: useAsyncFn(loader, loaderPropsFromServerContext || {
66
+ path: pathname,
67
+ params
68
+ }),
69
+ refetch: async () => {},
70
+ state: "idle"
71
+ };
72
+ const preloadedData = loaderPropsFromServerContext?.path === currentPath ? loaderDataFromServerContext : void 0,
73
+ loaderStateEntry = useSyncExternalStore(subscribe, () => getLoaderState(currentPath, preloadedData), () => getLoaderState(currentPath, preloadedData)),
74
+ refetch = useCallback(() => refetchLoader(currentPath), [currentPath]);
75
+ if (!loader) return {
76
+ refetch,
77
+ state: loaderStateEntry.state
78
+ };
79
+ if (!loaderStateEntry.data && !loaderStateEntry.promise && !loaderStateEntry.hasLoadedOnce && loader) if (preloadingLoader[currentPath]) {
80
+ typeof preloadingLoader[currentPath] == "function" && (preloadingLoader[currentPath] = preloadingLoader[currentPath]());
81
+ const promise2 = preloadingLoader[currentPath].then(val => {
82
+ delete preloadingLoader[currentPath], updateState(currentPath, {
83
+ data: val,
84
+ hasLoadedOnce: !0,
85
+ promise: void 0
86
+ });
37
87
  }).catch(err => {
38
- console.error("Error loading loader", err), errors[currentPath] = err, delete promises[currentPath], delete preloadingLoader[currentPath];
39
- })), !promises[currentPath]) {
40
- const getData = async () => {
41
- const loaderJSUrl = getLoaderPath(currentPath, !0);
88
+ console.error("Error running loader()", err), delete preloadingLoader[currentPath], updateState(currentPath, {
89
+ error: err,
90
+ promise: void 0
91
+ });
92
+ });
93
+ loaderStateEntry.promise = promise2;
94
+ } else {
95
+ const loadData = async () => {
42
96
  try {
43
- const response = await (async () => await dynamicImport(loaderJSUrl))();
44
- return loadedData[currentPath] = response.loader(), loadedData[currentPath];
97
+ const loaderJSUrl = getLoaderPath(currentPath, !0),
98
+ module = await dynamicImport(loaderJSUrl),
99
+ result = await module.loader();
100
+ updateState(currentPath, {
101
+ data: result,
102
+ hasLoadedOnce: !0,
103
+ promise: void 0
104
+ });
45
105
  } catch (err) {
46
- return console.error(`Error calling loader: ${err}`), errors[currentPath] = err, delete promises[currentPath], null;
106
+ updateState(currentPath, {
107
+ error: err,
108
+ promise: void 0
109
+ });
47
110
  }
48
- };
49
- promises[currentPath] = getData();
50
- }
51
- throw promises[currentPath];
111
+ },
112
+ promise = loadData();
113
+ loaderStateEntry.promise = promise;
52
114
  }
53
- return currentData.current;
115
+ if (loader) {
116
+ if (loaderStateEntry.error && !loaderStateEntry.hasLoadedOnce) throw loaderStateEntry.error;
117
+ if (loaderStateEntry.data === void 0 && loaderStateEntry.promise && !loaderStateEntry.hasLoadedOnce) throw loaderStateEntry.promise;
118
+ return {
119
+ data: loaderStateEntry.data,
120
+ refetch,
121
+ state: loaderStateEntry.state
122
+ };
123
+ } else return {
124
+ refetch,
125
+ state: loaderStateEntry.state
126
+ };
127
+ }
128
+ function useLoader(loader2) {
129
+ const {
130
+ data: data2
131
+ } = useLoaderState(loader2);
132
+ return data2;
54
133
  }
55
134
  const results = /* @__PURE__ */new Map(),
56
135
  started = /* @__PURE__ */new Map();
@@ -69,5 +148,5 @@ function useAsyncFn(val, props) {
69
148
  if (current instanceof Promise) throw current;
70
149
  return current;
71
150
  }
72
- export { useLoader };
151
+ export { refetchLoader, useLoader, useLoaderState };
73
152
  //# sourceMappingURL=useLoader.mjs.map
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useActiveParams","useParams","usePathname","resolveHref","preloadingLoader","getLoaderPath","dynamicImport","weakKey","useServerContext","promises","errors","loadedData","useLoader","loader","loaderProps","loaderPropsFromServerContext","loaderData","loaderDataFromServerContext","window","useAsyncFn","path","params","pathname","currentPath","replace","preloadedData","currentData","loaded","then","val","catch","err","console","error","getData","loaderJSUrl","response","current","results","Map","started","props","key","JSON","stringify","get","set","next","Promise","final"],"sources":["../../src/useLoader.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useSyncExternalStore","useParams","usePathname","resolveHref","preloadingLoader","getLoaderPath","dynamicImport","weakKey","useServerContext","loaderState","subscribers","Set","updateState","path","updates","forEach","callback","subscribe","add","delete","getLoaderState","preloadedData2","data","error","promise","state","hasLoadedOnce","refetchLoader","pathname2","cacheBust","Date","now","loaderJSUrl2","result2","loader","timestamp","err","useLoaderState","loaderProps","loaderPropsFromServerContext","loaderData","loaderDataFromServerContext","params","pathname","currentPath","replace","window","useAsyncFn","refetch","preloadedData","loaderStateEntry","promise2","then","val","catch","console","loadData","loaderJSUrl","module","result","useLoader","loader2","data2","results","Map","started","props","key","JSON","stringify","get","set","next","Promise","final","current"],"sources":["../../src/useLoader.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,WAAA,EAAaC,oBAAA,QAA4B;AAClD,SAASC,SAAA,EAAWC,WAAA,QAAmB;AACvC,SAASC,WAAA,QAAmB;AAC5B,SAASC,gBAAA,QAAwB;AACjC,SAASC,aAAA,QAAqB;AAC9B,SAASC,aAAA,QAAqB;AAC9B,SAASC,OAAA,QAAe;AACxB,SAASC,gBAAA,QAAwB;AAWjC,MAAMC,WAAA,GAAgD,CAAC;EACjDC,WAAA,GAAc,mBAAIC,GAAA,CAAgB;AAExC,SAASC,YAAYC,IAAA,EAAcC,OAAA,EAAoC;EACrEL,WAAA,CAAYI,IAAI,IAAI;IAAE,GAAGJ,WAAA,CAAYI,IAAI;IAAG,GAAGC;EAAQ,GACvDJ,WAAA,CAAYK,OAAA,CAASC,QAAA,IAAa;IAChCA,QAAA,CAAS;EACX,CAAC;AACH;AAEA,SAASC,UAAUD,QAAA,EAAsB;EACvC,OAAAN,WAAA,CAAYQ,GAAA,CAAIF,QAAQ,GACjB,MAAMN,WAAA,CAAYS,MAAA,CAAOH,QAAQ;AAC1C;AAEA,SAASI,eAAeP,IAAA,EAAcQ,cAAA,EAAuC;EAC3E,OAAKZ,WAAA,CAAYI,IAAI,MACnBJ,WAAA,CAAYI,IAAI,IAAI;IAClBS,IAAA,EAAMD,cAAA;IACNE,KAAA,EAAO;IACPC,OAAA,EAAS;IACTC,KAAA,EAAO;IACPC,aAAA,EAAe,CAAC,CAACL;EACnB,IAEKZ,WAAA,CAAYI,IAAI;AACzB;AAEA,eAAsBc,cAAcC,SAAA,EAAiC;EACnEhB,WAAA,CAAYgB,SAAA,EAAU;IACpBH,KAAA,EAAO;IACPF,KAAA,EAAO;EACT,CAAC;EAED,IAAI;IACF,MAAMM,SAAA,GAAY,GAAGC,IAAA,CAAKC,GAAA,CAAI,CAAC;MACzBC,YAAA,GAAc3B,aAAA,CAAcuB,SAAA,EAAU,IAAMC,SAAS;MAGrDI,OAAA,GAAS,OADA,MAAM3B,aAAA,CAAc0B,YAAW,GAClBE,MAAA,CAAO;IAEnCtB,WAAA,CAAYgB,SAAA,EAAU;MACpBN,IAAA,EAAMW,OAAA;MACNR,KAAA,EAAO;MACPU,SAAA,EAAWL,IAAA,CAAKC,GAAA,CAAI;MACpBL,aAAA,EAAe;IACjB,CAAC;EACH,SAASU,GAAA,EAAK;IACZ,MAAAxB,WAAA,CAAYgB,SAAA,EAAU;MACpBL,KAAA,EAAOa,GAAA;MACPX,KAAA,EAAO;IACT,CAAC,GACKW,GAAA;EACR;AACF;AAEO,SAASC,eAIdH,MAAA,EAOI;EACJ,MAAM;MAAEI,WAAA,EAAaC,4BAAA;MAA8BC,UAAA,EAAYC;IAA4B,IACzFjC,gBAAA,CAAiB,KAAK,CAAC;IAEnBkC,MAAA,GAASzC,SAAA,CAAU;IACnB0C,QAAA,GAAWzC,WAAA,CAAY;IACvB0C,WAAA,GAAczC,WAAA,CAAY;MAAEwC,QAAA;MAAUD;IAAO,CAAC,EAAEG,OAAA,CAAQ,UAAU,EAAE;EAG1E,IAAI,OAAOC,MAAA,GAAW,OAAeZ,MAAA,EAQnC,OAAO;IAAEZ,IAAA,EAPUyB,UAAA,CACjBb,MAAA,EACAK,4BAAA,IAAgC;MAC9B1B,IAAA,EAAM8B,QAAA;MACND;IACF,CACF;IAC2BM,OAAA,EAAS,MAAAA,CAAA,KAAY,CAAC;IAAGvB,KAAA,EAAO;EAAO;EAIpE,MAAMwB,aAAA,GACJV,4BAAA,EAA8B1B,IAAA,KAAS+B,WAAA,GAAcH,2BAAA,GAA8B;IAE/ES,gBAAA,GAAmBlD,oBAAA,CACvBiB,SAAA,EACA,MAAMG,cAAA,CAAewB,WAAA,EAAaK,aAAa,GAC/C,MAAM7B,cAAA,CAAewB,WAAA,EAAaK,aAAa,CACjD;IAEMD,OAAA,GAAUjD,WAAA,CAAY,MAAM4B,aAAA,CAAciB,WAAW,GAAG,CAACA,WAAW,CAAC;EAG3E,IAAI,CAACV,MAAA,EACH,OAAO;IACLc,OAAA;IACAvB,KAAA,EAAOyB,gBAAA,CAAiBzB;EAC1B;EAIF,IACE,CAACyB,gBAAA,CAAiB5B,IAAA,IAClB,CAAC4B,gBAAA,CAAiB1B,OAAA,IAClB,CAAC0B,gBAAA,CAAiBxB,aAAA,IAClBQ,MAAA,EAGA,IAAI9B,gBAAA,CAAiBwC,WAAW,GAAG;IAC7B,OAAOxC,gBAAA,CAAiBwC,WAAW,KAAM,eAC3CxC,gBAAA,CAAiBwC,WAAW,IAAIxC,gBAAA,CAAiBwC,WAAW,EAAE;IAEhE,MAAMO,QAAA,GAAU/C,gBAAA,CAAiBwC,WAAW,EACzCQ,IAAA,CAAMC,GAAA,IAAa;MAClB,OAAOjD,gBAAA,CAAiBwC,WAAW,GACnChC,WAAA,CAAYgC,WAAA,EAAa;QACvBtB,IAAA,EAAM+B,GAAA;QACN3B,aAAA,EAAe;QACfF,OAAA,EAAS;MACX,CAAC;IACH,CAAC,EACA8B,KAAA,CAAOlB,GAAA,IAAa;MACnBmB,OAAA,CAAQhC,KAAA,CAAM,0BAA0Ba,GAAG,GAC3C,OAAOhC,gBAAA,CAAiBwC,WAAW,GACnChC,WAAA,CAAYgC,WAAA,EAAa;QACvBrB,KAAA,EAAOa,GAAA;QACPZ,OAAA,EAAS;MACX,CAAC;IACH,CAAC;IAEH0B,gBAAA,CAAiB1B,OAAA,GAAU2B,QAAA;EAC7B,OAAO;IAEL,MAAMK,QAAA,GAAW,MAAAA,CAAA,KAAY;QAC3B,IAAI;UAmCF,MAAMC,WAAA,GAAcpD,aAAA,CAAcuC,WAAA,EAAa,EAAI;YAC7Cc,MAAA,GAAS,MAAMpD,aAAA,CAAcmD,WAAW;YACxCE,MAAA,GAAS,MAAMD,MAAA,CAAOxB,MAAA,CAAO;UACnCtB,WAAA,CAAYgC,WAAA,EAAa;YACvBtB,IAAA,EAAMqC,MAAA;YACNjC,aAAA,EAAe;YACfF,OAAA,EAAS;UACX,CAAC;QACH,SAASY,GAAA,EAAK;UACZxB,WAAA,CAAYgC,WAAA,EAAa;YACvBrB,KAAA,EAAOa,GAAA;YACPZ,OAAA,EAAS;UACX,CAAC;QACH;MACF;MAEMA,OAAA,GAAUgC,QAAA,CAAS;IACzBN,gBAAA,CAAiB1B,OAAA,GAAUA,OAAA;EAC7B;EAIF,IAAIU,MAAA,EAAQ;IAEV,IAAIgB,gBAAA,CAAiB3B,KAAA,IAAS,CAAC2B,gBAAA,CAAiBxB,aAAA,EAC9C,MAAMwB,gBAAA,CAAiB3B,KAAA;IAIzB,IACE2B,gBAAA,CAAiB5B,IAAA,KAAS,UAC1B4B,gBAAA,CAAiB1B,OAAA,IACjB,CAAC0B,gBAAA,CAAiBxB,aAAA,EAElB,MAAMwB,gBAAA,CAAiB1B,OAAA;IAGzB,OAAO;MACLF,IAAA,EAAM4B,gBAAA,CAAiB5B,IAAA;MACvB0B,OAAA;MACAvB,KAAA,EAAOyB,gBAAA,CAAiBzB;IAC1B;EACF,OACE,OAAO;IACLuB,OAAA;IACAvB,KAAA,EAAOyB,gBAAA,CAAiBzB;EAC1B;AAEJ;AAEO,SAASmC,UAGdC,OAAA,EAA8E;EAC9E,MAAM;IAAEvC,IAAA,EAAAwC;EAAK,IAAIzB,cAAA,CAAewB,OAAM;EACtC,OAAOC,KAAA;AACT;AAEA,MAAMC,OAAA,GAAU,mBAAIC,GAAA,CAAI;EAClBC,OAAA,GAAU,mBAAID,GAAA,CAAI;AAExB,SAASjB,WAAWM,GAAA,EAAUa,KAAA,EAAa;EACzC,MAAMC,GAAA,IAAOd,GAAA,GAAM9C,OAAA,CAAQ8C,GAAG,IAAI,MAAMe,IAAA,CAAKC,SAAA,CAAUH,KAAK;EAE5D,IAAIb,GAAA,IACE,CAACY,OAAA,CAAQK,GAAA,CAAIH,GAAG,GAAG;IACrBF,OAAA,CAAQM,GAAA,CAAIJ,GAAA,EAAK,EAAI;IAErB,IAAIK,IAAA,GAAOnB,GAAA,CAAIa,KAAK;IAChBM,IAAA,YAAgBC,OAAA,KAClBD,IAAA,GAAOA,IAAA,CACJpB,IAAA,CAAMsB,KAAA,IAAU;MACfX,OAAA,CAAQQ,GAAA,CAAIJ,GAAA,EAAKO,KAAK;IACxB,CAAC,EACApB,KAAA,CAAOlB,GAAA,IAAQ;MACdmB,OAAA,CAAQhC,KAAA,CAAM,0BAA0Ba,GAAG,GAC3C2B,OAAA,CAAQQ,GAAA,CAAIJ,GAAA,EAAK,MAAS;IAC5B,CAAC,IAELJ,OAAA,CAAQQ,GAAA,CAAIJ,GAAA,EAAKK,IAAI;EACvB;EAGF,MAAMG,OAAA,GAAUZ,OAAA,CAAQO,GAAA,CAAIH,GAAG;EAE/B,IAAIQ,OAAA,YAAmBF,OAAA,EACrB,MAAME,OAAA;EAGR,OAAOA,OAAA;AACT","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import { useEffect, useRef } from "react";
2
- import { useActiveParams, useParams, usePathname } from "./hooks.native.js";
1
+ import { useCallback, useSyncExternalStore } from "react";
2
+ import { useParams, usePathname } from "./hooks.native.js";
3
3
  import { resolveHref } from "./link/href.native.js";
4
4
  import { preloadingLoader } from "./router/router.native.js";
5
5
  import { getLoaderPath } from "./utils/cleanUrl.native.js";
@@ -9,70 +9,164 @@ import { useServerContext } from "./vite/one-server-only.native.js";
9
9
  function _instanceof(left, right) {
10
10
  return right != null && typeof Symbol < "u" && right[Symbol.hasInstance] ? !!right[Symbol.hasInstance](left) : left instanceof right;
11
11
  }
12
- var promises = {},
13
- errors = {},
14
- loadedData = {};
15
- function useLoader(loader) {
16
- var {
17
- loaderProps: loaderPropsFromServerContext,
18
- loaderData: loaderDataFromServerContext
19
- } = useServerContext() || {};
20
- if (typeof window > "u") return useAsyncFn(loader, loaderPropsFromServerContext || {
21
- path: usePathname(),
22
- params: useActiveParams()
12
+ var loaderState = {},
13
+ subscribers = /* @__PURE__ */new Set();
14
+ function updateState(path, updates) {
15
+ loaderState[path] = {
16
+ ...loaderState[path],
17
+ ...updates
18
+ }, subscribers.forEach(function (callback) {
19
+ callback();
20
+ });
21
+ }
22
+ function subscribe(callback) {
23
+ return subscribers.add(callback), function () {
24
+ return subscribers.delete(callback);
25
+ };
26
+ }
27
+ function getLoaderState(path, preloadedData2) {
28
+ return loaderState[path] || (loaderState[path] = {
29
+ data: preloadedData2,
30
+ error: void 0,
31
+ promise: void 0,
32
+ state: "idle",
33
+ hasLoadedOnce: !!preloadedData2
34
+ }), loaderState[path];
35
+ }
36
+ async function refetchLoader(pathname2) {
37
+ updateState(pathname2, {
38
+ state: "loading",
39
+ error: null
23
40
  });
24
- var params = useParams(),
41
+ try {
42
+ var cacheBust = `${Date.now()}`,
43
+ loaderJSUrl2 = getLoaderPath(pathname2, !0, cacheBust),
44
+ module2 = await dynamicImport(loaderJSUrl2),
45
+ result2 = await module2.loader();
46
+ updateState(pathname2, {
47
+ data: result2,
48
+ state: "idle",
49
+ timestamp: Date.now(),
50
+ hasLoadedOnce: !0
51
+ });
52
+ } catch (err) {
53
+ throw updateState(pathname2, {
54
+ error: err,
55
+ state: "idle"
56
+ }), err;
57
+ }
58
+ }
59
+ function useLoaderState(loader) {
60
+ var {
61
+ loaderProps: loaderPropsFromServerContext,
62
+ loaderData: loaderDataFromServerContext
63
+ } = useServerContext() || {},
64
+ params = useParams(),
25
65
  pathname = usePathname(),
26
66
  currentPath = resolveHref({
27
67
  pathname,
28
68
  params
29
- }).replace(/index$/, "").replace(/\?.*/, ""),
30
- preloadedData = loaderPropsFromServerContext?.path === currentPath ? loaderDataFromServerContext : void 0,
31
- currentData = useRef(preloadedData);
32
- if (useEffect(function () {
33
- preloadedData && (loadedData[currentPath] = preloadedData);
34
- },
35
- // eslint-disable-next-line react-hooks/exhaustive-deps
36
- [preloadedData]), errors[currentPath]) throw errors[currentPath];
37
- var loaded = loadedData[currentPath];
38
- if (typeof loaded < "u") return loaded;
39
- if (!preloadedData) {
40
- if (preloadingLoader[currentPath] && (typeof preloadingLoader[currentPath] == "function" && (preloadingLoader[currentPath] = preloadingLoader[currentPath]()), promises[currentPath] = preloadingLoader[currentPath].then(function (val) {
41
- loadedData[currentPath] = val;
69
+ }).replace(/index$/, "");
70
+ if (typeof window > "u" && loader) {
71
+ var serverData = useAsyncFn(loader, loaderPropsFromServerContext || {
72
+ path: pathname,
73
+ params
74
+ });
75
+ return {
76
+ data: serverData,
77
+ refetch: async function () {},
78
+ state: "idle"
79
+ };
80
+ }
81
+ var preloadedData = loaderPropsFromServerContext?.path === currentPath ? loaderDataFromServerContext : void 0,
82
+ loaderStateEntry = useSyncExternalStore(subscribe, function () {
83
+ return getLoaderState(currentPath, preloadedData);
84
+ }, function () {
85
+ return getLoaderState(currentPath, preloadedData);
86
+ }),
87
+ refetch = useCallback(function () {
88
+ return refetchLoader(currentPath);
89
+ }, [currentPath]);
90
+ if (!loader) return {
91
+ refetch,
92
+ state: loaderStateEntry.state
93
+ };
94
+ if (!loaderStateEntry.data && !loaderStateEntry.promise && !loaderStateEntry.hasLoadedOnce && loader) if (preloadingLoader[currentPath]) {
95
+ typeof preloadingLoader[currentPath] == "function" && (preloadingLoader[currentPath] = preloadingLoader[currentPath]());
96
+ var promise = preloadingLoader[currentPath].then(function (val) {
97
+ delete preloadingLoader[currentPath], updateState(currentPath, {
98
+ data: val,
99
+ hasLoadedOnce: !0,
100
+ promise: void 0
101
+ });
42
102
  }).catch(function (err) {
43
- console.error("Error loading loader", err), errors[currentPath] = err, delete promises[currentPath], delete preloadingLoader[currentPath];
44
- })), !promises[currentPath]) {
45
- var getData = async function () {
46
- var loaderJSUrl = getLoaderPath(currentPath, !0);
103
+ console.error("Error running loader()", err), delete preloadingLoader[currentPath], updateState(currentPath, {
104
+ error: err,
105
+ promise: void 0
106
+ });
107
+ });
108
+ loaderStateEntry.promise = promise;
109
+ } else {
110
+ var loadData = async function () {
47
111
  try {
48
- var response = await async function () {
49
- var nativeLoaderJSUrl = `${loaderJSUrl}?platform=ios`;
50
- try {
51
- var loaderJsCodeResp = await fetch(nativeLoaderJSUrl);
52
- if (!loaderJsCodeResp.ok) throw new Error(`Response not ok: ${loaderJsCodeResp.status}`);
53
- var loaderJsCode = await loaderJsCodeResp.text(),
54
- result = eval(`() => { var exports = {}; ${loaderJsCode}; return exports; }`)();
55
- if (typeof result.loader != "function") throw new Error("Loader code isn't exporting a `loader` function");
56
- return result;
57
- } catch (e) {
58
- return console.error(`Error fetching loader from URL: ${nativeLoaderJSUrl}, ${e}`), {
59
- loader: function () {
60
- return {};
61
- }
62
- };
63
- }
64
- return await dynamicImport(loaderJSUrl);
65
- }();
66
- return loadedData[currentPath] = response.loader(), loadedData[currentPath];
112
+ var loaderJSUrl = getLoaderPath(currentPath, !0),
113
+ nativeLoaderJSUrl = `${loaderJSUrl}?platform=ios`;
114
+ try {
115
+ var loaderJsCodeResp = await fetch(nativeLoaderJSUrl);
116
+ if (!loaderJsCodeResp.ok) throw new Error(`Response not ok: ${loaderJsCodeResp.status}`);
117
+ var loaderJsCode = await loaderJsCodeResp.text(),
118
+ result = eval(`() => { var exports = {}; ${loaderJsCode}; return exports; }`)();
119
+ if (typeof result.loader != "function") throw new Error("Loader code isn't exporting a `loader` function");
120
+ var data = await result.loader();
121
+ updateState(currentPath, {
122
+ data,
123
+ hasLoadedOnce: !0,
124
+ promise: void 0
125
+ });
126
+ return;
127
+ } catch (e) {
128
+ updateState(currentPath, {
129
+ data: {},
130
+ promise: void 0
131
+ });
132
+ return;
133
+ }
134
+ var loaderJSUrl = getLoaderPath(currentPath, !0),
135
+ module = await dynamicImport(loaderJSUrl),
136
+ result = await module.loader();
137
+ updateState(currentPath, {
138
+ data: result,
139
+ hasLoadedOnce: !0,
140
+ promise: void 0
141
+ });
67
142
  } catch (err) {
68
- return console.error(`Error calling loader: ${err}`), errors[currentPath] = err, delete promises[currentPath], null;
143
+ updateState(currentPath, {
144
+ error: err,
145
+ promise: void 0
146
+ });
69
147
  }
70
- };
71
- promises[currentPath] = getData();
72
- }
73
- throw promises[currentPath];
148
+ },
149
+ promise = loadData();
150
+ loaderStateEntry.promise = promise;
74
151
  }
75
- return currentData.current;
152
+ if (loader) {
153
+ if (loaderStateEntry.error && !loaderStateEntry.hasLoadedOnce) throw loaderStateEntry.error;
154
+ if (loaderStateEntry.data === void 0 && loaderStateEntry.promise && !loaderStateEntry.hasLoadedOnce) throw loaderStateEntry.promise;
155
+ return {
156
+ data: loaderStateEntry.data,
157
+ refetch,
158
+ state: loaderStateEntry.state
159
+ };
160
+ } else return {
161
+ refetch,
162
+ state: loaderStateEntry.state
163
+ };
164
+ }
165
+ function useLoader(loader2) {
166
+ var {
167
+ data: data2
168
+ } = useLoaderState(loader2);
169
+ return data2;
76
170
  }
77
171
  var results = /* @__PURE__ */new Map(),
78
172
  started = /* @__PURE__ */new Map();
@@ -91,5 +185,5 @@ function useAsyncFn(val, props) {
91
185
  if (_instanceof(current, Promise)) throw current;
92
186
  return current;
93
187
  }
94
- export { useLoader };
188
+ export { refetchLoader, useLoader, useLoaderState };
95
189
  //# sourceMappingURL=useLoader.native.js.map