@rubixstudios/payload-typesense 1.1.7 → 1.2.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.
- package/dist/components/HeadlessSearchInput.d.ts +1 -2
- package/dist/components/HeadlessSearchInput.d.ts.map +1 -1
- package/dist/components/HeadlessSearchInput.js +33 -300
- package/dist/components/render/Header.d.ts +9 -0
- package/dist/components/render/Header.d.ts.map +1 -0
- package/dist/components/render/Header.js +39 -0
- package/dist/components/render/NoResults.d.ts +9 -0
- package/dist/components/render/NoResults.d.ts.map +1 -0
- package/dist/components/render/NoResults.js +45 -0
- package/dist/components/render/ResultError.d.ts +9 -0
- package/dist/components/render/ResultError.d.ts.map +1 -0
- package/dist/components/render/ResultError.js +38 -0
- package/dist/components/render/Results.d.ts +14 -0
- package/dist/components/render/Results.d.ts.map +1 -0
- package/dist/components/render/Results.js +143 -0
- package/dist/components/render/index.d.ts +5 -0
- package/dist/components/render/index.d.ts.map +1 -0
- package/dist/components/render/index.js +4 -0
- package/dist/components/themes/hooks.d.ts +1 -1
- package/dist/components/themes/hooks.d.ts.map +1 -1
- package/dist/components/themes/hooks.js +0 -1
- package/dist/components/themes/utils.d.ts +2 -10
- package/dist/components/themes/utils.d.ts.map +1 -1
- package/dist/components/themes/utils.js +13 -18
- package/dist/endpoints/handler/createAdvancedSearch.d.ts +1 -1
- package/dist/endpoints/handler/createCollections.d.ts +1 -1
- package/dist/endpoints/handler/createSearch.d.ts +1 -1
- package/dist/endpoints/handler/createSearch.d.ts.map +1 -1
- package/dist/endpoints/handler/createSuggest.d.ts +1 -1
- package/dist/endpoints/health.d.ts +1 -1
- package/dist/endpoints/health.d.ts.map +1 -1
- package/dist/endpoints/search.d.ts +1 -1
- package/dist/index.d.ts +3 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -29
- package/dist/lib/client.d.ts +1 -1
- package/dist/lib/headlessSearch.d.ts +1 -9
- package/dist/lib/headlessSearch.d.ts.map +1 -1
- package/dist/lib/hooks.d.ts +1 -1
- package/dist/lib/initialization.d.ts +2 -2
- package/dist/lib/initialization.d.ts.map +1 -1
- package/dist/lib/initialization.js +47 -35
- package/dist/lib/schema-mapper.d.ts +1 -2
- package/dist/lib/schema-mapper.d.ts.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/utils/getAllCollections.d.ts +1 -1
- package/dist/utils/getAllCollections.d.ts.map +1 -1
- package/package.json +2 -3
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export function RenderedResult({ index, onResultClick, renderDate = true, result, resultItemClassName = '', resultsContainerClassName = '', themeConfig }) {
|
|
2
|
+
return /*#__PURE__*/ React.createElement("div", {
|
|
3
|
+
className: resultsContainerClassName,
|
|
4
|
+
style: {
|
|
5
|
+
backgroundColor: themeConfig.theme.colors.resultBackground,
|
|
6
|
+
borderBottom: `1px solid ${themeConfig.theme.colors.resultBorder}`,
|
|
7
|
+
cursor: 'pointer',
|
|
8
|
+
padding: themeConfig.theme.spacing.itemPadding,
|
|
9
|
+
transition: themeConfig.config.enableAnimations !== false ? `all ${themeConfig.theme.animations.transitionFast} ${themeConfig.theme.animations.easeInOut}` : 'none'
|
|
10
|
+
}
|
|
11
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
12
|
+
className: `${themeConfig.classes.resultItem} ${resultItemClassName}`,
|
|
13
|
+
"data-result-item": true,
|
|
14
|
+
key: result.document?.id || result.id || index,
|
|
15
|
+
onBlur: (e)=>{
|
|
16
|
+
e.currentTarget.style.backgroundColor = themeConfig.theme.colors.resultBackground;
|
|
17
|
+
},
|
|
18
|
+
onClick: ()=>onResultClick(result),
|
|
19
|
+
onFocus: (e)=>{
|
|
20
|
+
e.currentTarget.style.backgroundColor = themeConfig.theme.colors.resultBackgroundFocus;
|
|
21
|
+
},
|
|
22
|
+
onKeyDown: (e)=>{
|
|
23
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
24
|
+
e.preventDefault();
|
|
25
|
+
onResultClick(result);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
onMouseEnter: (e)=>{
|
|
29
|
+
e.currentTarget.style.backgroundColor = themeConfig.theme.colors.resultBackgroundHover;
|
|
30
|
+
},
|
|
31
|
+
onMouseLeave: (e)=>{
|
|
32
|
+
e.currentTarget.style.backgroundColor = themeConfig.theme.colors.resultBackground;
|
|
33
|
+
},
|
|
34
|
+
role: "button",
|
|
35
|
+
tabIndex: 0
|
|
36
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
37
|
+
style: {
|
|
38
|
+
alignItems: 'flex-start',
|
|
39
|
+
display: 'flex',
|
|
40
|
+
gap: '12px',
|
|
41
|
+
padding: '6px'
|
|
42
|
+
}
|
|
43
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
44
|
+
style: {
|
|
45
|
+
flexShrink: 0
|
|
46
|
+
}
|
|
47
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
48
|
+
style: {
|
|
49
|
+
alignItems: 'center',
|
|
50
|
+
backgroundColor: themeConfig.theme.colors.collectionBadge,
|
|
51
|
+
borderRadius: themeConfig.theme.spacing.inputBorderRadius,
|
|
52
|
+
color: themeConfig.theme.colors.collectionBadgeText,
|
|
53
|
+
display: 'flex',
|
|
54
|
+
fontSize: '14px',
|
|
55
|
+
fontWeight: themeConfig.theme.typography.fontWeightMedium,
|
|
56
|
+
height: '32px',
|
|
57
|
+
justifyContent: 'center',
|
|
58
|
+
width: '32px'
|
|
59
|
+
}
|
|
60
|
+
}, result.collection?.charAt(0).toUpperCase() || '📄')), /*#__PURE__*/ React.createElement("div", {
|
|
61
|
+
style: {
|
|
62
|
+
flex: 1,
|
|
63
|
+
minWidth: 0
|
|
64
|
+
}
|
|
65
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
66
|
+
style: {
|
|
67
|
+
alignItems: 'center',
|
|
68
|
+
display: 'flex',
|
|
69
|
+
justifyContent: 'space-between',
|
|
70
|
+
marginBottom: '8px'
|
|
71
|
+
}
|
|
72
|
+
}, /*#__PURE__*/ React.createElement("h3", {
|
|
73
|
+
style: {
|
|
74
|
+
color: themeConfig.theme.colors.titleText,
|
|
75
|
+
fontFamily: themeConfig.theme.typography.fontFamily,
|
|
76
|
+
fontSize: themeConfig.theme.typography.fontSizeBase,
|
|
77
|
+
fontWeight: themeConfig.theme.typography.fontWeightSemibold,
|
|
78
|
+
lineHeight: themeConfig.theme.typography.lineHeightTight,
|
|
79
|
+
margin: 0,
|
|
80
|
+
overflow: 'hidden',
|
|
81
|
+
textOverflow: 'ellipsis',
|
|
82
|
+
whiteSpace: 'nowrap'
|
|
83
|
+
}
|
|
84
|
+
}, result.document?.title || result.document?.name || result.title || 'Untitled')), (result.highlight?.title?.snippet || result.highlight?.content?.snippet) && /*#__PURE__*/ React.createElement("div", {
|
|
85
|
+
dangerouslySetInnerHTML: {
|
|
86
|
+
__html: result.highlight?.title?.snippet || result.highlight?.content?.snippet || ''
|
|
87
|
+
},
|
|
88
|
+
style: {
|
|
89
|
+
color: themeConfig.theme.colors.descriptionText,
|
|
90
|
+
display: '-webkit-box',
|
|
91
|
+
fontSize: themeConfig.theme.typography.fontSizeSm,
|
|
92
|
+
fontWeight: themeConfig.theme.typography.fontWeightNormal,
|
|
93
|
+
lineHeight: themeConfig.theme.typography.lineHeightNormal,
|
|
94
|
+
marginTop: '4px',
|
|
95
|
+
overflow: 'hidden',
|
|
96
|
+
WebkitBoxOrient: 'vertical',
|
|
97
|
+
WebkitLineClamp: 2
|
|
98
|
+
}
|
|
99
|
+
}), /*#__PURE__*/ React.createElement("div", {
|
|
100
|
+
style: {
|
|
101
|
+
alignItems: 'center',
|
|
102
|
+
color: themeConfig.theme.colors.metaText,
|
|
103
|
+
display: 'flex',
|
|
104
|
+
fontSize: themeConfig.theme.typography.fontSizeXs,
|
|
105
|
+
gap: '12px',
|
|
106
|
+
marginTop: '8px'
|
|
107
|
+
}
|
|
108
|
+
}, result.collection && /*#__PURE__*/ React.createElement("span", {
|
|
109
|
+
style: {
|
|
110
|
+
alignItems: 'center',
|
|
111
|
+
display: 'inline-flex'
|
|
112
|
+
}
|
|
113
|
+
}, /*#__PURE__*/ React.createElement("svg", {
|
|
114
|
+
fill: "currentColor",
|
|
115
|
+
style: {
|
|
116
|
+
height: '12px',
|
|
117
|
+
marginRight: '4px',
|
|
118
|
+
width: '12px'
|
|
119
|
+
},
|
|
120
|
+
viewBox: "0 0 20 20"
|
|
121
|
+
}, /*#__PURE__*/ React.createElement("path", {
|
|
122
|
+
clipRule: "evenodd",
|
|
123
|
+
d: "M3 4a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm0 4a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm0 4a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zm0 4a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z",
|
|
124
|
+
fillRule: "evenodd"
|
|
125
|
+
})), result.collection), renderDate && (result.document?.updatedAt || result.updatedAt) && /*#__PURE__*/ React.createElement("span", {
|
|
126
|
+
style: {
|
|
127
|
+
alignItems: 'center',
|
|
128
|
+
display: 'inline-flex'
|
|
129
|
+
}
|
|
130
|
+
}, /*#__PURE__*/ React.createElement("svg", {
|
|
131
|
+
fill: "currentColor",
|
|
132
|
+
style: {
|
|
133
|
+
height: '12px',
|
|
134
|
+
marginRight: '4px',
|
|
135
|
+
width: '12px'
|
|
136
|
+
},
|
|
137
|
+
viewBox: "0 0 20 20"
|
|
138
|
+
}, /*#__PURE__*/ React.createElement("path", {
|
|
139
|
+
clipRule: "evenodd",
|
|
140
|
+
d: "M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z",
|
|
141
|
+
fillRule: "evenodd"
|
|
142
|
+
})), new Date(result.document?.updatedAt || result.updatedAt).toLocaleDateString()))))));
|
|
143
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/render/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Theme, type ThemeConfig, type ThemeContextValue } from './types.js';
|
|
2
2
|
declare const ThemeContext: import("react").Context<ThemeContextValue | null>;
|
|
3
3
|
/**
|
|
4
4
|
* Hook to access theme context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/themes/hooks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/themes/hooks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAUjF,QAAA,MAAM,YAAY,mDAAgD,CAAA;AAElE;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAM5C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAoBrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,WAAW,CA8B1F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,OAAO,GACd,WAAW,CAIb;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAKnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAKrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,CAK3E;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,OAAO,CAQjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM1E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,GAC9B,WAAW,CAOb;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -1,15 +1,7 @@
|
|
|
1
|
-
import type
|
|
2
|
-
/**
|
|
3
|
-
* Get a theme by name or return the default theme
|
|
4
|
-
*/
|
|
1
|
+
import { type Theme, type ThemeClasses, type ThemeConfig } from './types.js';
|
|
5
2
|
export declare function getTheme(themeName: string): Theme;
|
|
6
|
-
/**
|
|
7
|
-
* Merge theme configurations with custom overrides
|
|
8
|
-
*/
|
|
9
3
|
export declare function mergeThemeConfig(config: ThemeConfig): Theme;
|
|
10
|
-
|
|
11
|
-
* Generate CSS classes from theme configuration
|
|
12
|
-
*/
|
|
4
|
+
export declare function css(styles: Record<string, number | Record<string, number | string> | string>): string;
|
|
13
5
|
export declare function generateThemeClasses(theme: Theme, config?: Partial<ThemeConfig>): ThemeClasses;
|
|
14
6
|
/**
|
|
15
7
|
* Apply theme to a CSS class with optional variant
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/themes/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/themes/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAE5E,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAEjD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CA0B3D;AAED,wBAAgB,GAAG,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,GACxE,MAAM,CAgBR;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAChC,YAAY,CAuUd;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAWlF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAMjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgCtE"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { defaultTheme, themes } from './themes.js';
|
|
2
|
-
|
|
3
|
-
* Get a theme by name or return the default theme
|
|
4
|
-
*/ export function getTheme(themeName) {
|
|
2
|
+
export function getTheme(themeName) {
|
|
5
3
|
return themes[themeName] || defaultTheme;
|
|
6
4
|
}
|
|
7
|
-
|
|
8
|
-
* Merge theme configurations with custom overrides
|
|
9
|
-
*/ export function mergeThemeConfig(config) {
|
|
5
|
+
export function mergeThemeConfig(config) {
|
|
10
6
|
const baseTheme = typeof config.theme === 'string' ? getTheme(config.theme) : config.theme;
|
|
11
7
|
return {
|
|
12
8
|
...baseTheme,
|
|
@@ -32,21 +28,20 @@ import { defaultTheme, themes } from './themes.js';
|
|
|
32
28
|
}
|
|
33
29
|
};
|
|
34
30
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
export function css(styles) {
|
|
32
|
+
const toKebab = (key)=>key.replace(/([A-Z])/g, '-$1').toLowerCase();
|
|
33
|
+
const serialize = (obj)=>Object.entries(obj).map(([prop, val])=>`${toKebab(prop)}: ${val}`).join('; ');
|
|
34
|
+
return Object.entries(styles).map(([key, value])=>{
|
|
35
|
+
if (typeof value === 'object' && value !== null) {
|
|
36
|
+
return `${toKebab(key)} { ${serialize(value)} }`;
|
|
37
|
+
}
|
|
38
|
+
return `${toKebab(key)}: ${value}`;
|
|
39
|
+
}).join('; ');
|
|
40
|
+
}
|
|
41
|
+
export function generateThemeClasses(theme, config = {}) {
|
|
38
42
|
const enableAnimations = config.enableAnimations !== false;
|
|
39
43
|
const enableShadows = config.enableShadows !== false;
|
|
40
44
|
const enableRoundedCorners = config.enableRoundedCorners !== false;
|
|
41
|
-
const css = (styles)=>{
|
|
42
|
-
return Object.entries(styles).map(([key, value])=>{
|
|
43
|
-
if (typeof value === 'object' && value !== null) {
|
|
44
|
-
const nested = Object.entries(value).map(([nestedKey, nestedValue])=>`${nestedKey.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${nestedValue}`).join('; ');
|
|
45
|
-
return `${key.replace(/([A-Z])/g, '-$1').toLowerCase()}: { ${nested} }`;
|
|
46
|
-
}
|
|
47
|
-
return `${key.replace(/([A-Z])/g, '-$1').toLowerCase()}: ${value}`;
|
|
48
|
-
}).join('; ');
|
|
49
|
-
};
|
|
50
45
|
const containerStyles = css({
|
|
51
46
|
margin: '0 auto',
|
|
52
47
|
maxWidth: '600px',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
2
|
import { type PayloadHandler } from 'payload';
|
|
3
|
-
import { type TypesenseConfig } from '../../
|
|
3
|
+
import { type TypesenseConfig } from '../../types.js';
|
|
4
4
|
export declare const createAdvancedSearch: (typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig) => PayloadHandler;
|
|
5
5
|
//# sourceMappingURL=createAdvancedSearch.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type PayloadHandler } from 'payload';
|
|
2
|
-
import { type TypesenseConfig } from '../../
|
|
2
|
+
import { type TypesenseConfig } from '../../types.js';
|
|
3
3
|
export declare const createCollections: (pluginOptions: TypesenseConfig) => PayloadHandler;
|
|
4
4
|
//# sourceMappingURL=createCollections.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
2
|
import { type PayloadHandler } from 'payload';
|
|
3
|
-
import { type TypesenseConfig } from '../../
|
|
3
|
+
import { type TypesenseConfig } from '../../types.js';
|
|
4
4
|
export declare const createSearch: (typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig) => PayloadHandler;
|
|
5
5
|
//# sourceMappingURL=createSearch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSearch.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/createSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"createSearch.d.ts","sourceRoot":"","sources":["../../../src/endpoints/handler/createSearch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,SAAS,CAAA;AAIlE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD,eAAO,MAAM,YAAY,GACvB,iBAAiB,SAAS,CAAC,MAAM,EACjC,eAAe,eAAe,KAC7B,cAoGF,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
2
|
import { type PayloadHandler } from 'payload';
|
|
3
|
-
import { type TypesenseConfig } from '../../
|
|
3
|
+
import { type TypesenseConfig } from '../../types.js';
|
|
4
4
|
export declare const createSuggest: (typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig) => PayloadHandler;
|
|
5
5
|
//# sourceMappingURL=createSuggest.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
2
|
import { type PayloadHandler } from 'payload';
|
|
3
|
-
import { type TypesenseConfig } from '../
|
|
3
|
+
import { type TypesenseConfig } from '../types.js';
|
|
4
4
|
export declare const createHealthCheck: (typesenseClient: Typesense.Client, _pluginOptions: TypesenseConfig, lastSyncTime?: number) => PayloadHandler;
|
|
5
5
|
export declare const createDetailedHealthCheck: (typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig, lastSyncTime?: number) => PayloadHandler;
|
|
6
6
|
//# sourceMappingURL=health.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/endpoints/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAG7C,OAAO,
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/endpoints/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAG7C,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAM5E,eAAO,MAAM,iBAAiB,GAC5B,iBAAiB,SAAS,CAAC,MAAM,EACjC,gBAAgB,eAAe,EAC/B,eAAe,MAAM,KACpB,cAsCF,CAAA;AAED,eAAO,MAAM,yBAAyB,GACpC,iBAAiB,SAAS,CAAC,MAAM,EACjC,eAAe,eAAe,EAC9B,eAAe,MAAM,KACpB,cAsFF,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
|
-
import { type TypesenseConfig } from '../
|
|
2
|
+
import { type TypesenseConfig } from '../types.js';
|
|
3
3
|
export declare const createSearchEndpoints: (typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig, lastSyncTime?: number) => ({
|
|
4
4
|
handler: import("payload").PayloadHandler;
|
|
5
5
|
method: "get";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,30 +1,6 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Config } from 'payload';
|
|
2
|
+
import { type TypesenseConfig } from './types.js';
|
|
2
3
|
export * from './components/index.js';
|
|
3
|
-
export type TypesenseConfig
|
|
4
|
-
collections?: Partial<Record<string, {
|
|
5
|
-
displayName?: string;
|
|
6
|
-
enabled: boolean;
|
|
7
|
-
facetFields?: string[];
|
|
8
|
-
icon?: string;
|
|
9
|
-
searchFields?: string[];
|
|
10
|
-
sortFields?: string[];
|
|
11
|
-
}>>;
|
|
12
|
-
disabled?: boolean;
|
|
13
|
-
settings?: {
|
|
14
|
-
autoSync?: boolean;
|
|
15
|
-
batchSize?: number;
|
|
16
|
-
categorized?: boolean;
|
|
17
|
-
searchEndpoint?: string;
|
|
18
|
-
};
|
|
19
|
-
typesense: {
|
|
20
|
-
apiKey: string;
|
|
21
|
-
connectionTimeoutSeconds?: number;
|
|
22
|
-
nodes: Array<{
|
|
23
|
-
host: string;
|
|
24
|
-
port: number | string;
|
|
25
|
-
protocol: 'http' | 'https';
|
|
26
|
-
}>;
|
|
27
|
-
};
|
|
28
|
-
};
|
|
4
|
+
export type { TypesenseConfig } from './types.js';
|
|
29
5
|
export declare const typesenseSearch: (pluginOptions: TypesenseConfig) => (config: Config) => Config;
|
|
30
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAA;AAMrC,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,cAAc,uBAAuB,CAAA;AACrC,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,eAAe,GACzB,eAAe,eAAe,MAC9B,QAAQ,MAAM,KAAG,MAiDjB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,49 +1,47 @@
|
|
|
1
1
|
import { createSearchEndpoints } from './endpoints/search.js';
|
|
2
2
|
import { createClient } from './lib/client.js';
|
|
3
3
|
import { deleteDocumentFromTypesense, syncDocumentToTypesense } from './lib/hooks.js';
|
|
4
|
-
import {
|
|
4
|
+
import { initializeTypesense } from './lib/initialization.js';
|
|
5
5
|
export * from './components/index.js';
|
|
6
6
|
export const typesenseSearch = (pluginOptions)=>(config)=>{
|
|
7
7
|
if (pluginOptions.disabled) {
|
|
8
8
|
return config;
|
|
9
9
|
}
|
|
10
|
-
const
|
|
10
|
+
const client = createClient(pluginOptions.typesense);
|
|
11
11
|
config.endpoints = [
|
|
12
12
|
...config.endpoints || [],
|
|
13
|
-
...createSearchEndpoints(
|
|
13
|
+
...createSearchEndpoints(client, pluginOptions, Date.now())
|
|
14
14
|
];
|
|
15
|
-
|
|
15
|
+
const shouldAutoSync = pluginOptions.settings?.autoSync !== false;
|
|
16
|
+
const hasCollections = !!pluginOptions.collections;
|
|
17
|
+
if (shouldAutoSync && hasCollections) {
|
|
16
18
|
config.collections = (config.collections || []).map((collection)=>{
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
19
|
-
return
|
|
20
|
-
...collection,
|
|
21
|
-
hooks: {
|
|
22
|
-
...collection.hooks,
|
|
23
|
-
afterChange: [
|
|
24
|
-
...collection.hooks?.afterChange || [],
|
|
25
|
-
async ({ doc, operation, req: _req })=>{
|
|
26
|
-
await syncDocumentToTypesense(typesenseClient, collection.slug, doc, operation, collectionConfig);
|
|
27
|
-
}
|
|
28
|
-
],
|
|
29
|
-
afterDelete: [
|
|
30
|
-
...collection.hooks?.afterDelete || [],
|
|
31
|
-
async ({ doc, req: _req })=>{
|
|
32
|
-
await deleteDocumentFromTypesense(typesenseClient, collection.slug, doc.id);
|
|
33
|
-
}
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
};
|
|
19
|
+
const colConfig = pluginOptions.collections?.[collection.slug];
|
|
20
|
+
if (!colConfig?.enabled) {
|
|
21
|
+
return collection;
|
|
37
22
|
}
|
|
38
|
-
return
|
|
23
|
+
return {
|
|
24
|
+
...collection,
|
|
25
|
+
hooks: {
|
|
26
|
+
...collection.hooks,
|
|
27
|
+
afterChange: [
|
|
28
|
+
...collection.hooks?.afterChange || [],
|
|
29
|
+
async ({ doc, operation })=>syncDocumentToTypesense(client, collection.slug, doc, operation, colConfig)
|
|
30
|
+
],
|
|
31
|
+
afterDelete: [
|
|
32
|
+
...collection.hooks?.afterDelete || [],
|
|
33
|
+
async ({ doc })=>deleteDocumentFromTypesense(client, collection.slug, doc.id)
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
};
|
|
39
37
|
});
|
|
40
38
|
}
|
|
41
|
-
const
|
|
39
|
+
const existingOnInit = config.onInit;
|
|
42
40
|
config.onInit = async (payload)=>{
|
|
43
|
-
if (
|
|
44
|
-
await
|
|
41
|
+
if (existingOnInit) {
|
|
42
|
+
await existingOnInit(payload);
|
|
45
43
|
}
|
|
46
|
-
await
|
|
44
|
+
await initializeTypesense(payload, client, pluginOptions);
|
|
47
45
|
};
|
|
48
46
|
return config;
|
|
49
47
|
};
|
package/dist/lib/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import Typesense from 'typesense';
|
|
2
|
-
import { type TypesenseConfig } from '../
|
|
2
|
+
import { type TypesenseConfig } from '../types.js';
|
|
3
3
|
export declare const createClient: (typesenseConfig: TypesenseConfig["typesense"]) => Typesense.Client;
|
|
4
4
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -39,10 +39,6 @@ export interface HeadlessSearchInputProps<T = Record<string, unknown>> extends B
|
|
|
39
39
|
* Custom render function for loading state
|
|
40
40
|
*/
|
|
41
41
|
renderLoading?: () => React.ReactNode;
|
|
42
|
-
/**
|
|
43
|
-
* Show match percentage in search results
|
|
44
|
-
*/
|
|
45
|
-
renderMatchPercentage?: boolean;
|
|
46
42
|
/**
|
|
47
43
|
* Custom render function for no results
|
|
48
44
|
*/
|
|
@@ -56,7 +52,7 @@ export interface HeadlessSearchInputProps<T = Record<string, unknown>> extends B
|
|
|
56
52
|
/**
|
|
57
53
|
* Custom render function for results header
|
|
58
54
|
*/
|
|
59
|
-
renderResultsHeader?: (found: number
|
|
55
|
+
renderResultsHeader?: (found: number) => React.ReactNode;
|
|
60
56
|
/**
|
|
61
57
|
* Custom CSS class for individual result items
|
|
62
58
|
*/
|
|
@@ -77,10 +73,6 @@ export interface HeadlessSearchInputProps<T = Record<string, unknown>> extends B
|
|
|
77
73
|
* Show result count
|
|
78
74
|
*/
|
|
79
75
|
showResultCount?: boolean;
|
|
80
|
-
/**
|
|
81
|
-
* Show search time
|
|
82
|
-
*/
|
|
83
|
-
showSearchTime?: boolean;
|
|
84
76
|
/**
|
|
85
77
|
* Theme configuration
|
|
86
78
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headlessSearch.d.ts","sourceRoot":"","sources":["../../src/lib/headlessSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1E,MAAM,WAAW,wBAAwB,CACvC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC3B,SAAQ,oBAAoB,CAAC,CAAC,CAAC;IAC/B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC/B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;IAChD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;QACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAA;QAC1D,OAAO,EAAE,MAAM,IAAI,CAAA;QACnB,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAA;QAC3C,WAAW,EAAE,MAAM,CAAA;QACnB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;QAC7C,KAAK,EAAE,MAAM,CAAA;KACd,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IACrC;;OAEG;IACH,
|
|
1
|
+
{"version":3,"file":"headlessSearch.d.ts","sourceRoot":"","sources":["../../src/lib/headlessSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1E,MAAM,WAAW,wBAAwB,CACvC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC3B,SAAQ,oBAAoB,CAAC,CAAC,CAAC;IAC/B;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC/B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;IAChD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QACpB,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAA;QACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAA;QAC1D,OAAO,EAAE,MAAM,IAAI,CAAA;QACnB,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAA;QAC3C,WAAW,EAAE,MAAM,CAAA;QACnB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;QAC7C,KAAK,EAAE,MAAM,CAAA;KACd,KAAK,KAAK,CAAC,SAAS,CAAA;IACrB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IACrC;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;IACpD;;OAEG;IACH,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;KAAE,KACrD,KAAK,CAAC,SAAS,CAAA;IACpB;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;IACxD;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAC7B"}
|
package/dist/lib/hooks.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
2
|
import { type CollectionAfterChangeHook, type CollectionAfterDeleteHook } from 'payload';
|
|
3
|
-
import { type TypesenseConfig } from '../
|
|
3
|
+
import { type TypesenseConfig } from '../types.js';
|
|
4
4
|
export declare const setupHooks: (typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig, existingHooks?: {
|
|
5
5
|
afterChange?: Record<string, CollectionAfterChangeHook[]>;
|
|
6
6
|
afterDelete?: Record<string, CollectionAfterDeleteHook[]>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Typesense from 'typesense';
|
|
2
2
|
import { type Payload } from 'payload';
|
|
3
|
-
import { type TypesenseConfig } from '../
|
|
4
|
-
export declare const
|
|
3
|
+
import { type TypesenseConfig } from '../types.js';
|
|
4
|
+
export declare const initializeTypesense: (payload: Payload, typesenseClient: Typesense.Client, pluginOptions: TypesenseConfig) => Promise<void>;
|
|
5
5
|
//# sourceMappingURL=initialization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialization.d.ts","sourceRoot":"","sources":["../../src/lib/initialization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,
|
|
1
|
+
{"version":3,"file":"initialization.d.ts","sourceRoot":"","sources":["../../src/lib/initialization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,OAAO,EAAuC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAMvF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,OAAO,EAChB,iBAAiB,SAAS,CAAC,MAAM,EACjC,eAAe,eAAe,kBAkB/B,CAAA"}
|
|
@@ -2,7 +2,7 @@ import { ensureCollection } from '../utils/ensureCollection.js';
|
|
|
2
2
|
import { testConnection } from '../utils/testConnection.js';
|
|
3
3
|
import { mapCollectionToTypesense, mapToTypesense } from './schema-mapper.js';
|
|
4
4
|
import { validateConfig } from './validation.js';
|
|
5
|
-
export const
|
|
5
|
+
export const initializeTypesense = async (payload, typesenseClient, pluginOptions)=>{
|
|
6
6
|
const validation = validateConfig(pluginOptions);
|
|
7
7
|
if (!validation.success) {
|
|
8
8
|
throw new Error('Invalid plugin configuration');
|
|
@@ -32,45 +32,57 @@ const initializeCollection = async (payload, typesenseClient, collectionSlug, co
|
|
|
32
32
|
};
|
|
33
33
|
const syncExistingDocuments = async (payload, typesenseClient, collectionSlug, config)=>{
|
|
34
34
|
try {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
35
|
+
const limit = config?.syncLimit ?? 1000;
|
|
36
|
+
let page = 1;
|
|
37
|
+
let hasMore = true;
|
|
38
|
+
let totalPages;
|
|
39
|
+
while(hasMore){
|
|
40
|
+
const { docs, hasNextPage, totalPages: pages } = await payload.find({
|
|
41
|
+
collection: collectionSlug,
|
|
42
|
+
depth: 0,
|
|
43
|
+
limit,
|
|
44
|
+
page
|
|
45
|
+
});
|
|
46
|
+
if (pages) {
|
|
47
|
+
totalPages = pages;
|
|
48
|
+
}
|
|
49
|
+
if (!docs.length) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
const batchSize = 100;
|
|
53
|
+
for(let i = 0; i < docs.length; i += batchSize){
|
|
54
|
+
const batch = docs.slice(i, i + batchSize);
|
|
55
|
+
const mapped = batch.filter((doc)=>{
|
|
56
|
+
if (typeof doc !== 'object' || doc === null) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (!('id' in doc)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const id = doc.id;
|
|
63
|
+
return typeof id === 'string';
|
|
64
|
+
}).map((doc)=>mapToTypesense(doc, collectionSlug, config));
|
|
65
|
+
try {
|
|
66
|
+
await typesenseClient.collections(collectionSlug).documents().import(mapped, {
|
|
67
|
+
action: 'upsert'
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
const err = error;
|
|
71
|
+
if (err?.importResults) {
|
|
72
|
+
for (const doc of mapped){
|
|
73
|
+
try {
|
|
74
|
+
await typesenseClient.collections(collectionSlug).documents().upsert(doc);
|
|
75
|
+
} catch {
|
|
76
|
+
// ignore individual item errors
|
|
77
|
+
}
|
|
68
78
|
}
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
81
|
}
|
|
82
|
+
hasMore = hasNextPage ?? (totalPages ? page < totalPages : false);
|
|
83
|
+
page++;
|
|
72
84
|
}
|
|
73
85
|
} catch {
|
|
74
|
-
// ignore
|
|
86
|
+
// ignore top-level sync errors
|
|
75
87
|
}
|
|
76
88
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { type TypesenseConfig } from '../
|
|
2
|
-
import { type BaseDocument } from '../types.js';
|
|
1
|
+
import { type BaseDocument, type TypesenseConfig } from '../types.js';
|
|
3
2
|
export declare const mapCollectionToTypesense: (collectionSlug: string, config: NonNullable<TypesenseConfig["collections"]>[string] | undefined) => {
|
|
4
3
|
name: string;
|
|
5
4
|
fields: ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-mapper.d.ts","sourceRoot":"","sources":["../../src/lib/schema-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"schema-mapper.d.ts","sourceRoot":"","sources":["../../src/lib/schema-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAGrE,eAAO,MAAM,wBAAwB,GACnC,gBAAgB,MAAM,EACtB,QAAQ,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS;;;;;;;;;;;;;;;;;;;CAgCxE,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,KAAK,YAAY,EACjB,iBAAiB,MAAM,EACvB,QAAQ,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,oCA2ExE,CAAA"}
|