@c-rex/components 0.1.37 → 0.1.39

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 (146) hide show
  1. package/README.md +73 -73
  2. package/package.json +250 -235
  3. package/src/article/article-action-bar.tsx +110 -110
  4. package/src/article/article-content.tsx +18 -46
  5. package/src/autocomplete.tsx +201 -201
  6. package/src/breadcrumb.tsx +124 -124
  7. package/src/carousel/carousel.tsx +353 -352
  8. package/src/check-article-lang.tsx +47 -43
  9. package/src/directoryNodes/directory-tree-context.tsx +388 -0
  10. package/src/directoryNodes/tree-of-content.tsx +68 -67
  11. package/src/documents/result-list.tsx +124 -127
  12. package/src/favorites/bookmark-button.tsx +97 -79
  13. package/src/favorites/favorite-button.tsx +137 -74
  14. package/src/footer/footer-shell.tsx +52 -0
  15. package/src/footer/footer.tsx +7 -0
  16. package/src/footer/legal-links-block.tsx +25 -0
  17. package/src/footer/organization-contact-block.tsx +94 -0
  18. package/src/footer/social-links-block.tsx +38 -0
  19. package/src/footer/types.ts +10 -0
  20. package/src/footer/vcard-footer.tsx +72 -0
  21. package/src/generated/client-components.tsx +1366 -1350
  22. package/src/generated/create-client-request.tsx +116 -113
  23. package/src/generated/create-server-request.tsx +70 -61
  24. package/src/generated/create-suggestions-request.tsx +55 -55
  25. package/src/generated/server-components.tsx +1056 -1056
  26. package/src/generated/suggestions.tsx +302 -299
  27. package/src/icons/file-icon.tsx +8 -8
  28. package/src/icons/flag-icon.tsx +15 -15
  29. package/src/icons/loading.tsx +11 -11
  30. package/src/icons/social-icon.tsx +24 -0
  31. package/src/info/info-card.tsx +43 -0
  32. package/src/info/{info-table.tsx → information-unit-metadata-grid.tsx} +157 -146
  33. package/src/info/shared.tsx +49 -25
  34. package/src/navbar/language-switcher/content-language-switch.tsx +92 -92
  35. package/src/navbar/language-switcher/shared.tsx +33 -33
  36. package/src/navbar/language-switcher/ui-language-switch.tsx +37 -38
  37. package/src/navbar/navbar.tsx +157 -148
  38. package/src/navbar/settings.tsx +62 -62
  39. package/src/navbar/sign-in-out-btns.tsx +35 -35
  40. package/src/navbar/user-menu.tsx +60 -60
  41. package/src/page-wrapper.tsx +54 -31
  42. package/src/render-article.module.css +155 -0
  43. package/src/render-article.tsx +75 -68
  44. package/src/renditions/file-download.tsx +83 -83
  45. package/src/renditions/html.tsx +64 -64
  46. package/src/renditions/image/container.tsx +54 -54
  47. package/src/renditions/image/rendition.tsx +55 -55
  48. package/src/restriction-menu/restriction-menu-container.tsx +117 -53
  49. package/src/restriction-menu/restriction-menu-item.tsx +155 -147
  50. package/src/restriction-menu/restriction-menu.tsx +341 -157
  51. package/src/results/dialog-filter.tsx +166 -166
  52. package/src/results/empty.tsx +15 -15
  53. package/src/results/filter-navbar.tsx +294 -261
  54. package/src/results/filter-sidebar/__tests__/utils.test.ts +129 -0
  55. package/src/results/filter-sidebar/index.tsx +270 -126
  56. package/src/results/filter-sidebar/utils.ts +196 -164
  57. package/src/results/generic/table-result-list.tsx +97 -99
  58. package/src/results/{table-with-images.tsx → information-unit-search-results-card-list.tsx} +125 -127
  59. package/src/results/{cards.tsx → information-unit-search-results-cards.tsx} +99 -99
  60. package/src/results/{table.tsx → information-unit-search-results-table.tsx} +104 -104
  61. package/src/results/pagination.tsx +81 -81
  62. package/src/results/summary.ts +30 -0
  63. package/src/results/utils.ts +54 -47
  64. package/src/search-input.tsx +70 -70
  65. package/src/share-button.tsx +49 -49
  66. package/src/stores/favorites-store.ts +88 -88
  67. package/src/stores/highlight-store.ts +15 -15
  68. package/src/stores/language-store.ts +14 -43
  69. package/src/stores/restriction-store.ts +11 -11
  70. package/src/stores/search-settings-store.ts +68 -64
  71. package/src/article/article-action-bar.analysis.md +0 -15
  72. package/src/article/article-action-bar.stories.tsx +0 -15
  73. package/src/article/article-content.analysis.md +0 -15
  74. package/src/article/article-content.stories.tsx +0 -21
  75. package/src/autocomplete.analysis.md +0 -17
  76. package/src/breadcrumb.analysis.md +0 -15
  77. package/src/carousel/carousel.analysis.md +0 -17
  78. package/src/check-article-lang.analysis.md +0 -15
  79. package/src/directoryNodes/tree-of-content.analysis.md +0 -14
  80. package/src/directoryNodes/tree-of-content.stories.tsx +0 -22
  81. package/src/documents/result-list.analysis.md +0 -14
  82. package/src/documents/result-list.stories.tsx +0 -19
  83. package/src/favorites/bookmark-button.analysis.md +0 -17
  84. package/src/favorites/bookmark-button.stories.tsx +0 -19
  85. package/src/favorites/favorite-button.analysis.md +0 -18
  86. package/src/favorites/favorite-button.stories.tsx +0 -22
  87. package/src/icons/file-icon.analysis.md +0 -14
  88. package/src/icons/file-icon.stories.tsx +0 -19
  89. package/src/icons/flag-icon.analysis.md +0 -14
  90. package/src/icons/flag-icon.stories.tsx +0 -25
  91. package/src/icons/loading.analysis.md +0 -14
  92. package/src/icons/loading.stories.tsx +0 -21
  93. package/src/info/info-table.analysis.md +0 -15
  94. package/src/info/shared.analysis.md +0 -14
  95. package/src/info/stories/info-table.stories.tsx +0 -31
  96. package/src/info/stories/shared.stories.tsx +0 -24
  97. package/src/navbar/language-switcher/content-language-switch.analysis.md +0 -15
  98. package/src/navbar/language-switcher/shared.analysis.md +0 -14
  99. package/src/navbar/language-switcher/ui-language-switch.analysis.md +0 -15
  100. package/src/navbar/navbar.analysis.md +0 -14
  101. package/src/navbar/settings.analysis.md +0 -14
  102. package/src/navbar/sign-in-out-btns.analysis.md +0 -14
  103. package/src/navbar/stories/navbar.stories.tsx +0 -31
  104. package/src/navbar/stories/settings.stories.tsx +0 -15
  105. package/src/navbar/stories/sign-in-out-btns.stories.tsx +0 -15
  106. package/src/navbar/stories/user-menu.stories.tsx +0 -20
  107. package/src/navbar/user-menu.analysis.md +0 -14
  108. package/src/page-wrapper.analysis.md +0 -14
  109. package/src/render-article.analysis.md +0 -15
  110. package/src/renditions/file-download.analysis.md +0 -14
  111. package/src/renditions/file-download.stories.tsx +0 -19
  112. package/src/renditions/html.analysis.md +0 -17
  113. package/src/renditions/html.stories.tsx +0 -19
  114. package/src/renditions/image/container.analysis.md +0 -15
  115. package/src/renditions/image/container.stories.tsx +0 -19
  116. package/src/renditions/image/rendition.analysis.md +0 -14
  117. package/src/renditions/image/rendition.stories.tsx +0 -19
  118. package/src/restriction-menu/restriction-menu-container.analysis.md +0 -14
  119. package/src/restriction-menu/restriction-menu-item.analysis.md +0 -14
  120. package/src/restriction-menu/restriction-menu.analysis.md +0 -17
  121. package/src/results/analysis/cards.analysis.md +0 -14
  122. package/src/results/analysis/dialog-filter.analysis.md +0 -17
  123. package/src/results/analysis/empty.analysis.md +0 -14
  124. package/src/results/analysis/filter-navbar.analysis.md +0 -16
  125. package/src/results/analysis/pagination.analysis.md +0 -14
  126. package/src/results/analysis/table-with-images.analysis.md +0 -15
  127. package/src/results/analysis/table.analysis.md +0 -15
  128. package/src/results/filter-sidebar/index.analysis.md +0 -14
  129. package/src/results/generic/table-result-list.analysis.md +0 -15
  130. package/src/results/generic/table-result-list.stories.tsx +0 -21
  131. package/src/results/stories/cards.stories.tsx +0 -66
  132. package/src/results/stories/dialog-filter.stories.tsx +0 -20
  133. package/src/results/stories/empty.stories.tsx +0 -25
  134. package/src/results/stories/filter-navbar.stories.tsx +0 -19
  135. package/src/results/stories/filter-sidebar.stories.tsx +0 -20
  136. package/src/results/stories/pagination.stories.tsx +0 -24
  137. package/src/results/stories/table-with-images.stories.tsx +0 -19
  138. package/src/results/stories/table.stories.tsx +0 -78
  139. package/src/search-input.analysis.md +0 -15
  140. package/src/share-button.analysis.md +0 -19
  141. package/src/stories/autocomplete.stories.tsx +0 -20
  142. package/src/stories/breadcrumb.stories.tsx +0 -93
  143. package/src/stories/check-article-lang.stories.tsx +0 -22
  144. package/src/stories/render-article.stories.tsx +0 -19
  145. package/src/stories/search-input.stories.tsx +0 -21
  146. package/src/stories/share-button.stories.tsx +0 -15
@@ -1,113 +1,116 @@
1
- /**
2
- * Auto-generated from OpenAPI spec (Client-Side)
3
- * Source: https://staging.c-rex.net/ids/api/swagger/v1/swagger.json
4
- * Generated: 2025-12-11T16:23:03.635Z
5
- * Do not edit manually
6
- */
7
-
8
- "use client";
9
-
10
- import { useState, useEffect, useCallback, useMemo } from 'react';
11
- import { replacePathParams, call } from "@c-rex/utils"
12
-
13
- type SerializedError = {
14
- message: string;
15
- name: string;
16
- };
17
-
18
- export type DataRequestRenderProps<T> = {
19
- data: T | null;
20
- error: SerializedError | null;
21
- isLoading: boolean;
22
- };
23
-
24
- export type FetchState<T> = {
25
- data: T | null;
26
- error: Error | null;
27
- };
28
-
29
- export function createClientDataRequest<T, PathParams, QueryParams>(
30
- endpointTemplate: string
31
- ) {
32
- return function DataRequest(
33
- pathParams?: PathParams,
34
- queryParams?: QueryParams,
35
- ) {
36
-
37
- const [state, setState] = useState<DataRequestRenderProps<T>>({
38
- data: null,
39
- error: null,
40
- isLoading: true,
41
- });
42
-
43
- const pathParamsKey = useMemo(
44
- () => JSON.stringify(pathParams ?? {}),
45
- [pathParams]
46
- );
47
- const queryParamsKey = useMemo(
48
- () => JSON.stringify(queryParams ?? {}),
49
- [queryParams]
50
- );
51
-
52
- const fetchData = useCallback(async () => {
53
- setState((prev) => ({
54
- ...prev,
55
- error: null,
56
- isLoading: true,
57
- }));
58
-
59
- try {
60
- const url = replacePathParams(endpointTemplate, pathParams as Record<string, string>);
61
- const data = await call<T>("CrexApi.execute", {
62
- url,
63
- method: "get",
64
- params: queryParams as Record<string, string | number | boolean | (string | number | boolean)[] | undefined>,
65
- });
66
-
67
- setState({
68
- data,
69
- error: null,
70
- isLoading: false,
71
- });
72
- } catch (error) {
73
- setState({
74
- data: null,
75
- error: error instanceof Error ? error : new Error('Unknown error'),
76
- isLoading: false,
77
- });
78
- }
79
- }, [endpointTemplate, pathParamsKey, queryParamsKey]);
80
-
81
-
82
- // Initial fetch
83
- useEffect(() => {
84
- fetchData();
85
- }, [fetchData]);
86
-
87
- return state;
88
- };
89
- }
90
-
91
- export type ClientDataRequestProps<T, PathParams, QueryParams> = {
92
- pathParams?: PathParams;
93
- queryParams?: QueryParams;
94
- children: (result: DataRequestRenderProps<T>) => React.ReactNode;
95
- };
96
-
97
- /**
98
- * Create a render-prop component for client-side data fetching
99
- */
100
- export function createClientDataRequestComponent<T, PathParams, QueryParams>(
101
- endpointTemplate: string
102
- ) {
103
- const useDataRequest = createClientDataRequest<T, PathParams, QueryParams>(endpointTemplate);
104
-
105
- return function ClientDataRequest({
106
- pathParams,
107
- queryParams,
108
- children,
109
- }: ClientDataRequestProps<T, PathParams, QueryParams>) {
110
- const result = useDataRequest(pathParams, queryParams);
111
- return <>{children(result)}</>;
112
- };
113
- }
1
+ /**
2
+ * Auto-generated from OpenAPI spec (Client-Side)
3
+ * Source: https://staging.c-rex.net/ids/api/swagger/v1/swagger.json
4
+ * Generated: 2025-12-11T16:23:03.635Z
5
+ * Do not edit manually
6
+ */
7
+
8
+ "use client";
9
+
10
+ import { useState, useEffect, useCallback, useMemo } from 'react';
11
+ import { replacePathParams, call } from "@c-rex/utils"
12
+
13
+ type SerializedError = {
14
+ message: string;
15
+ name: string;
16
+ };
17
+
18
+ export type DataRequestRenderProps<T> = {
19
+ data: T | null;
20
+ error: SerializedError | null;
21
+ isLoading: boolean;
22
+ };
23
+
24
+ export type FetchState<T> = {
25
+ data: T | null;
26
+ error: Error | null;
27
+ };
28
+
29
+ export function createClientDataRequest<T, PathParams, QueryParams>(
30
+ endpointTemplate: string
31
+ ) {
32
+ return function DataRequest(
33
+ pathParams?: PathParams,
34
+ queryParams?: QueryParams,
35
+ ) {
36
+
37
+ const [state, setState] = useState<DataRequestRenderProps<T>>({
38
+ data: null,
39
+ error: null,
40
+ isLoading: true,
41
+ });
42
+
43
+ const pathParamsKey = useMemo(
44
+ () => JSON.stringify(pathParams ?? {}),
45
+ [pathParams]
46
+ );
47
+ const queryParamsKey = useMemo(
48
+ () => JSON.stringify(queryParams ?? {}),
49
+ [queryParams]
50
+ );
51
+
52
+ const fetchData = useCallback(async () => {
53
+ setState((prev) => ({
54
+ ...prev,
55
+ error: null,
56
+ isLoading: true,
57
+ }));
58
+
59
+ try {
60
+ const url = replacePathParams(endpointTemplate, pathParams as Record<string, string>);
61
+ const data = await call<T>("CrexApi.execute", {
62
+ url,
63
+ method: "get",
64
+ params: queryParams as Record<string, string | number | boolean | (string | number | boolean)[] | undefined>,
65
+ });
66
+
67
+ setState({
68
+ data,
69
+ error: null,
70
+ isLoading: false,
71
+ });
72
+ } catch (error) {
73
+ const serializedError = error instanceof Error ? error : new Error('Unknown error');
74
+ const resolvedEndpoint = replacePathParams(endpointTemplate, pathParams as Record<string, string>);
75
+ console.error(`[ClientDataRequest] Failed endpoint "${resolvedEndpoint}": ${serializedError.message}`);
76
+ setState({
77
+ data: null,
78
+ error: serializedError,
79
+ isLoading: false,
80
+ });
81
+ }
82
+ }, [endpointTemplate, pathParamsKey, queryParamsKey]);
83
+
84
+
85
+ // Initial fetch
86
+ useEffect(() => {
87
+ fetchData();
88
+ }, [fetchData]);
89
+
90
+ return state;
91
+ };
92
+ }
93
+
94
+ export type ClientDataRequestProps<T, PathParams, QueryParams> = {
95
+ pathParams?: PathParams;
96
+ queryParams?: QueryParams;
97
+ children: (result: DataRequestRenderProps<T>) => React.ReactNode;
98
+ };
99
+
100
+ /**
101
+ * Create a render-prop component for client-side data fetching
102
+ */
103
+ export function createClientDataRequestComponent<T, PathParams, QueryParams>(
104
+ endpointTemplate: string
105
+ ) {
106
+ const useDataRequest = createClientDataRequest<T, PathParams, QueryParams>(endpointTemplate);
107
+
108
+ return function ClientDataRequest({
109
+ pathParams,
110
+ queryParams,
111
+ children,
112
+ }: ClientDataRequestProps<T, PathParams, QueryParams>) {
113
+ const result = useDataRequest(pathParams, queryParams);
114
+ return <>{children(result)}</>;
115
+ };
116
+ }
@@ -1,61 +1,70 @@
1
- import { CrexApi } from '@c-rex/core/requests';
2
- import { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from '@c-rex/constants';
3
-
4
- type SerializedError = {
5
- message: string;
6
- name: string;
7
- };
8
-
9
- export type DataRequestRenderProps<T> = {
10
- data: T;
11
- error?: SerializedError;
12
- };
13
-
14
- type DataRequestProps<T, PathParams, QueryParams> = {
15
- pathParams?: PathParams;
16
- queryParams?: QueryParams;
17
- render: (data: T, error?: SerializedError) => any; // any because it can return JSX, async functions, etc.
18
- };
19
-
20
-
21
- export function createDataRequestWithParams<T, PathParams, QueryParams>(
22
- endpointTemplate: string
23
- ) {
24
- return async function DataRequest({
25
- pathParams,
26
- queryParams = {} as QueryParams,
27
- render,
28
- }: DataRequestProps<T, PathParams, QueryParams>): Promise<any> {
29
- let endpoint = endpointTemplate;
30
- if (pathParams) {
31
- endpoint = Object.entries(pathParams as Record<string, string>).reduce(
32
- (url, [key, value]) => url.replace(`{${key}}`, encodeURIComponent(value)),
33
- endpointTemplate
34
- );
35
- }
36
-
37
- const params = {
38
- PageNumber: 1,
39
- PageSize: 12,
40
- Wildcard: WILD_CARD_OPTIONS.BOTH,
41
- QueryOperator: OPERATOR_OPTIONS.OR,
42
- ...queryParams,
43
- } as Record<string, string | number | boolean | (string | number | boolean)[] | undefined>;
44
-
45
- try {
46
- const api = new CrexApi();
47
- const data = await api.execute<T>({
48
- url: endpoint,
49
- method: 'GET',
50
- params,
51
- });
52
- return render(data);
53
- } catch (error) {
54
- const serializedError: SerializedError = {
55
- message: error instanceof Error ? error.message : 'Unknown error',
56
- name: error instanceof Error ? error.name : 'Error',
57
- };
58
- return render({} as T, serializedError);
59
- }
60
- };
61
- }
1
+ import { CrexApi } from '@c-rex/core/requests';
2
+ import { OPERATOR_OPTIONS, WILD_CARD_OPTIONS } from '@c-rex/constants';
3
+
4
+ type SerializedError = {
5
+ message: string;
6
+ name: string;
7
+ };
8
+
9
+ export type DataRequestRenderProps<T> = {
10
+ data: T;
11
+ error?: SerializedError;
12
+ };
13
+
14
+ type DataRequestProps<T, PathParams, QueryParams> = {
15
+ pathParams?: PathParams;
16
+ queryParams?: QueryParams;
17
+ render: (data: T, error?: SerializedError) => any; // any because it can return JSX, async functions, etc.
18
+ };
19
+
20
+
21
+ export function createDataRequestWithParams<T, PathParams, QueryParams>(
22
+ endpointTemplate: string
23
+ ) {
24
+ return async function DataRequest({
25
+ pathParams,
26
+ queryParams,
27
+ render,
28
+ }: DataRequestProps<T, PathParams, QueryParams>): Promise<any> {
29
+ let endpoint = endpointTemplate;
30
+ if (pathParams) {
31
+ endpoint = Object.entries(pathParams as Record<string, string>).reduce(
32
+ (url, [key, value]) => url.replace(`{${key}}`, encodeURIComponent(value)),
33
+ endpointTemplate
34
+ );
35
+ }
36
+
37
+ const isGetByIdEndpoint = endpointTemplate.includes("{id}");
38
+ const hasQueryParams = queryParams !== undefined;
39
+ const normalizedQueryParams =
40
+ queryParams as unknown as Record<string, string | number | boolean | (string | number | boolean)[] | undefined>;
41
+
42
+ const params = isGetByIdEndpoint
43
+ ? (hasQueryParams ? normalizedQueryParams : undefined)
44
+ : ({
45
+ PageNumber: 1,
46
+ PageSize: 12,
47
+ Wildcard: WILD_CARD_OPTIONS.BOTH,
48
+ QueryOperator: OPERATOR_OPTIONS.OR,
49
+ ...normalizedQueryParams,
50
+ } as Record<string, string | number | boolean | (string | number | boolean)[] | undefined>);
51
+
52
+ try {
53
+ const api = new CrexApi();
54
+ const data = await api.execute<T>({
55
+ url: endpoint,
56
+ method: 'GET',
57
+ params,
58
+ });
59
+ return render(data);
60
+ } catch (error) {
61
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
62
+ console.error(`[ServerDataRequest] Failed endpoint "${endpoint}": ${errorMessage}`);
63
+ const serializedError: SerializedError = {
64
+ message: errorMessage,
65
+ name: error instanceof Error ? error.name : 'Error',
66
+ };
67
+ return render({} as T, serializedError);
68
+ }
69
+ };
70
+ }
@@ -1,56 +1,56 @@
1
- "use client";
2
-
3
- import { AutocompleteSuggestion, SuggestionQueryParams } from '@c-rex/interfaces';
4
- import { call } from '@c-rex/utils';
5
-
6
- type SerializedError = {
7
- message: string;
8
- name: string;
9
- };
10
-
11
- type SuggestionRequestProps = {
12
- prefix: string;
13
- queryParams?: SuggestionQueryParams;
14
- endpoint: string;
15
- };
16
-
17
- export const suggestionRequest = async ({
18
- endpoint,
19
- prefix,
20
- queryParams = {}
21
- }: SuggestionRequestProps): Promise<{ data: string[], error?: SerializedError }> => {
22
- try {
23
- const data = await call<AutocompleteSuggestion>("CrexApi.execute", {
24
- url: endpoint,
25
- method: "get",
26
- params: {
27
- Prefix: prefix,
28
- ...queryParams
29
- },
30
- });
31
-
32
- const suggestions: string[] = [];
33
- const comparableList: string[] = [];
34
-
35
- if (data.suggestions) {
36
- data.suggestions.forEach((item) => {
37
- suggestions.push(item.value);
38
- comparableList.push(item.value.toLowerCase());
39
- });
40
- }
41
-
42
- // Add query to beginning if not already in suggestions
43
- if (!comparableList.includes(prefix.toLowerCase())) {
44
- return { data: [prefix, ...suggestions] };
45
- }
46
-
47
- return { data: suggestions };
48
-
49
- } catch (error) {
50
- const serializedError: SerializedError = {
51
- message: error instanceof Error ? error.message : 'Unknown error',
52
- name: error instanceof Error ? error.name : 'Error',
53
- };
54
- return { data: [], error: serializedError };
55
- }
1
+ "use client";
2
+
3
+ import { AutocompleteSuggestion, SuggestionQueryParams } from '@c-rex/interfaces';
4
+ import { call } from '@c-rex/utils';
5
+
6
+ type SerializedError = {
7
+ message: string;
8
+ name: string;
9
+ };
10
+
11
+ type SuggestionRequestProps = {
12
+ prefix: string;
13
+ queryParams?: SuggestionQueryParams;
14
+ endpoint: string;
15
+ };
16
+
17
+ export const suggestionRequest = async ({
18
+ endpoint,
19
+ prefix,
20
+ queryParams = {}
21
+ }: SuggestionRequestProps): Promise<{ data: string[], error?: SerializedError }> => {
22
+ try {
23
+ const data = await call<AutocompleteSuggestion>("CrexApi.execute", {
24
+ url: endpoint,
25
+ method: "get",
26
+ params: {
27
+ Prefix: prefix,
28
+ ...queryParams
29
+ },
30
+ });
31
+
32
+ const suggestions: string[] = [];
33
+ const comparableList: string[] = [];
34
+
35
+ if (data.suggestions) {
36
+ data.suggestions.forEach((item) => {
37
+ suggestions.push(item.value);
38
+ comparableList.push(item.value.toLowerCase());
39
+ });
40
+ }
41
+
42
+ // Add query to beginning if not already in suggestions
43
+ if (!comparableList.includes(prefix.toLowerCase())) {
44
+ return { data: [prefix, ...suggestions] };
45
+ }
46
+
47
+ return { data: suggestions };
48
+
49
+ } catch (error) {
50
+ const serializedError: SerializedError = {
51
+ message: error instanceof Error ? error.message : 'Unknown error',
52
+ name: error instanceof Error ? error.name : 'Error',
53
+ };
54
+ return { data: [], error: serializedError };
55
+ }
56
56
  };