@beignet/core 0.0.13 → 0.0.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/CHANGELOG.md +28 -0
- package/README.md +198 -2
- package/dist/entitlements/index.d.ts +234 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +172 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/error-reporting/index.d.ts +131 -0
- package/dist/error-reporting/index.d.ts.map +1 -0
- package/dist/error-reporting/index.js +112 -0
- package/dist/error-reporting/index.js.map +1 -0
- package/dist/flags/index.d.ts +293 -0
- package/dist/flags/index.d.ts.map +1 -0
- package/dist/flags/index.js +204 -0
- package/dist/flags/index.js.map +1 -0
- package/dist/locks/index.d.ts +155 -0
- package/dist/locks/index.d.ts.map +1 -0
- package/dist/locks/index.js +248 -0
- package/dist/locks/index.js.map +1 -0
- package/dist/payments/index.d.ts +430 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +230 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/ports/index.d.ts +74 -1
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +38 -0
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/policy.d.ts +104 -0
- package/dist/ports/policy.d.ts.map +1 -1
- package/dist/ports/policy.js +102 -7
- package/dist/ports/policy.js.map +1 -1
- package/dist/search/index.d.ts +175 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +344 -0
- package/dist/search/index.js.map +1 -0
- package/dist/server/hooks/error-reporting.d.ts +79 -0
- package/dist/server/hooks/error-reporting.d.ts.map +1 -0
- package/dist/server/hooks/error-reporting.js +147 -0
- package/dist/server/hooks/error-reporting.js.map +1 -0
- package/dist/server/hooks/index.d.ts +1 -0
- package/dist/server/hooks/index.d.ts.map +1 -1
- package/dist/server/hooks/index.js +1 -0
- package/dist/server/hooks/index.js.map +1 -1
- package/dist/server/server.d.ts +5 -0
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +9 -1
- package/dist/server/server.js.map +1 -1
- package/dist/server/use-case-route.d.ts +2 -2
- package/dist/testing/index.d.ts +46 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +33 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/webhooks/index.d.ts +195 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +313 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +29 -1
- package/src/entitlements/index.ts +479 -0
- package/src/error-reporting/index.ts +273 -0
- package/src/flags/index.ts +608 -0
- package/src/locks/index.ts +440 -0
- package/src/payments/index.ts +699 -0
- package/src/ports/index.ts +231 -0
- package/src/ports/policy.ts +272 -7
- package/src/search/index.ts +632 -0
- package/src/server/hooks/error-reporting.ts +249 -0
- package/src/server/hooks/index.ts +8 -0
- package/src/server/server.ts +20 -0
- package/src/server/use-case-route.ts +2 -2
- package/src/testing/index.ts +83 -1
- package/src/webhooks/index.ts +555 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/search
|
|
3
|
+
*
|
|
4
|
+
* Provider-neutral search primitives for Beignet applications.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Primitive values accepted in indexed documents and provider-neutral filters.
|
|
8
|
+
*/
|
|
9
|
+
export type SearchPrimitive = null | boolean | number | string;
|
|
10
|
+
/**
|
|
11
|
+
* JSON-like values accepted in indexed documents.
|
|
12
|
+
*/
|
|
13
|
+
export type SearchValue = SearchPrimitive | readonly SearchValue[] | {
|
|
14
|
+
readonly [key: string]: SearchValue;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Minimal document shape accepted by search indexes.
|
|
18
|
+
*/
|
|
19
|
+
export type SearchDocumentBase = {
|
|
20
|
+
id: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* General search document shape.
|
|
24
|
+
*/
|
|
25
|
+
export type SearchDocument = SearchDocumentBase & {
|
|
26
|
+
readonly [field: string]: SearchValue | undefined;
|
|
27
|
+
};
|
|
28
|
+
type SearchField<TDocument extends SearchDocumentBase> = Extract<keyof TDocument, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Provider-neutral index definition.
|
|
31
|
+
*/
|
|
32
|
+
export type SearchIndexDef<TDocument extends SearchDocumentBase = SearchDocument> = {
|
|
33
|
+
name: string;
|
|
34
|
+
primaryKey: SearchField<TDocument>;
|
|
35
|
+
searchableAttributes?: readonly SearchField<TDocument>[];
|
|
36
|
+
filterableAttributes?: readonly SearchField<TDocument>[];
|
|
37
|
+
sortableAttributes?: readonly SearchField<TDocument>[];
|
|
38
|
+
displayedAttributes?: readonly SearchField<TDocument>[];
|
|
39
|
+
metadata?: Record<string, unknown>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Options accepted when defining a search index.
|
|
43
|
+
*/
|
|
44
|
+
export type DefineSearchIndexOptions<TDocument extends SearchDocumentBase> = Omit<SearchIndexDef<TDocument>, "name" | "primaryKey"> & {
|
|
45
|
+
primaryKey?: SearchField<TDocument>;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Provider-neutral filter values.
|
|
49
|
+
*/
|
|
50
|
+
export type SearchFilterValue = SearchPrimitive | readonly Exclude<SearchPrimitive, null>[];
|
|
51
|
+
/**
|
|
52
|
+
* Provider-neutral exact-match filters.
|
|
53
|
+
*/
|
|
54
|
+
export type SearchFilters = Record<string, SearchFilterValue>;
|
|
55
|
+
/**
|
|
56
|
+
* Provider-neutral sort expression. Use `field:asc` or `field:desc`.
|
|
57
|
+
*/
|
|
58
|
+
export type SearchSort = `${string}:asc` | `${string}:desc` | (string & {});
|
|
59
|
+
/**
|
|
60
|
+
* Query accepted by search providers.
|
|
61
|
+
*/
|
|
62
|
+
export type SearchQuery = {
|
|
63
|
+
query?: string;
|
|
64
|
+
filters?: SearchFilters;
|
|
65
|
+
sort?: readonly SearchSort[];
|
|
66
|
+
facets?: readonly string[];
|
|
67
|
+
limit?: number;
|
|
68
|
+
offset?: number;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Page metadata returned from search providers.
|
|
72
|
+
*/
|
|
73
|
+
export type SearchResultPage = {
|
|
74
|
+
kind: "offset";
|
|
75
|
+
limit: number;
|
|
76
|
+
offset: number;
|
|
77
|
+
total?: number;
|
|
78
|
+
hasMore: boolean;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Search result payload.
|
|
82
|
+
*/
|
|
83
|
+
export type SearchResults<TDocument extends SearchDocumentBase> = {
|
|
84
|
+
hits: TDocument[];
|
|
85
|
+
query: string;
|
|
86
|
+
page: SearchResultPage;
|
|
87
|
+
processingTimeMs?: number;
|
|
88
|
+
facets?: Record<string, Record<string, number>>;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Result returned after indexing documents.
|
|
92
|
+
*/
|
|
93
|
+
export type SearchIndexResult = {
|
|
94
|
+
indexed: number;
|
|
95
|
+
taskId?: string | number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Result returned after deleting indexed documents.
|
|
99
|
+
*/
|
|
100
|
+
export type SearchDeleteResult = {
|
|
101
|
+
deleted: number;
|
|
102
|
+
taskId?: string | number;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* App-facing search port.
|
|
106
|
+
*/
|
|
107
|
+
export type SearchPort = {
|
|
108
|
+
configureIndex<TDocument extends SearchDocumentBase>(index: SearchIndexDef<TDocument>): Promise<void>;
|
|
109
|
+
indexDocuments<TDocument extends SearchDocumentBase>(index: SearchIndexDef<TDocument>, documents: TDocument | readonly TDocument[]): Promise<SearchIndexResult>;
|
|
110
|
+
deleteDocuments<TDocument extends SearchDocumentBase>(index: SearchIndexDef<TDocument>, ids: string | readonly string[]): Promise<SearchDeleteResult>;
|
|
111
|
+
clearIndex<TDocument extends SearchDocumentBase>(index: SearchIndexDef<TDocument>): Promise<SearchDeleteResult>;
|
|
112
|
+
search<TDocument extends SearchDocumentBase>(index: SearchIndexDef<TDocument>, query: SearchQuery): Promise<SearchResults<TDocument>>;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Captured memory index state exposed for tests.
|
|
116
|
+
*/
|
|
117
|
+
export type MemorySearchIndexState<TDocument extends SearchDocumentBase = SearchDocument> = {
|
|
118
|
+
definition?: SearchIndexDef<TDocument>;
|
|
119
|
+
documents: Map<string, TDocument>;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* In-memory search port exposed for assertions in tests.
|
|
123
|
+
*/
|
|
124
|
+
export type MemorySearchPort = SearchPort & {
|
|
125
|
+
indexes: Map<string, MemorySearchIndexState>;
|
|
126
|
+
reset(index?: SearchIndexDef): void;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Options for the in-memory search adapter.
|
|
130
|
+
*/
|
|
131
|
+
export type CreateMemorySearchOptions = {
|
|
132
|
+
now?: () => Date;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Options for the in-memory search provider.
|
|
136
|
+
*/
|
|
137
|
+
export type MemorySearchProviderOptions = CreateMemorySearchOptions & {
|
|
138
|
+
name?: string;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Ports contributed by the memory search provider.
|
|
142
|
+
*/
|
|
143
|
+
export interface MemorySearchProviderPorts {
|
|
144
|
+
search: SearchPort;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Error thrown when search inputs are invalid.
|
|
148
|
+
*/
|
|
149
|
+
export declare class SearchOptionsError extends Error {
|
|
150
|
+
constructor(message: string);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Define a typed search index.
|
|
154
|
+
*/
|
|
155
|
+
export declare function defineSearchIndex<TDocument extends SearchDocumentBase = SearchDocument>(name: string, options?: DefineSearchIndexOptions<TDocument>): SearchIndexDef<TDocument>;
|
|
156
|
+
/**
|
|
157
|
+
* Index documents through any `SearchPort`.
|
|
158
|
+
*/
|
|
159
|
+
export declare function indexSearchDocuments<TDocument extends SearchDocumentBase>(search: SearchPort, index: SearchIndexDef<TDocument>, documents: TDocument | readonly TDocument[]): Promise<SearchIndexResult>;
|
|
160
|
+
/**
|
|
161
|
+
* Query documents through any `SearchPort`.
|
|
162
|
+
*/
|
|
163
|
+
export declare function searchDocuments<TDocument extends SearchDocumentBase>(search: SearchPort, index: SearchIndexDef<TDocument>, query: SearchQuery): Promise<SearchResults<TDocument>>;
|
|
164
|
+
/**
|
|
165
|
+
* Create an in-memory search port for tests and single-process development.
|
|
166
|
+
*/
|
|
167
|
+
export declare function createMemorySearch(_options?: CreateMemorySearchOptions): MemorySearchPort;
|
|
168
|
+
/**
|
|
169
|
+
* Create a provider that contributes an in-memory search port.
|
|
170
|
+
*/
|
|
171
|
+
export declare function createMemorySearchProvider(options?: MemorySearchProviderOptions): import("../providers/provider.js").ServiceProvider<unknown, import("@standard-schema/spec").StandardSchemaV1<void, void>, {
|
|
172
|
+
search: SearchPort;
|
|
173
|
+
}, unknown, void>;
|
|
174
|
+
export {};
|
|
175
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/search
|
|
3
|
+
*
|
|
4
|
+
* Provider-neutral search primitives for Beignet applications.
|
|
5
|
+
*/
|
|
6
|
+
import { createProvider, createProviderInstrumentation, } from "../providers/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when search inputs are invalid.
|
|
9
|
+
*/
|
|
10
|
+
export class SearchOptionsError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "SearchOptionsError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Define a typed search index.
|
|
18
|
+
*/
|
|
19
|
+
export function defineSearchIndex(name, options = {}) {
|
|
20
|
+
if (!name)
|
|
21
|
+
throw new SearchOptionsError("Search index name is required.");
|
|
22
|
+
return {
|
|
23
|
+
name,
|
|
24
|
+
primaryKey: options.primaryKey ?? "id",
|
|
25
|
+
searchableAttributes: options.searchableAttributes,
|
|
26
|
+
filterableAttributes: options.filterableAttributes,
|
|
27
|
+
sortableAttributes: options.sortableAttributes,
|
|
28
|
+
displayedAttributes: options.displayedAttributes,
|
|
29
|
+
metadata: options.metadata,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Index documents through any `SearchPort`.
|
|
34
|
+
*/
|
|
35
|
+
export function indexSearchDocuments(search, index, documents) {
|
|
36
|
+
return search.indexDocuments(index, documents);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Query documents through any `SearchPort`.
|
|
40
|
+
*/
|
|
41
|
+
export function searchDocuments(search, index, query) {
|
|
42
|
+
return search.search(index, query);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create an in-memory search port for tests and single-process development.
|
|
46
|
+
*/
|
|
47
|
+
export function createMemorySearch(_options = {}) {
|
|
48
|
+
const indexes = new Map();
|
|
49
|
+
const port = {
|
|
50
|
+
indexes,
|
|
51
|
+
async configureIndex(index) {
|
|
52
|
+
validateIndex(index);
|
|
53
|
+
stateFor(indexes, index).definition = index;
|
|
54
|
+
},
|
|
55
|
+
async indexDocuments(index, documents) {
|
|
56
|
+
validateIndex(index);
|
|
57
|
+
const state = stateFor(indexes, index);
|
|
58
|
+
state.definition = state.definition ?? index;
|
|
59
|
+
const list = Array.isArray(documents) ? documents : [documents];
|
|
60
|
+
for (const document of list) {
|
|
61
|
+
validateDocument(index, document);
|
|
62
|
+
state.documents.set(String(document[index.primaryKey]), clone(document));
|
|
63
|
+
}
|
|
64
|
+
return { indexed: list.length };
|
|
65
|
+
},
|
|
66
|
+
async deleteDocuments(index, ids) {
|
|
67
|
+
validateIndex(index);
|
|
68
|
+
const state = stateFor(indexes, index);
|
|
69
|
+
const list = Array.isArray(ids) ? ids : [ids];
|
|
70
|
+
let deleted = 0;
|
|
71
|
+
for (const id of list) {
|
|
72
|
+
if (state.documents.delete(id))
|
|
73
|
+
deleted++;
|
|
74
|
+
}
|
|
75
|
+
return { deleted };
|
|
76
|
+
},
|
|
77
|
+
async clearIndex(index) {
|
|
78
|
+
validateIndex(index);
|
|
79
|
+
const state = stateFor(indexes, index);
|
|
80
|
+
const deleted = state.documents.size;
|
|
81
|
+
state.documents.clear();
|
|
82
|
+
return { deleted };
|
|
83
|
+
},
|
|
84
|
+
async search(index, query) {
|
|
85
|
+
validateIndex(index);
|
|
86
|
+
validateQuery(query);
|
|
87
|
+
const state = stateFor(indexes, index);
|
|
88
|
+
const effectiveIndex = state.definition ?? index;
|
|
89
|
+
const queryText = query.query?.trim() ?? "";
|
|
90
|
+
const limit = query.limit ?? 20;
|
|
91
|
+
const offset = query.offset ?? 0;
|
|
92
|
+
const filtered = [...state.documents.values()]
|
|
93
|
+
.filter((document) => matchesFilters(document, query.filters))
|
|
94
|
+
.filter((document) => matchesQuery(document, effectiveIndex, queryText));
|
|
95
|
+
const sorted = sortDocuments(filtered, query.sort);
|
|
96
|
+
const hits = sorted.slice(offset, offset + limit).map(clone);
|
|
97
|
+
return {
|
|
98
|
+
hits,
|
|
99
|
+
query: queryText,
|
|
100
|
+
page: {
|
|
101
|
+
kind: "offset",
|
|
102
|
+
limit,
|
|
103
|
+
offset,
|
|
104
|
+
total: filtered.length,
|
|
105
|
+
hasMore: offset + hits.length < filtered.length,
|
|
106
|
+
},
|
|
107
|
+
facets: buildFacets(sorted, query.facets),
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
reset(index) {
|
|
111
|
+
if (index) {
|
|
112
|
+
indexes.delete(index.name);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
indexes.clear();
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
return port;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Create a provider that contributes an in-memory search port.
|
|
122
|
+
*/
|
|
123
|
+
export function createMemorySearchProvider(options = {}) {
|
|
124
|
+
const { name = "memory-search", ...searchOptions } = options;
|
|
125
|
+
return createProvider({
|
|
126
|
+
name,
|
|
127
|
+
metadata: {
|
|
128
|
+
ports: ["search"],
|
|
129
|
+
watchers: ["search"],
|
|
130
|
+
},
|
|
131
|
+
setup({ ports }) {
|
|
132
|
+
const instrumentation = createProviderInstrumentation(ports, {
|
|
133
|
+
providerName: name,
|
|
134
|
+
watcher: "search",
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
ports: {
|
|
138
|
+
search: instrumentSearch(createMemorySearch(searchOptions), instrumentation),
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
function instrumentSearch(search, instrumentation) {
|
|
145
|
+
return {
|
|
146
|
+
async configureIndex(index) {
|
|
147
|
+
const startedAt = Date.now();
|
|
148
|
+
await search.configureIndex(index);
|
|
149
|
+
instrumentation.custom({
|
|
150
|
+
name: "search.configureIndex",
|
|
151
|
+
label: "Search index configured",
|
|
152
|
+
summary: index.name,
|
|
153
|
+
details: { index: index.name, durationMs: Date.now() - startedAt },
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
async indexDocuments(index, documents) {
|
|
157
|
+
const startedAt = Date.now();
|
|
158
|
+
const result = await search.indexDocuments(index, documents);
|
|
159
|
+
instrumentation.custom({
|
|
160
|
+
name: "search.indexDocuments",
|
|
161
|
+
label: "Search documents indexed",
|
|
162
|
+
summary: `${index.name}: ${result.indexed}`,
|
|
163
|
+
details: {
|
|
164
|
+
index: index.name,
|
|
165
|
+
indexed: result.indexed,
|
|
166
|
+
durationMs: Date.now() - startedAt,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
return result;
|
|
170
|
+
},
|
|
171
|
+
async deleteDocuments(index, ids) {
|
|
172
|
+
const startedAt = Date.now();
|
|
173
|
+
const result = await search.deleteDocuments(index, ids);
|
|
174
|
+
instrumentation.custom({
|
|
175
|
+
name: "search.deleteDocuments",
|
|
176
|
+
label: "Search documents deleted",
|
|
177
|
+
summary: `${index.name}: ${result.deleted}`,
|
|
178
|
+
details: {
|
|
179
|
+
index: index.name,
|
|
180
|
+
deleted: result.deleted,
|
|
181
|
+
durationMs: Date.now() - startedAt,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
return result;
|
|
185
|
+
},
|
|
186
|
+
async clearIndex(index) {
|
|
187
|
+
const startedAt = Date.now();
|
|
188
|
+
const result = await search.clearIndex(index);
|
|
189
|
+
instrumentation.custom({
|
|
190
|
+
name: "search.clearIndex",
|
|
191
|
+
label: "Search index cleared",
|
|
192
|
+
summary: `${index.name}: ${result.deleted}`,
|
|
193
|
+
details: {
|
|
194
|
+
index: index.name,
|
|
195
|
+
deleted: result.deleted,
|
|
196
|
+
durationMs: Date.now() - startedAt,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
return result;
|
|
200
|
+
},
|
|
201
|
+
async search(index, query) {
|
|
202
|
+
const startedAt = Date.now();
|
|
203
|
+
const result = await search.search(index, query);
|
|
204
|
+
instrumentation.custom({
|
|
205
|
+
name: "search.query",
|
|
206
|
+
label: "Search query",
|
|
207
|
+
summary: `${index.name}: ${result.query}`,
|
|
208
|
+
details: {
|
|
209
|
+
index: index.name,
|
|
210
|
+
query: result.query,
|
|
211
|
+
hits: result.hits.length,
|
|
212
|
+
total: result.page.total,
|
|
213
|
+
durationMs: Date.now() - startedAt,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
return result;
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function stateFor(indexes, index) {
|
|
221
|
+
let state = indexes.get(index.name);
|
|
222
|
+
if (!state) {
|
|
223
|
+
state = { documents: new Map() };
|
|
224
|
+
indexes.set(index.name, state);
|
|
225
|
+
}
|
|
226
|
+
return state;
|
|
227
|
+
}
|
|
228
|
+
function validateIndex(index) {
|
|
229
|
+
if (!index.name)
|
|
230
|
+
throw new SearchOptionsError("Search index name is required.");
|
|
231
|
+
if (!index.primaryKey) {
|
|
232
|
+
throw new SearchOptionsError("Search index primaryKey is required.");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function validateDocument(index, document) {
|
|
236
|
+
const id = document[index.primaryKey];
|
|
237
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
238
|
+
throw new SearchOptionsError(`Search document for index "${index.name}" must include a non-empty "${index.primaryKey}" string.`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function validateQuery(query) {
|
|
242
|
+
if (query.limit !== undefined &&
|
|
243
|
+
(!Number.isFinite(query.limit) ||
|
|
244
|
+
!Number.isInteger(query.limit) ||
|
|
245
|
+
query.limit < 1)) {
|
|
246
|
+
throw new SearchOptionsError("Search query limit must be a positive integer.");
|
|
247
|
+
}
|
|
248
|
+
if (query.offset !== undefined &&
|
|
249
|
+
(!Number.isFinite(query.offset) ||
|
|
250
|
+
!Number.isInteger(query.offset) ||
|
|
251
|
+
query.offset < 0)) {
|
|
252
|
+
throw new SearchOptionsError("Search query offset must be a zero or greater integer.");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function matchesFilters(document, filters) {
|
|
256
|
+
if (!filters)
|
|
257
|
+
return true;
|
|
258
|
+
return Object.entries(filters).every(([field, expected]) => {
|
|
259
|
+
const actual = document[field];
|
|
260
|
+
return matchesFilterValue(actual, expected);
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function matchesFilterValue(actual, expected) {
|
|
264
|
+
if (Array.isArray(expected)) {
|
|
265
|
+
if (Array.isArray(actual)) {
|
|
266
|
+
return actual.some((entry) => expected.some((expectedEntry) => expectedEntry === entry));
|
|
267
|
+
}
|
|
268
|
+
return expected.some((entry) => entry === actual);
|
|
269
|
+
}
|
|
270
|
+
if (Array.isArray(actual)) {
|
|
271
|
+
return actual.some((entry) => entry === expected);
|
|
272
|
+
}
|
|
273
|
+
return actual === expected;
|
|
274
|
+
}
|
|
275
|
+
function matchesQuery(document, index, query) {
|
|
276
|
+
if (!query)
|
|
277
|
+
return true;
|
|
278
|
+
const needle = query.toLowerCase();
|
|
279
|
+
const fields = index.searchableAttributes ??
|
|
280
|
+
Object.keys(document);
|
|
281
|
+
return fields.some((field) => searchableText(document[field])
|
|
282
|
+
.toLowerCase()
|
|
283
|
+
.includes(needle));
|
|
284
|
+
}
|
|
285
|
+
function sortDocuments(documents, sort) {
|
|
286
|
+
if (!sort || sort.length === 0)
|
|
287
|
+
return documents;
|
|
288
|
+
return [...documents].sort((left, right) => {
|
|
289
|
+
for (const expression of sort) {
|
|
290
|
+
const [field, direction = "asc"] = expression.split(":");
|
|
291
|
+
const result = compareValues(left[field], right[field]);
|
|
292
|
+
if (result !== 0) {
|
|
293
|
+
return direction === "desc" ? -result : result;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return 0;
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
function compareValues(left, right) {
|
|
300
|
+
if (left === right)
|
|
301
|
+
return 0;
|
|
302
|
+
if (left === undefined || left === null)
|
|
303
|
+
return 1;
|
|
304
|
+
if (right === undefined || right === null)
|
|
305
|
+
return -1;
|
|
306
|
+
if (typeof left === "number" && typeof right === "number") {
|
|
307
|
+
return left - right;
|
|
308
|
+
}
|
|
309
|
+
return String(left).localeCompare(String(right));
|
|
310
|
+
}
|
|
311
|
+
function buildFacets(documents, facets) {
|
|
312
|
+
if (!facets || facets.length === 0)
|
|
313
|
+
return undefined;
|
|
314
|
+
const result = {};
|
|
315
|
+
for (const facet of facets) {
|
|
316
|
+
const counts = {};
|
|
317
|
+
for (const document of documents) {
|
|
318
|
+
const value = document[facet];
|
|
319
|
+
const values = Array.isArray(value) ? value : [value];
|
|
320
|
+
for (const entry of values) {
|
|
321
|
+
if (entry === undefined || entry === null)
|
|
322
|
+
continue;
|
|
323
|
+
const key = String(entry);
|
|
324
|
+
counts[key] = (counts[key] ?? 0) + 1;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
result[facet] = counts;
|
|
328
|
+
}
|
|
329
|
+
return result;
|
|
330
|
+
}
|
|
331
|
+
function searchableText(value) {
|
|
332
|
+
if (value === undefined || value === null)
|
|
333
|
+
return "";
|
|
334
|
+
if (Array.isArray(value))
|
|
335
|
+
return value.map(searchableText).join(" ");
|
|
336
|
+
if (typeof value === "object") {
|
|
337
|
+
return Object.values(value).map(searchableText).join(" ");
|
|
338
|
+
}
|
|
339
|
+
return String(value);
|
|
340
|
+
}
|
|
341
|
+
function clone(value) {
|
|
342
|
+
return JSON.parse(JSON.stringify(value));
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error reporting hook utilities for @beignet/core/server
|
|
3
|
+
*/
|
|
4
|
+
import type { HttpContractConfig } from "../../contracts/index.js";
|
|
5
|
+
import type { ErrorReporterPort, ErrorReportOptions } from "../../error-reporting/index.js";
|
|
6
|
+
import type { HttpRequestLike, ServerCaughtErrorHook, ServerHook } from "../types.js";
|
|
7
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
8
|
+
/**
|
|
9
|
+
* Minimal context shape used by `createErrorReportingHooks(...)`.
|
|
10
|
+
*/
|
|
11
|
+
export type ErrorReportingContext = {
|
|
12
|
+
ports?: {
|
|
13
|
+
errorReporter?: ErrorReporterPort;
|
|
14
|
+
};
|
|
15
|
+
requestId?: string;
|
|
16
|
+
traceId?: string;
|
|
17
|
+
spanId?: string;
|
|
18
|
+
parentSpanId?: string;
|
|
19
|
+
traceparent?: string;
|
|
20
|
+
actor?: {
|
|
21
|
+
type?: string;
|
|
22
|
+
id?: string;
|
|
23
|
+
};
|
|
24
|
+
tenant?: {
|
|
25
|
+
id?: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Arguments passed to error reporting hook callbacks.
|
|
30
|
+
*/
|
|
31
|
+
export type ErrorReportingHookArgs<Ctx> = Parameters<ServerCaughtErrorHook<Ctx>>[0];
|
|
32
|
+
/**
|
|
33
|
+
* Error reporter resolver accepted by `createErrorReportingHooks(...)`.
|
|
34
|
+
*/
|
|
35
|
+
export type ErrorReporterResolver<Ctx> = (args: ErrorReportingHookArgs<Ctx>) => MaybePromise<ErrorReporterPort | undefined>;
|
|
36
|
+
/**
|
|
37
|
+
* Options accepted by `createErrorReportingHooks(...)`.
|
|
38
|
+
*/
|
|
39
|
+
export interface ErrorReportingHooksOptions<Ctx> {
|
|
40
|
+
/**
|
|
41
|
+
* Reporter to use instead of `ctx.ports.errorReporter`.
|
|
42
|
+
*/
|
|
43
|
+
reporter?: ErrorReporterPort | ErrorReporterResolver<Ctx>;
|
|
44
|
+
/**
|
|
45
|
+
* Decide whether a caught error should be captured. The default reports
|
|
46
|
+
* unexpected failures and skips expected catalog/auth/validation outcomes.
|
|
47
|
+
*/
|
|
48
|
+
shouldReport?: (args: ErrorReportingHookArgs<Ctx>) => MaybePromise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Additional capture options. These are merged over Beignet's request,
|
|
51
|
+
* actor, tenant, contract, and trace metadata.
|
|
52
|
+
*/
|
|
53
|
+
reportOptions?: ErrorReportOptions | ((args: ErrorReportingHookArgs<Ctx>) => MaybePromise<ErrorReportOptions>);
|
|
54
|
+
/**
|
|
55
|
+
* Observer for reporter failures. Reporter failures are otherwise ignored so
|
|
56
|
+
* error reporting cannot change the HTTP response.
|
|
57
|
+
*/
|
|
58
|
+
onReporterError?: (args: {
|
|
59
|
+
error: unknown;
|
|
60
|
+
reportingError: unknown;
|
|
61
|
+
ctx?: Ctx;
|
|
62
|
+
req: HttpRequestLike;
|
|
63
|
+
contract: HttpContractConfig;
|
|
64
|
+
}) => MaybePromise<void>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create server hooks that capture unexpected HTTP request failures through
|
|
68
|
+
* `ctx.ports.errorReporter`.
|
|
69
|
+
*
|
|
70
|
+
* The hook observes `onCaughtError`, never maps responses, and ignores capture
|
|
71
|
+
* failures by default so reporting cannot affect request handling.
|
|
72
|
+
*/
|
|
73
|
+
export declare function createErrorReportingHooks<Ctx extends ErrorReportingContext = ErrorReportingContext>(config?: ErrorReportingHooksOptions<Ctx>): ServerHook<Ctx>;
|
|
74
|
+
/**
|
|
75
|
+
* Default filter for HTTP error reporting.
|
|
76
|
+
*/
|
|
77
|
+
export declare function shouldReportServerError(error: unknown): boolean;
|
|
78
|
+
export {};
|
|
79
|
+
//# sourceMappingURL=error-reporting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-reporting.d.ts","sourceRoot":"","sources":["../../../src/server/hooks/error-reporting.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AAYxC,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,CAAC,EAAE;QACN,aAAa,CAAC,EAAE,iBAAiB,CAAC;KACnC,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,MAAM,CAAC,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,CAAC,GAAG,IAAI,UAAU,CAClD,qBAAqB,CAAC,GAAG,CAAC,CAC3B,CAAC,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,GAAG,IAAI,CACvC,IAAI,EAAE,sBAAsB,CAAC,GAAG,CAAC,KAC9B,YAAY,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,0BAA0B,CAAC,GAAG;IAC7C;;OAEG;IACH,QAAQ,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC1D;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,sBAAsB,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5E;;;OAGG;IACH,aAAa,CAAC,EACV,kBAAkB,GAClB,CAAC,CAAC,IAAI,EAAE,sBAAsB,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC9E;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QACvB,KAAK,EAAE,OAAO,CAAC;QACf,cAAc,EAAE,OAAO,CAAC;QACxB,GAAG,CAAC,EAAE,GAAG,CAAC;QACV,GAAG,EAAE,eAAe,CAAC;QACrB,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,SAAS,qBAAqB,GAAG,qBAAqB,EACzD,MAAM,GAAE,0BAA0B,CAAC,GAAG,CAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAsC/D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU/D"}
|