@quvel-kit/core 1.3.13 → 1.3.15
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.
- package/dist/composables/useSSRData.d.ts +3 -4
- package/dist/composables/useSSRData.d.ts.map +1 -1
- package/dist/composables/useSSRData.js +27 -27
- package/dist/container/ServiceContainer.d.ts +6 -0
- package/dist/container/ServiceContainer.d.ts.map +1 -1
- package/dist/container/ServiceContainer.js +9 -0
- package/package.json +1 -1
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
* Fetches data during SSR, serializes to client, and hydrates on mount.
|
|
5
5
|
* Eliminates the need for a Pinia store per page for SSR data loading.
|
|
6
6
|
*/
|
|
7
|
-
import { type Ref
|
|
7
|
+
import { type Ref } from 'vue';
|
|
8
8
|
/**
|
|
9
9
|
* SSR data loading composable
|
|
10
10
|
*
|
|
11
11
|
* @param key - Unique key for this data (used for serialization)
|
|
12
12
|
* @param fetcher - Async function that fetches the data
|
|
13
|
-
* @returns Reactive data ref
|
|
13
|
+
* @returns Reactive data ref and error state
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* ```typescript
|
|
17
|
-
* const { data: household,
|
|
17
|
+
* const { data: household, error } = useSSRData(
|
|
18
18
|
* `household-${route.params.id}`,
|
|
19
19
|
* () => householdService.get(route.params.id)
|
|
20
20
|
* );
|
|
@@ -22,7 +22,6 @@ import { type Ref, type ComputedRef } from 'vue';
|
|
|
22
22
|
*/
|
|
23
23
|
export declare function useSSRData<T>(key: string, fetcher: () => Promise<T>): {
|
|
24
24
|
data: Ref<T | null>;
|
|
25
|
-
isLoading: ComputedRef<boolean>;
|
|
26
25
|
error: Ref<Error | null>;
|
|
27
26
|
};
|
|
28
27
|
//# sourceMappingURL=useSSRData.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSSRData.d.ts","sourceRoot":"","sources":["../../src/composables/useSSRData.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"useSSRData.d.ts","sourceRoot":"","sources":["../../src/composables/useSSRData.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAMjE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACxB;IACD,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpB,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;CAC1B,CAkDA"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Fetches data during SSR, serializes to client, and hydrates on mount.
|
|
5
5
|
* Eliminates the need for a Pinia store per page for SSR data loading.
|
|
6
6
|
*/
|
|
7
|
-
import { ref,
|
|
7
|
+
import { ref, onMounted, onServerPrefetch } from 'vue';
|
|
8
8
|
import { useQuvel } from './useQuvel.js';
|
|
9
9
|
const SSR_DATA_PREFIX = '__SSR_DATA_';
|
|
10
10
|
const SSR_ERROR_PREFIX = '__SSR_ERROR_';
|
|
@@ -13,11 +13,11 @@ const SSR_ERROR_PREFIX = '__SSR_ERROR_';
|
|
|
13
13
|
*
|
|
14
14
|
* @param key - Unique key for this data (used for serialization)
|
|
15
15
|
* @param fetcher - Async function that fetches the data
|
|
16
|
-
* @returns Reactive data ref
|
|
16
|
+
* @returns Reactive data ref and error state
|
|
17
17
|
*
|
|
18
18
|
* @example
|
|
19
19
|
* ```typescript
|
|
20
|
-
* const { data: household,
|
|
20
|
+
* const { data: household, error } = useSSRData(
|
|
21
21
|
* `household-${route.params.id}`,
|
|
22
22
|
* () => householdService.get(route.params.id)
|
|
23
23
|
* );
|
|
@@ -28,9 +28,24 @@ export function useSSRData(key, fetcher) {
|
|
|
28
28
|
const container = useQuvel();
|
|
29
29
|
const dataKey = `${SSR_DATA_PREFIX}${key}`;
|
|
30
30
|
const errorKey = `${SSR_ERROR_PREFIX}${key}`;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
let initialData = null;
|
|
32
|
+
let initialError = null;
|
|
33
|
+
if (!isSSR) {
|
|
34
|
+
const win = window;
|
|
35
|
+
const ssrData = win[dataKey];
|
|
36
|
+
const ssrError = win[errorKey];
|
|
37
|
+
if (ssrError) {
|
|
38
|
+
initialError = new Error(ssrError.message);
|
|
39
|
+
initialError.name = ssrError.name;
|
|
40
|
+
delete win[errorKey];
|
|
41
|
+
}
|
|
42
|
+
else if (ssrData !== undefined) {
|
|
43
|
+
initialData = ssrData;
|
|
44
|
+
delete win[dataKey];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const data = ref(initialData);
|
|
48
|
+
const error = ref(initialError);
|
|
34
49
|
if (isSSR) {
|
|
35
50
|
onServerPrefetch(async () => {
|
|
36
51
|
try {
|
|
@@ -45,30 +60,15 @@ export function useSSRData(key, fetcher) {
|
|
|
45
60
|
}
|
|
46
61
|
});
|
|
47
62
|
}
|
|
48
|
-
else {
|
|
63
|
+
else if (initialData === null && initialError === null) {
|
|
49
64
|
onMounted(async () => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const ssrError = win[errorKey];
|
|
53
|
-
delete win[dataKey];
|
|
54
|
-
delete win[errorKey];
|
|
55
|
-
if (ssrError) {
|
|
56
|
-
const err = new Error(ssrError.message);
|
|
57
|
-
err.name = ssrError.name;
|
|
58
|
-
error.value = err;
|
|
59
|
-
}
|
|
60
|
-
else if (ssrData !== undefined) {
|
|
61
|
-
data.value = ssrData;
|
|
65
|
+
try {
|
|
66
|
+
data.value = await fetcher();
|
|
62
67
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
data.value = await fetcher();
|
|
66
|
-
}
|
|
67
|
-
catch (e) {
|
|
68
|
-
error.value = e instanceof Error ? e : new Error(String(e));
|
|
69
|
-
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
error.value = e instanceof Error ? e : new Error(String(e));
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
-
return { data,
|
|
73
|
+
return { data, error };
|
|
74
74
|
}
|
|
@@ -35,6 +35,12 @@ export declare class ServiceContainer {
|
|
|
35
35
|
* Only available during SSR
|
|
36
36
|
*/
|
|
37
37
|
get windowBag(): SSRDataBag | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Get an exposed SSR service by name.
|
|
40
|
+
* These are SSR-side services that opted-in via shouldExpose().
|
|
41
|
+
* Only available during SSR.
|
|
42
|
+
*/
|
|
43
|
+
getSSRService<T>(name: string): T | undefined;
|
|
38
44
|
/**
|
|
39
45
|
* Initialize services from their classes with config and SSR context
|
|
40
46
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceContainer.d.ts","sourceRoot":"","sources":["../../src/container/ServiceContainer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,OAAO,EACP,YAAY,EAGb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAC,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAC,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AAGzD;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAL/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;gBAGjB,WAAW,CAAC,GAAE,WAAW,GAAG,IAAI,aAAA,EACjD,cAAc,GAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAa;IAQvD;;OAEG;IACH,IAAI,MAAM,IAAI,SAAS,CAEtB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS,CAE/C;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,UAAU,GAAG,SAAS,CAGtC;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,GAAG,GAAI,CAAC,SAAS,OAAO,EAAE,cAAc,YAAY,CAAC,CAAC,CAAC,KAAG,CAAC,CAkBzD;IAEF;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIzD;;OAEG;IACH,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,UAAQ,GAAG,OAAO;IAgBxF;;OAEG;IACH,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAIrE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUpC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IAEH,IAAI,GAAG,IAAI,UAAU,CAEpB;IAED,IAAI,GAAG,IAAI,UAAU,CAEpB;IAED,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED,IAAI,UAAU,IAAI,iBAAiB,CAElC;IAED,IAAI,IAAI;;;;;;;MAIP;IAED,IAAI,EAAE,IAAI,gBAAgB,CAEzB;IAED,IAAI,KAAK,IAAI,YAAY,CAExB;CACF"}
|
|
1
|
+
{"version":3,"file":"ServiceContainer.d.ts","sourceRoot":"","sources":["../../src/container/ServiceContainer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,OAAO,EACP,YAAY,EAGb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAC,UAAU,EAAC,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAC,WAAW,EAAC,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAC,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AAGzD;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAL/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAwC;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;gBAGjB,WAAW,CAAC,GAAE,WAAW,GAAG,IAAI,aAAA,EACjD,cAAc,GAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAa;IAQvD;;OAEG;IACH,IAAI,MAAM,IAAI,SAAS,CAEtB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,WAAW,GAAG,IAAI,GAAG,SAAS,CAE/C;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,UAAU,GAAG,SAAS,CAGtC;IAED;;;;OAIG;IACH,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAK7C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,GAAG,GAAI,CAAC,SAAS,OAAO,EAAE,cAAc,YAAY,CAAC,CAAC,CAAC,KAAG,CAAC,CAkBzD;IAEF;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIzD;;OAEG;IACH,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,UAAQ,GAAG,OAAO;IAgBxF;;OAEG;IACH,UAAU,CAAC,CAAC,SAAS,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO;IAIrE;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUpC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IAEH,IAAI,GAAG,IAAI,UAAU,CAEpB;IAED,IAAI,GAAG,IAAI,UAAU,CAEpB;IAED,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED,IAAI,UAAU,IAAI,iBAAiB,CAElC;IAED,IAAI,IAAI;;;;;;;MAIP;IAED,IAAI,EAAE,IAAI,gBAAgB,CAEzB;IAED,IAAI,KAAK,IAAI,YAAY,CAExB;CACF"}
|
|
@@ -46,6 +46,15 @@ export class ServiceContainer {
|
|
|
46
46
|
const req = this._ssrContext?.req;
|
|
47
47
|
return req?.quvelContext?.windowBag;
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Get an exposed SSR service by name.
|
|
51
|
+
* These are SSR-side services that opted-in via shouldExpose().
|
|
52
|
+
* Only available during SSR.
|
|
53
|
+
*/
|
|
54
|
+
getSSRService(name) {
|
|
55
|
+
const req = this._ssrContext?.req;
|
|
56
|
+
return req?.quvelContext?.services?.get(name);
|
|
57
|
+
}
|
|
49
58
|
/**
|
|
50
59
|
* Initialize services from their classes with config and SSR context
|
|
51
60
|
*/
|