@rubixstudios/payload-typesense 1.0.3 → 1.0.5
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/LICENSE +2 -2
- package/README.md +1 -1
- package/dist/components/ThemeProvider.d.ts +1 -2
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -3
- package/dist/components/themes/hooks.d.ts +5 -5
- package/dist/components/themes/hooks.d.ts.map +1 -1
- package/dist/components/themes/hooks.js +16 -16
- package/dist/components/themes/index.d.ts +4 -4
- package/dist/components/themes/index.js +4 -4
- package/dist/components/themes/themes.d.ts +1 -1
- package/dist/components/themes/themes.d.ts.map +1 -1
- package/dist/components/themes/themes.js +109 -109
- package/dist/components/themes/types.d.ts.map +1 -1
- package/dist/components/themes/utils.d.ts +1 -1
- package/dist/components/themes/utils.d.ts.map +1 -1
- package/dist/components/themes/utils.js +139 -139
- package/dist/endpoints/customEndpointHandler.d.ts +1 -1
- package/dist/endpoints/customEndpointHandler.js +1 -1
- package/dist/endpoints/search.d.ts +3 -3
- package/dist/endpoints/search.d.ts.map +1 -1
- package/dist/endpoints/search.js +65 -65
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -17
- package/dist/lib/cache.d.ts +1 -1
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +19 -19
- package/dist/lib/config-validation.d.ts +1 -1
- package/dist/lib/config-validation.d.ts.map +1 -1
- package/dist/lib/config-validation.js +18 -18
- package/dist/lib/hooks.d.ts +2 -2
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +2 -2
- package/dist/lib/initialization.d.ts +3 -3
- package/dist/lib/initialization.d.ts.map +1 -1
- package/dist/lib/initialization.js +5 -5
- package/dist/lib/schema-mapper.d.ts +2 -2
- package/dist/lib/schema-mapper.d.ts.map +1 -1
- package/dist/lib/schema-mapper.js +27 -27
- package/dist/lib/types.d.ts +3 -3
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/typesense-client.d.ts +3 -3
- package/dist/lib/typesense-client.d.ts.map +1 -1
- package/dist/lib/typesense-client.js +16 -4
- package/package.json +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { z } from
|
|
1
|
+
import { z } from "zod";
|
|
2
2
|
// Typesense node configuration schema
|
|
3
3
|
const TypesenseNodeSchema = z.object({
|
|
4
|
-
host: z.string().min(1,
|
|
5
|
-
port: z.number().int().min(1).max(65535,
|
|
4
|
+
host: z.string().min(1, "Host is required"),
|
|
5
|
+
port: z.number().int().min(1).max(65535, "Port must be between 1 and 65535"),
|
|
6
6
|
protocol: z.enum([
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
"http",
|
|
8
|
+
"https"
|
|
9
9
|
])
|
|
10
10
|
});
|
|
11
11
|
// Collection configuration schema
|
|
@@ -15,12 +15,12 @@ const CollectionConfigSchema = z.object({
|
|
|
15
15
|
facetFields: z.array(z.string()).optional().default([]),
|
|
16
16
|
fieldMapping: z.record(z.string(), z.string()).optional(),
|
|
17
17
|
icon: z.string().optional(),
|
|
18
|
-
searchFields: z.array(z.string()).min(1,
|
|
18
|
+
searchFields: z.array(z.string()).min(1, "At least one search field is required")
|
|
19
19
|
});
|
|
20
20
|
// Cache configuration schema
|
|
21
21
|
const CacheConfigSchema = z.object({
|
|
22
|
-
maxSize: z.number().int().min(1,
|
|
23
|
-
ttl: z.number().int().min(1000,
|
|
22
|
+
maxSize: z.number().int().min(1, "Max size must be at least 1").optional().default(1000),
|
|
23
|
+
ttl: z.number().int().min(1000, "TTL must be at least 1000ms").optional().default(300000)
|
|
24
24
|
});
|
|
25
25
|
// Settings configuration schema
|
|
26
26
|
const SettingsConfigSchema = z.object({
|
|
@@ -32,9 +32,9 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
32
32
|
collections: z.record(z.string(), CollectionConfigSchema),
|
|
33
33
|
settings: SettingsConfigSchema.optional(),
|
|
34
34
|
typesense: z.object({
|
|
35
|
-
apiKey: z.string().min(1,
|
|
35
|
+
apiKey: z.string().min(1, "API key is required"),
|
|
36
36
|
connectionTimeoutSeconds: z.number().int().min(1).optional().default(10),
|
|
37
|
-
nodes: z.array(TypesenseNodeSchema).min(1,
|
|
37
|
+
nodes: z.array(TypesenseNodeSchema).min(1, "At least one Typesense node is required"),
|
|
38
38
|
numRetries: z.number().int().min(0).optional().default(3),
|
|
39
39
|
retryIntervalSeconds: z.number().int().min(1).optional().default(1)
|
|
40
40
|
})
|
|
@@ -51,7 +51,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
51
51
|
} catch (error) {
|
|
52
52
|
if (error instanceof z.ZodError) {
|
|
53
53
|
const errors = error.issues.map((err)=>{
|
|
54
|
-
const path = err.path.length > 0 ? `${err.path.join(
|
|
54
|
+
const path = err.path.length > 0 ? `${err.path.join(".")}: ` : "";
|
|
55
55
|
return `${path}${err.message}`;
|
|
56
56
|
});
|
|
57
57
|
return {
|
|
@@ -61,7 +61,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
61
61
|
}
|
|
62
62
|
return {
|
|
63
63
|
errors: [
|
|
64
|
-
|
|
64
|
+
"Invalid configuration format"
|
|
65
65
|
],
|
|
66
66
|
success: false
|
|
67
67
|
};
|
|
@@ -79,7 +79,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
79
79
|
} catch (error) {
|
|
80
80
|
if (error instanceof z.ZodError) {
|
|
81
81
|
const errors = error.issues.map((err)=>{
|
|
82
|
-
const path = err.path.length > 0 ? `${err.path.join(
|
|
82
|
+
const path = err.path.length > 0 ? `${err.path.join(".")}: ` : "";
|
|
83
83
|
return `${path}${err.message}`;
|
|
84
84
|
});
|
|
85
85
|
return {
|
|
@@ -89,7 +89,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
89
89
|
}
|
|
90
90
|
return {
|
|
91
91
|
errors: [
|
|
92
|
-
|
|
92
|
+
"Invalid configuration format"
|
|
93
93
|
],
|
|
94
94
|
success: false
|
|
95
95
|
};
|
|
@@ -109,7 +109,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
109
109
|
} catch (error) {
|
|
110
110
|
if (error instanceof z.ZodError) {
|
|
111
111
|
const errors = error.issues.map((err)=>{
|
|
112
|
-
const path = err.path.length > 0 ? `${err.path.join(
|
|
112
|
+
const path = err.path.length > 0 ? `${err.path.join(".")}: ` : "";
|
|
113
113
|
return `Collection '${collectionSlug}' - ${path}${err.message}`;
|
|
114
114
|
});
|
|
115
115
|
return {
|
|
@@ -128,7 +128,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
128
128
|
/**
|
|
129
129
|
* Get configuration validation errors in a user-friendly format
|
|
130
130
|
*/ export function getValidationErrors(errors) {
|
|
131
|
-
return errors.map((error, index)=>`${index + 1}. ${error}`).join(
|
|
131
|
+
return errors.map((error, index)=>`${index + 1}. ${error}`).join("\n");
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
134
|
* Validate search parameters
|
|
@@ -156,7 +156,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
156
156
|
} catch (error) {
|
|
157
157
|
if (error instanceof z.ZodError) {
|
|
158
158
|
const errors = error.issues.map((err)=>{
|
|
159
|
-
const path = err.path.length > 0 ? `${err.path.join(
|
|
159
|
+
const path = err.path.length > 0 ? `${err.path.join(".")}: ` : "";
|
|
160
160
|
return `${path}${err.message}`;
|
|
161
161
|
});
|
|
162
162
|
return {
|
|
@@ -166,7 +166,7 @@ export const TypesenseSearchConfigSchema = z.object({
|
|
|
166
166
|
}
|
|
167
167
|
return {
|
|
168
168
|
errors: [
|
|
169
|
-
|
|
169
|
+
"Invalid search parameters format"
|
|
170
170
|
],
|
|
171
171
|
success: false
|
|
172
172
|
};
|
package/dist/lib/hooks.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type Typesense from
|
|
2
|
-
import type { TypesenseSearchConfig } from
|
|
1
|
+
import type Typesense from "typesense";
|
|
2
|
+
import type { TypesenseSearchConfig } from "../index.js";
|
|
3
3
|
export declare const setupHooks: (typesenseClient: Typesense.Client, pluginOptions: TypesenseSearchConfig, existingHooks?: any) => any;
|
|
4
4
|
//# sourceMappingURL=hooks.d.ts.map
|
package/dist/lib/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAIxD,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAIxD,eAAO,MAAM,UAAU,GACtB,iBAAiB,SAAS,CAAC,MAAM,EACjC,eAAe,qBAAqB,EACpC,gBAAgB,GAAG,QAqDnB,CAAA"}
|
package/dist/lib/hooks.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mapPayloadDocumentToTypesense } from
|
|
1
|
+
import { mapPayloadDocumentToTypesense } from "./schema-mapper.js";
|
|
2
2
|
export const setupHooks = (typesenseClient, pluginOptions, existingHooks)=>{
|
|
3
3
|
const hooks = {
|
|
4
4
|
...existingHooks
|
|
@@ -39,7 +39,7 @@ const syncDocumentToTypesense = async (typesenseClient, collectionSlug, doc, ope
|
|
|
39
39
|
} catch (error) {
|
|
40
40
|
// Handle document sync error
|
|
41
41
|
// Log the problematic document for debugging
|
|
42
|
-
if (error.message.includes(
|
|
42
|
+
if (error.message.includes("validation")) {
|
|
43
43
|
// Log problematic document details
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Payload } from
|
|
2
|
-
import type Typesense from
|
|
3
|
-
import type { TypesenseSearchConfig } from
|
|
1
|
+
import type { Payload } from "payload";
|
|
2
|
+
import type Typesense from "typesense";
|
|
3
|
+
import type { TypesenseSearchConfig } from "../index.js";
|
|
4
4
|
export declare const initializeTypesenseCollections: (payload: Payload, typesenseClient: Typesense.Client, pluginOptions: TypesenseSearchConfig) => 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,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"initialization.d.ts","sourceRoot":"","sources":["../../src/lib/initialization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AAEtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AASxD,eAAO,MAAM,8BAA8B,GAC1C,SAAS,OAAO,EAChB,iBAAiB,SAAS,CAAC,MAAM,EACjC,eAAe,qBAAqB,kBAwCpC,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { validateConfig } from
|
|
2
|
-
import { mapCollectionToTypesenseSchema, mapPayloadDocumentToTypesense } from
|
|
3
|
-
import { testTypesenseConnection } from
|
|
1
|
+
import { validateConfig } from "./config-validation.js";
|
|
2
|
+
import { mapCollectionToTypesenseSchema, mapPayloadDocumentToTypesense } from "./schema-mapper.js";
|
|
3
|
+
import { testTypesenseConnection } from "./typesense-client.js";
|
|
4
4
|
export const initializeTypesenseCollections = async (payload, typesenseClient, pluginOptions)=>{
|
|
5
5
|
// Validate configuration first
|
|
6
6
|
const validation = validateConfig(pluginOptions);
|
|
7
7
|
if (!validation.success) {
|
|
8
8
|
// Handle configuration validation error
|
|
9
|
-
throw new Error(
|
|
9
|
+
throw new Error("Invalid plugin configuration");
|
|
10
10
|
}
|
|
11
11
|
// Configuration validated successfully
|
|
12
12
|
// Test Typesense connection first
|
|
@@ -74,7 +74,7 @@ const syncExistingDocuments = async (payload, typesenseClient, collectionSlug, c
|
|
|
74
74
|
const typesenseDocs = batch.map((doc)=>mapPayloadDocumentToTypesense(doc, collectionSlug, config));
|
|
75
75
|
try {
|
|
76
76
|
const _importResult = await typesenseClient.collections(collectionSlug).documents().import(typesenseDocs, {
|
|
77
|
-
action:
|
|
77
|
+
action: "upsert"
|
|
78
78
|
});
|
|
79
79
|
// Documents synced successfully
|
|
80
80
|
} catch (batchError) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Collection } from
|
|
2
|
-
import type { TypesenseSearchConfig } from
|
|
1
|
+
import type { Collection } from "payload";
|
|
2
|
+
import type { TypesenseSearchConfig } from "../index.js";
|
|
3
3
|
export declare const mapCollectionToTypesenseSchema: (collection: Collection, collectionSlug: string, config: NonNullable<TypesenseSearchConfig["collections"]>[string] | undefined) => {
|
|
4
4
|
name: string;
|
|
5
5
|
fields: ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-mapper.d.ts","sourceRoot":"","sources":["../../src/lib/schema-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AA6BxD,eAAO,MAAM,8BAA8B,
|
|
1
|
+
{"version":3,"file":"schema-mapper.d.ts","sourceRoot":"","sources":["../../src/lib/schema-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AA6BxD,eAAO,MAAM,8BAA8B,GAC1C,YAAY,UAAU,EACtB,gBAAgB,MAAM,EACtB,QAAQ,WAAW,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS;;;;;;;;;CA6C7E,CAAA;AAED,eAAO,MAAM,6BAA6B,GACzC,KAAK,GAAG,EACR,gBAAgB,MAAM,EACtB,QAAQ,WAAW,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,QA6F7E,CAAA"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
// Helper function to extract text content from richText structure
|
|
2
2
|
const extractTextFromRichText = (richText)=>{
|
|
3
3
|
if (!richText || !richText.root) {
|
|
4
|
-
return
|
|
4
|
+
return "";
|
|
5
5
|
}
|
|
6
6
|
const extractText = (node)=>{
|
|
7
|
-
if (typeof node ===
|
|
7
|
+
if (typeof node === "string") {
|
|
8
8
|
return node;
|
|
9
9
|
}
|
|
10
|
-
if (node && typeof node ===
|
|
10
|
+
if (node && typeof node === "object") {
|
|
11
11
|
if (node.text) {
|
|
12
12
|
return node.text;
|
|
13
13
|
}
|
|
14
14
|
if (node.children && Array.isArray(node.children)) {
|
|
15
|
-
return node.children.map(extractText).join(
|
|
15
|
+
return node.children.map(extractText).join("");
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
return
|
|
18
|
+
return "";
|
|
19
19
|
};
|
|
20
20
|
return extractText(richText.root);
|
|
21
21
|
};
|
|
22
22
|
export const mapCollectionToTypesenseSchema = (collection, collectionSlug, config)=>{
|
|
23
23
|
const searchableFields = config?.searchFields || [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
"title",
|
|
25
|
+
"content",
|
|
26
|
+
"description"
|
|
27
27
|
];
|
|
28
28
|
const facetFields = config?.facetFields || [];
|
|
29
29
|
// Map schema for collection
|
|
@@ -31,29 +31,29 @@ export const mapCollectionToTypesenseSchema = (collection, collectionSlug, confi
|
|
|
31
31
|
// Note: 'id' field is automatically created by Typesense, so we don't include it
|
|
32
32
|
const baseFields = [
|
|
33
33
|
{
|
|
34
|
-
name:
|
|
35
|
-
type:
|
|
34
|
+
name: "slug",
|
|
35
|
+
type: "string"
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
|
-
name:
|
|
39
|
-
type:
|
|
38
|
+
name: "createdAt",
|
|
39
|
+
type: "int64"
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
|
-
name:
|
|
43
|
-
type:
|
|
42
|
+
name: "updatedAt",
|
|
43
|
+
type: "int64"
|
|
44
44
|
}
|
|
45
45
|
];
|
|
46
46
|
// Map searchable fields
|
|
47
47
|
const searchFields = searchableFields.map((field)=>({
|
|
48
48
|
name: field,
|
|
49
|
-
type:
|
|
49
|
+
type: "string",
|
|
50
50
|
facet: facetFields.includes(field)
|
|
51
51
|
}));
|
|
52
52
|
// Process search fields
|
|
53
53
|
// Map facet-only fields (not in searchable fields)
|
|
54
54
|
const facetOnlyFields = facetFields.filter((field)=>!searchableFields.includes(field)).map((field)=>({
|
|
55
55
|
name: field,
|
|
56
|
-
type:
|
|
56
|
+
type: "string",
|
|
57
57
|
facet: true
|
|
58
58
|
}));
|
|
59
59
|
const finalSchema = {
|
|
@@ -69,9 +69,9 @@ export const mapCollectionToTypesenseSchema = (collection, collectionSlug, confi
|
|
|
69
69
|
};
|
|
70
70
|
export const mapPayloadDocumentToTypesense = (doc, collectionSlug, config)=>{
|
|
71
71
|
const searchableFields = config?.searchFields || [
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
"title",
|
|
73
|
+
"content",
|
|
74
|
+
"description"
|
|
75
75
|
];
|
|
76
76
|
const facetFields = config?.facetFields || [];
|
|
77
77
|
// Validate required fields
|
|
@@ -89,23 +89,23 @@ export const mapPayloadDocumentToTypesense = (doc, collectionSlug, config)=>{
|
|
|
89
89
|
// Base document structure with safe date handling
|
|
90
90
|
const typesenseDoc = {
|
|
91
91
|
id: String(doc.id),
|
|
92
|
-
slug: doc.slug ||
|
|
92
|
+
slug: doc.slug || "",
|
|
93
93
|
createdAt: new Date(doc.createdAt).getTime(),
|
|
94
94
|
updatedAt: new Date(doc.updatedAt).getTime()
|
|
95
95
|
};
|
|
96
96
|
// Add searchable fields with validation
|
|
97
97
|
searchableFields.forEach((field)=>{
|
|
98
98
|
// Handle array fields with dot notation (e.g., 'technologies.name', 'tags.tag')
|
|
99
|
-
if (field.includes(
|
|
100
|
-
const [arrayField, subField] = field.split(
|
|
99
|
+
if (field.includes(".")) {
|
|
100
|
+
const [arrayField, subField] = field.split(".", 2);
|
|
101
101
|
if (arrayField && subField && Array.isArray(doc[arrayField]) && doc[arrayField].length > 0) {
|
|
102
|
-
typesenseDoc[field] = doc[arrayField].map((item)=>item?.[subField] ||
|
|
102
|
+
typesenseDoc[field] = doc[arrayField].map((item)=>item?.[subField] || "").join(" ");
|
|
103
103
|
} else {
|
|
104
|
-
typesenseDoc[field] =
|
|
104
|
+
typesenseDoc[field] = "";
|
|
105
105
|
}
|
|
106
106
|
} else if (doc[field] !== undefined && doc[field] !== null) {
|
|
107
107
|
// Handle richText fields specially
|
|
108
|
-
if ((field ===
|
|
108
|
+
if ((field === "content" || field === "description") && typeof doc[field] === "object" && doc[field].root) {
|
|
109
109
|
// Extract text from richText structure
|
|
110
110
|
typesenseDoc[field] = extractTextFromRichText(doc[field]);
|
|
111
111
|
} else {
|
|
@@ -114,7 +114,7 @@ export const mapPayloadDocumentToTypesense = (doc, collectionSlug, config)=>{
|
|
|
114
114
|
}
|
|
115
115
|
} else {
|
|
116
116
|
// Set empty string for missing fields
|
|
117
|
-
typesenseDoc[field] =
|
|
117
|
+
typesenseDoc[field] = "";
|
|
118
118
|
}
|
|
119
119
|
});
|
|
120
120
|
// Add facet fields with validation - ensure all facet fields are present
|
|
@@ -124,7 +124,7 @@ export const mapPayloadDocumentToTypesense = (doc, collectionSlug, config)=>{
|
|
|
124
124
|
typesenseDoc[field] = String(doc[field]);
|
|
125
125
|
} else {
|
|
126
126
|
// Add default value for missing facet fields
|
|
127
|
-
typesenseDoc[field] =
|
|
127
|
+
typesenseDoc[field] = "unknown";
|
|
128
128
|
}
|
|
129
129
|
});
|
|
130
130
|
// Validate that we have at least one searchable field
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export interface BaseDocument {
|
|
2
|
-
_status?:
|
|
2
|
+
_status?: "draft" | "published";
|
|
3
3
|
createdAt: Date | string;
|
|
4
4
|
id: string;
|
|
5
5
|
slug?: string;
|
|
@@ -102,7 +102,7 @@ export interface TypesenseSearchConfig<T = Record<string, any>> {
|
|
|
102
102
|
nodes: Array<{
|
|
103
103
|
host: string;
|
|
104
104
|
port: number;
|
|
105
|
-
protocol:
|
|
105
|
+
protocol: "http" | "https";
|
|
106
106
|
}>;
|
|
107
107
|
numRetries?: number;
|
|
108
108
|
retryIntervalSeconds?: number;
|
|
@@ -158,7 +158,7 @@ export interface HealthCheckResponse {
|
|
|
158
158
|
collections?: string[];
|
|
159
159
|
error?: string;
|
|
160
160
|
lastSync?: number;
|
|
161
|
-
status:
|
|
161
|
+
status: "healthy" | "unhealthy";
|
|
162
162
|
typesense?: {
|
|
163
163
|
ok: boolean;
|
|
164
164
|
version?: string;
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Typesense from
|
|
2
|
-
import type { TypesenseSearchConfig } from
|
|
3
|
-
export declare const createTypesenseClient: (typesenseConfig: TypesenseSearchConfig["typesense"]) =>
|
|
1
|
+
import Typesense from "typesense";
|
|
2
|
+
import type { TypesenseSearchConfig } from "../index.js";
|
|
3
|
+
export declare const createTypesenseClient: (typesenseConfig: TypesenseSearchConfig["typesense"]) => any;
|
|
4
4
|
export declare const testTypesenseConnection: (client: Typesense.Client) => Promise<boolean>;
|
|
5
5
|
//# sourceMappingURL=typesense-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typesense-client.d.ts","sourceRoot":"","sources":["../../src/lib/typesense-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"typesense-client.d.ts","sourceRoot":"","sources":["../../src/lib/typesense-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAOxD,eAAO,MAAM,qBAAqB,GACjC,iBAAiB,qBAAqB,CAAC,WAAW,CAAC,QAmBnD,CAAA;AAED,eAAO,MAAM,uBAAuB,GACnC,QAAQ,SAAS,CAAC,MAAM,KACtB,OAAO,CAAC,OAAO,CAOjB,CAAA"}
|
|
@@ -1,11 +1,24 @@
|
|
|
1
|
-
import Typesense from
|
|
1
|
+
import Typesense from "typesense";
|
|
2
|
+
const isBuildPhase = process.env.NEXT_PHASE === "build" || process.env.BUILD_PHASE === "build" || process.env.CI === "true";
|
|
2
3
|
export const createTypesenseClient = (typesenseConfig)=>{
|
|
4
|
+
if (isBuildPhase) {
|
|
5
|
+
return {
|
|
6
|
+
collections: ()=>({
|
|
7
|
+
retrieve: ()=>Promise.resolve([])
|
|
8
|
+
}),
|
|
9
|
+
health: {
|
|
10
|
+
retrieve: ()=>Promise.resolve({
|
|
11
|
+
ok: false
|
|
12
|
+
})
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
3
16
|
return new Typesense.Client({
|
|
4
17
|
apiKey: typesenseConfig.apiKey,
|
|
5
18
|
connectionTimeoutSeconds: typesenseConfig.connectionTimeoutSeconds || 2,
|
|
6
19
|
nodes: typesenseConfig.nodes.map((node)=>({
|
|
7
20
|
...node,
|
|
8
|
-
port: typeof node.port ===
|
|
21
|
+
port: typeof node.port === "string" ? parseInt(node.port) : node.port
|
|
9
22
|
}))
|
|
10
23
|
});
|
|
11
24
|
};
|
|
@@ -13,8 +26,7 @@ export const testTypesenseConnection = async (client)=>{
|
|
|
13
26
|
try {
|
|
14
27
|
await client.health.retrieve();
|
|
15
28
|
return true;
|
|
16
|
-
} catch
|
|
17
|
-
// Handle Typesense connection error
|
|
29
|
+
} catch {
|
|
18
30
|
return false;
|
|
19
31
|
}
|
|
20
32
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rubixstudios/payload-typesense",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "A production-ready search plugin that integrates Typesense with Payload CMS, offering fast, typo-tolerant search with real-time synchronization. This fork by Rubix Studios reduces bloat and introduces targeted changes for improved performance, maintainability, and flexibility.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Rubix Studios <hello@rubixstudios.com.au> (https://rubixstudios.com.au)",
|