annosearch 0.2.3 → 0.2.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/README.md +9 -4
- package/dist/AnnoSearch.js +6 -0
- package/dist/AnnoSearch.js.map +1 -1
- package/dist/delete.js +9 -2
- package/dist/delete.js.map +1 -1
- package/dist/iiif.js +7 -0
- package/dist/iiif.js.map +1 -1
- package/dist/index-config.yaml +0 -4
- package/dist/init.js +9 -3
- package/dist/init.js.map +1 -1
- package/dist/load.js +69 -22
- package/dist/load.js.map +1 -1
- package/dist/search.js +26 -4
- package/dist/search.js.map +1 -1
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -1
- package/dist/validate.js +32 -4
- package/dist/validate.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -10,13 +10,13 @@ AnnoSearch uses [Quickwit](https://quickwit.io) as its backend database to effic
|
|
|
10
10
|
We first need to create an index.
|
|
11
11
|
```
|
|
12
12
|
❯ annosearch init --index cookbook
|
|
13
|
-
Index created successfully
|
|
13
|
+
Index cookbook created successfully
|
|
14
14
|
```
|
|
15
15
|
We can now load the index with the annotations referenced in a IIIF manifest.
|
|
16
16
|
```
|
|
17
17
|
❯ annosearch load --index cookbook --type Manifest --uri https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json
|
|
18
18
|
Loading Manifest from https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json into index cookbook
|
|
19
|
-
|
|
19
|
+
Data loaded successfully
|
|
20
20
|
```
|
|
21
21
|
After Quickwit finishes ingesting and indexing the data we can perform a search.
|
|
22
22
|
```
|
|
@@ -36,7 +36,13 @@ After Quickwit finishes ingesting and indexing the data we can perform a search.
|
|
|
36
36
|
},
|
|
37
37
|
"id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1/annopage-2/anno-1",
|
|
38
38
|
"motivation": "commenting",
|
|
39
|
-
"target":
|
|
39
|
+
"target": {
|
|
40
|
+
"id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/canvas-1",
|
|
41
|
+
"partOf": {
|
|
42
|
+
"id": "https://iiif.io/api/cookbook/recipe/0266-full-canvas-annotation/manifest.json",
|
|
43
|
+
"type": "Manifest"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
40
46
|
"type": "Annotation"
|
|
41
47
|
}
|
|
42
48
|
]
|
|
@@ -134,7 +140,6 @@ Adjust these values as needed to customize AnnoSearch’s configuration and beha
|
|
|
134
140
|
|
|
135
141
|
## Todo
|
|
136
142
|
|
|
137
|
-
- Implement the autocomplete service
|
|
138
143
|
- Implement extended API responses
|
|
139
144
|
|
|
140
145
|
|
package/dist/AnnoSearch.js
CHANGED
|
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const search_1 = require("./search");
|
|
13
|
+
const search_2 = require("./search");
|
|
13
14
|
const init_1 = require("./init");
|
|
14
15
|
const delete_1 = require("./delete");
|
|
15
16
|
const load_1 = require("./load");
|
|
@@ -62,6 +63,11 @@ class AnnoSearch {
|
|
|
62
63
|
return (0, search_1.searchIndex)(indexId, query, motivation, this.maxHits, page, this.searchUrl, date, user);
|
|
63
64
|
});
|
|
64
65
|
}
|
|
66
|
+
searchAutocomplete(indexId, query, ignoredParams) {
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
return yield (0, search_2.searchAutocomplete)(indexId, query, this.maxHits, this.searchUrl, ignoredParams);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
65
71
|
initIndex(indexId) {
|
|
66
72
|
return __awaiter(this, void 0, void 0, function* () {
|
|
67
73
|
return yield (0, init_1.initIndex)(indexId);
|
package/dist/AnnoSearch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnoSearch.js","sourceRoot":"","sources":["../src/AnnoSearch.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,qCAAyD;AACzD,iCAAmD;AACnD,qCAAyD;AACzD,iCAAmD;AASnD,SAAS,UAAU;IACf,OAAO;QACH,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC;QAC1D,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC;QACrD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW;QAChD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,uBAAuB;KAC1E,CAAC;AACN,CAAC;AAED,MAAM,UAAU;IAMZ,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,KAAa,UAAU,EAAE;QACjE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,OAAe;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,YAAY,CAAC,SAAiB;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAEK,SAAS,CAAC,OAAe,EAAE,GAAW,EAAE,IAAY,EAAE,MAAe;;YACvE,OAAO,MAAM,IAAA,gBAAY,EAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;KAAA;IAEK,WAAW,CAAC,OAAe,EAAE,KAAa,EAAE,UAAkB,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY;;YAC1G,OAAO,IAAA,oBAAc,EAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtG,CAAC;KAAA;IAEK,SAAS,CAAC,OAAe;;YAC3B,OAAO,MAAM,IAAA,gBAAY,EAAC,OAAO,CAAC,CAAC;QACvC,CAAC;KAAA;IAEK,WAAW,CAAC,OAAe;;YAC7B,OAAO,MAAM,IAAA,oBAAc,EAAC,OAAO,CAAC,CAAC;QACzC,CAAC;KAAA;CACJ;AAED,kBAAe,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"AnnoSearch.js","sourceRoot":"","sources":["../src/AnnoSearch.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,qCAAyD;AACzD,qCAAsE;AACtE,iCAAmD;AACnD,qCAAyD;AACzD,iCAAmD;AASnD,SAAS,UAAU;IACf,OAAO;QACH,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC;QAC1D,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC;QACrD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,WAAW;QAChD,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,uBAAuB;KAC1E,CAAC;AACN,CAAC;AAED,MAAM,UAAU;IAMZ,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,KAAa,UAAU,EAAE;QACjE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,IAAY;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,OAAe;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,YAAY,CAAC,SAAiB;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAEK,SAAS,CAAC,OAAe,EAAE,GAAW,EAAE,IAAY,EAAE,MAAe;;YACvE,OAAO,MAAM,IAAA,gBAAY,EAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;KAAA;IAEK,WAAW,CAAC,OAAe,EAAE,KAAa,EAAE,UAAkB,EAAE,IAAY,EAAE,IAAY,EAAE,IAAY;;YAC1G,OAAO,IAAA,oBAAc,EAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACtG,CAAC;KAAA;IAEK,kBAAkB,CAAC,OAAe,EAAE,KAAa,EAAE,aAAuB;;YAC5E,OAAO,MAAM,IAAA,2BAAoB,EAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACnG,CAAC;KAAA;IAEK,SAAS,CAAC,OAAe;;YAC3B,OAAO,MAAM,IAAA,gBAAY,EAAC,OAAO,CAAC,CAAC;QACvC,CAAC;KAAA;IAEK,WAAW,CAAC,OAAe;;YAC7B,OAAO,MAAM,IAAA,oBAAc,EAAC,OAAO,CAAC,CAAC;QACzC,CAAC;KAAA;CACJ;AAED,kBAAe,UAAU,CAAC"}
|
package/dist/delete.js
CHANGED
|
@@ -14,18 +14,25 @@ const quickwit_1 = require("./quickwit");
|
|
|
14
14
|
const errors_1 = require("./errors");
|
|
15
15
|
const contentType = 'application/json';
|
|
16
16
|
const quickwitClient = (0, quickwit_1.createClient)(contentType);
|
|
17
|
-
function
|
|
17
|
+
function deleteIndexWorker(indexId) {
|
|
18
18
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19
19
|
if (!indexId.trim()) {
|
|
20
20
|
throw new errors_1.AnnoSearchValidationError('Invalid index parameter');
|
|
21
21
|
}
|
|
22
22
|
const response = yield quickwitClient.delete(`indexes/${indexId}`);
|
|
23
23
|
if (response.status === 200 && response.data) {
|
|
24
|
-
console.log(
|
|
24
|
+
//console.log(`Index ${indexId} successfully deleted`);
|
|
25
25
|
}
|
|
26
26
|
else {
|
|
27
27
|
throw new errors_1.AnnoSearchValidationError('Failed to delete index');
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
+
function deleteIndex(indexId) {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
yield deleteIndexWorker(indexId + '_annotations');
|
|
34
|
+
yield deleteIndexWorker(indexId + '_autocomplete');
|
|
35
|
+
console.log(`Index ${indexId} successfully deleted`);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
31
38
|
//# sourceMappingURL=delete.js.map
|
package/dist/delete.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../src/delete.ts"],"names":[],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../src/delete.ts"],"names":[],"mappings":";;;;;;;;;;;AAkBA,kCAIC;AAtBD,yCAA0C;AAC1C,qCAAqD;AAErD,MAAM,WAAW,GAAG,kBAAkB,CAAC;AACvC,MAAM,cAAc,GAAG,IAAA,uBAAY,EAAC,WAAW,CAAC,CAAC;AAEjD,SAAe,iBAAiB,CAAC,OAAe;;QAC5C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,kCAAyB,CAAC,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,uDAAuD;QAC3D,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,kCAAyB,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;CAAA;AAED,SAAsB,WAAW,CAAC,OAAe;;QAC7C,MAAM,iBAAiB,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;QAClD,MAAM,iBAAiB,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,uBAAuB,CAAC,CAAC;IACzD,CAAC;CAAA"}
|
package/dist/iiif.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeSearchResponse = makeSearchResponse;
|
|
4
|
+
exports.makeAutocompleteResponse = makeAutocompleteResponse;
|
|
4
5
|
function makeSearchResponse(indexId, data, searchUrl, query, motivation, user, maxHits, page, date) {
|
|
5
6
|
const totalPages = Math.ceil(data.num_hits / maxHits);
|
|
6
7
|
const nextPage = page + 1 < totalPages ? page + 1 : null;
|
|
@@ -33,4 +34,10 @@ function makeSearchResponse(indexId, data, searchUrl, query, motivation, user, m
|
|
|
33
34
|
prev: prevPage !== null ? `${id}&page=${prevPage}` : undefined,
|
|
34
35
|
};
|
|
35
36
|
}
|
|
37
|
+
function makeAutocompleteResponse(data, searchUrl, query, ignoredParams) {
|
|
38
|
+
const response = Object.assign(Object.assign({ "@context": "http://iiif.io/api/search/2/context.json", id: `${searchUrl}/autocomplete?q=${encodeURIComponent(query)}`, type: "TermPage" }, (ignoredParams.length > 0 && { ignored: ignoredParams })), { items: data.hits.map((hit) => ({
|
|
39
|
+
value: hit.term
|
|
40
|
+
})) });
|
|
41
|
+
return response;
|
|
42
|
+
}
|
|
36
43
|
//# sourceMappingURL=iiif.js.map
|
package/dist/iiif.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iiif.js","sourceRoot":"","sources":["../src/iiif.ts"],"names":[],"mappings":";;AAEA,gDAkCC;
|
|
1
|
+
{"version":3,"file":"iiif.js","sourceRoot":"","sources":["../src/iiif.ts"],"names":[],"mappings":";;AAEA,gDAkCC;AAED,4DAYC;AAhDD,SAAgB,kBAAkB,CAAC,OAAe,EAAE,IAAS,EAAE,SAAiB,EAAE,KAAa,EAAE,UAAkB,EAAE,IAAY,EAAE,OAAe,EAAE,IAAY,EAAE,IAAY;IAC1K,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,OAAO,aAAa,UAAU,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;IAEtG,OAAO;QACH,UAAU,EAAE,0CAA0C;QACtD,EAAE,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE;QACxB,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,EAAE,EAAE,EAAE;YACN,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,KAAK,EAAE;gBACH,EAAE,EAAE,GAAG,EAAE,SAAS;gBAClB,IAAI,EAAE,gBAAgB;aACzB;YACD,IAAI,EAAE;gBACF,EAAE,EAAE,GAAG,EAAE,SAAS,UAAU,GAAG,CAAC,EAAE;gBAClC,IAAI,EAAE,gBAAgB;aACzB;SACJ,CAAC,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,IAAI,GAAG,OAAO;QAC1B,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,mBAC5B,GAAG,EACR,CAAC;QACH,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QAC9D,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACjE,CAAC;AACN,CAAC;AAED,SAAgB,wBAAwB,CAAC,IAAS,EAAE,SAAiB,EAAE,KAAa,EAAE,aAAuB;IACzG,MAAM,QAAQ,iCACV,UAAU,EAAE,0CAA0C,EACtD,EAAE,EAAE,GAAG,SAAS,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAC9D,IAAI,EAAE,UAAU,IACb,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,KAC3D,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAChC,KAAK,EAAE,GAAG,CAAC,IAAI;SAClB,CAAC,CAAC,GACN,CAAC;IAEF,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
package/dist/index-config.yaml
CHANGED
package/dist/init.js
CHANGED
|
@@ -30,8 +30,7 @@ function modifyConfig(config, indexId) {
|
|
|
30
30
|
config.index_id = indexId;
|
|
31
31
|
return yaml_1.default.stringify(config);
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
function initIndex(indexId) {
|
|
33
|
+
function initIndexWorker(indexId) {
|
|
35
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
36
35
|
if (!indexId.trim()) {
|
|
37
36
|
throw new errors_1.AnnoSearchValidationError('Invalid index parameter');
|
|
@@ -41,11 +40,18 @@ function initIndex(indexId) {
|
|
|
41
40
|
const modifiedYamlData = modifyConfig(config, indexId);
|
|
42
41
|
const response = yield quickwitClient.post('indexes', modifiedYamlData);
|
|
43
42
|
if (response.status === 200 && response.data) {
|
|
44
|
-
console.log(
|
|
43
|
+
//console.log(`Index ${indexId} created successfully`);
|
|
45
44
|
}
|
|
46
45
|
else {
|
|
47
46
|
throw new errors_1.AnnoSearchValidationError('Failed to create index');
|
|
48
47
|
}
|
|
49
48
|
});
|
|
50
49
|
}
|
|
50
|
+
function initIndex(indexId) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
yield initIndexWorker(indexId + '_annotations');
|
|
53
|
+
yield initIndexWorker(indexId + '_autocomplete');
|
|
54
|
+
console.log(`Index ${indexId} created successfully`);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
51
57
|
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAsCA,8BAIC;AA1CD,4CAAoB;AACpB,gDAAwB;AACxB,gDAAwB;AACxB,yCAA0C;AAC1C,qCAAqD;AAErD,MAAM,WAAW,GAAG,kBAAkB,CAAC;AACvC,MAAM,cAAc,GAAG,IAAA,uBAAY,EAAC,WAAW,CAAC,CAAC;AAEjD,2CAA2C;AAC3C,SAAS,cAAc,CAAC,QAAgB;IACpC,MAAM,QAAQ,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnD,OAAO,cAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,kEAAkE;AAClE,SAAS,YAAY,CAAC,MAAW,EAAE,OAAe;IAC9C,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,OAAO,cAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAGD,SAAe,eAAe,CAAC,OAAe;;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,kCAAyB,CAAC,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,uDAAuD;QAC3D,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,kCAAyB,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC;IAEL,CAAC;CAAA;AAED,SAAsB,SAAS,CAAC,OAAe;;QAC3C,MAAM,eAAe,CAAC,OAAO,GAAG,cAAc,CAAC,CAAC;QAChD,MAAM,eAAe,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,uBAAuB,CAAC,CAAC;IACzD,CAAC;CAAA"}
|
package/dist/load.js
CHANGED
|
@@ -16,8 +16,42 @@ const errors_1 = require("./errors");
|
|
|
16
16
|
const quickwit_1 = require("./quickwit");
|
|
17
17
|
const contentType = 'application/x-ndjson';
|
|
18
18
|
const quickwitClient = (0, quickwit_1.createClient)(contentType);
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const termFrequencies = new Map();
|
|
20
|
+
function* chunkMapToJson(map, chunkSize) {
|
|
21
|
+
let chunk = [];
|
|
22
|
+
for (const [term, frequency] of map.entries()) {
|
|
23
|
+
chunk.push({ term, frequency });
|
|
24
|
+
if (chunk.length === chunkSize) {
|
|
25
|
+
yield chunk;
|
|
26
|
+
chunk = [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (chunk.length > 0) {
|
|
30
|
+
yield chunk;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function ingestData(indexId, annotations, commit) {
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
if (annotations.length > 0) {
|
|
36
|
+
const payload = (0, utils_1.createJsonl)(annotations);
|
|
37
|
+
const url = commit ? `${indexId}/ingest?commit=force` : `${indexId}/ingest`;
|
|
38
|
+
const response = yield quickwitClient.post(url, payload);
|
|
39
|
+
if (!response.data) {
|
|
40
|
+
throw new errors_1.AnnoSearchValidationError('No response data received from Quickwit');
|
|
41
|
+
}
|
|
42
|
+
// Check if the response is successful and has data
|
|
43
|
+
if (response.status === 200 && response.data) {
|
|
44
|
+
// Print a line of '+' symbols based on the batch length
|
|
45
|
+
//console.log('writing to index ' + indexId);
|
|
46
|
+
//console.log('|' + '+'.repeat(annotations.length) + '|');
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw new errors_1.AnnoSearchValidationError('Failed to ingest data: Invalid response from Quickwit');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function modifyAnnotationTarget(parser, uri, type) {
|
|
21
55
|
const target = parser.getAnnotationTarget();
|
|
22
56
|
const partOf = {
|
|
23
57
|
id: uri,
|
|
@@ -42,9 +76,26 @@ function modifyAnnotationTarget(annotation, uri, type) {
|
|
|
42
76
|
return { target: modifySingleTarget(target) };
|
|
43
77
|
}
|
|
44
78
|
}
|
|
45
|
-
function
|
|
79
|
+
function incrementTerm(term) {
|
|
80
|
+
termFrequencies.set(term, (termFrequencies.get(term) || 0) + 1);
|
|
81
|
+
}
|
|
82
|
+
function processAutocompleteTerms(parser) {
|
|
83
|
+
for (const body of parser.iterateAnnotationPageAnnotationTextualBody()) {
|
|
84
|
+
for (const term of body.value.split(/\s+/)) {
|
|
85
|
+
const normalizedTerm = term
|
|
86
|
+
.trim()
|
|
87
|
+
.toLowerCase()
|
|
88
|
+
.replace(/[^a-z0-9\u00C0-\u024F]/g, ""); // Allow Unicode Latin characters
|
|
89
|
+
if (normalizedTerm.length > 3) {
|
|
90
|
+
incrementTerm(normalizedTerm);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function* processAnnotationsWorker(parser, uri, type) {
|
|
46
96
|
for (const annotation of parser.iterateAnnotationPageAnnotation()) {
|
|
47
|
-
const
|
|
97
|
+
const annotation_parser = new maniiifest_1.Maniiifest(annotation, "Annotation");
|
|
98
|
+
const modifiedTarget = modifyAnnotationTarget(annotation_parser, uri, type).target;
|
|
48
99
|
yield Object.assign(Object.assign({}, annotation), { target: modifiedTarget });
|
|
49
100
|
}
|
|
50
101
|
}
|
|
@@ -52,23 +103,9 @@ function processAnnotations(indexId, uri, type, parser, commit) {
|
|
|
52
103
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
104
|
let currentParser = parser;
|
|
54
105
|
while (currentParser) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const url = commit ? `${indexId}/ingest?commit=force` : `${indexId}/ingest`;
|
|
59
|
-
const response = yield quickwitClient.post(url, payload);
|
|
60
|
-
if (!response.data) {
|
|
61
|
-
throw new errors_1.AnnoSearchValidationError('No response data received from Quickwit');
|
|
62
|
-
}
|
|
63
|
-
// Check if the response is successful and has data
|
|
64
|
-
if (response.status === 200 && response.data) {
|
|
65
|
-
// Print a line of '+' symbols based on the batch length
|
|
66
|
-
console.log('|' + '+'.repeat(annotations.length) + '|');
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
throw new errors_1.AnnoSearchValidationError('Failed to ingest data: Invalid response from Quickwit');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
106
|
+
processAutocompleteTerms(currentParser);
|
|
107
|
+
const annotations = Array.from(processAnnotationsWorker(currentParser, uri, type));
|
|
108
|
+
yield ingestData(indexId + '_annotations', annotations, commit);
|
|
72
109
|
// Move to the next annotation page if available
|
|
73
110
|
const nextPageUrl = currentParser.getAnnotationPage().next;
|
|
74
111
|
if (nextPageUrl) {
|
|
@@ -154,13 +191,21 @@ function processAnnotationCollection(indexId, annotationCollectionUrl, commit) {
|
|
|
154
191
|
}
|
|
155
192
|
});
|
|
156
193
|
}
|
|
194
|
+
function ingestAutocompleteTerms(indexId, commit) {
|
|
195
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
196
|
+
const chunks = chunkMapToJson(termFrequencies, 1000);
|
|
197
|
+
for (const chunk of chunks) {
|
|
198
|
+
yield ingestData(indexId + '_autocomplete', chunk, commit);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
157
202
|
function loadIndex(indexId, uri, type, commit) {
|
|
158
203
|
return __awaiter(this, void 0, void 0, function* () {
|
|
159
204
|
if (!indexId.trim() || !uri.trim()) {
|
|
160
205
|
throw new errors_1.AnnoSearchValidationError('Invalid index or uri parameter');
|
|
161
206
|
}
|
|
162
207
|
// we won't allow loading data into an index that already contains data
|
|
163
|
-
const indexContents = yield quickwitClient.get(`/indexes/${indexId}/describe`);
|
|
208
|
+
const indexContents = yield quickwitClient.get(`/indexes/${indexId + '_annotations'}/describe`);
|
|
164
209
|
if (indexContents.data.num_published_docs > 0) {
|
|
165
210
|
throw new errors_1.AnnoSearchValidationError(`Index ${indexId} already contains data`);
|
|
166
211
|
}
|
|
@@ -178,6 +223,8 @@ function loadIndex(indexId, uri, type, commit) {
|
|
|
178
223
|
default:
|
|
179
224
|
throw new errors_1.AnnoSearchValidationError('unsupported type');
|
|
180
225
|
}
|
|
226
|
+
yield ingestAutocompleteTerms(indexId, commit);
|
|
227
|
+
console.log('Data loaded successfully');
|
|
181
228
|
});
|
|
182
229
|
}
|
|
183
230
|
//# sourceMappingURL=load.js.map
|
package/dist/load.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"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"}
|
package/dist/search.js
CHANGED
|
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.searchIndex = searchIndex;
|
|
13
|
+
exports.searchAutocomplete = searchAutocomplete;
|
|
13
14
|
const quickwit_1 = require("./quickwit");
|
|
14
15
|
const errors_1 = require("./errors");
|
|
15
16
|
const iiif_1 = require("./iiif");
|
|
@@ -38,7 +39,7 @@ function buildUserQueryFromString(userString) {
|
|
|
38
39
|
.map(user => `(creator:"${user}" OR creator.id:"${user}")`)
|
|
39
40
|
.join(" OR ");
|
|
40
41
|
}
|
|
41
|
-
function
|
|
42
|
+
function buildSearchQueryFromString(qString) {
|
|
42
43
|
const terms = qString.split(" ");
|
|
43
44
|
return terms
|
|
44
45
|
.map(term => `(body.value:"${term}")`)
|
|
@@ -47,20 +48,20 @@ function buildQFromString(qString) {
|
|
|
47
48
|
function searchIndex(indexId, q, motivation, maxHits, page, searchUrl, date, user) {
|
|
48
49
|
return __awaiter(this, void 0, void 0, function* () {
|
|
49
50
|
const startOffset = page * maxHits;
|
|
50
|
-
(0, validate_1.
|
|
51
|
+
(0, validate_1.validateSearchQueryParameter)(q);
|
|
51
52
|
(0, validate_1.validatePageNumber)(page);
|
|
52
53
|
(0, validate_1.validateMaxHits)(maxHits);
|
|
53
54
|
(0, validate_1.validateDateRanges)(date);
|
|
54
55
|
(0, validate_1.validateOffset)(startOffset);
|
|
55
56
|
(0, validate_1.validateMotivation)(motivation);
|
|
56
57
|
(0, validate_1.validateUser)(user);
|
|
57
|
-
const qQuery =
|
|
58
|
+
const qQuery = buildSearchQueryFromString(q);
|
|
58
59
|
const motivationQuery = motivation ? ` AND motivation:"${motivation}"` : '';
|
|
59
60
|
const dateQuery = date ? ` AND (${buildDateQueryFromString(date)})` : '';
|
|
60
61
|
const userQuery = user ? ` AND (${buildUserQueryFromString(user)})` : '';
|
|
61
62
|
const fullQuery = `${qQuery}${motivationQuery}${dateQuery}${userQuery}`;
|
|
62
63
|
//console.log(`Constructed query: ${fullQuery}`);
|
|
63
|
-
const response = yield quickwitClient.post(`${indexId}/search`, {
|
|
64
|
+
const response = yield quickwitClient.post(`${indexId + '_annotations'}/search`, {
|
|
64
65
|
query: fullQuery,
|
|
65
66
|
max_hits: maxHits,
|
|
66
67
|
start_offset: startOffset,
|
|
@@ -73,4 +74,25 @@ function searchIndex(indexId, q, motivation, maxHits, page, searchUrl, date, use
|
|
|
73
74
|
}
|
|
74
75
|
});
|
|
75
76
|
}
|
|
77
|
+
function buildAutocompleteQueryFromString(qString) {
|
|
78
|
+
return `term:${qString}*`;
|
|
79
|
+
}
|
|
80
|
+
function searchAutocomplete(indexId, q, maxHits, searchUrl, ignoredParams) {
|
|
81
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
(0, validate_1.validateAutocompleteQueryParameter)(q);
|
|
83
|
+
(0, validate_1.validateMaxHits)(maxHits);
|
|
84
|
+
const fullQuery = buildAutocompleteQueryFromString(q);
|
|
85
|
+
const response = yield quickwitClient.post(`${indexId + '_autocomplete'}/search`, {
|
|
86
|
+
query: fullQuery,
|
|
87
|
+
sort_by: "frequency",
|
|
88
|
+
max_hits: maxHits,
|
|
89
|
+
});
|
|
90
|
+
if (response.status === 200 && response.data) {
|
|
91
|
+
return (0, iiif_1.makeAutocompleteResponse)(response.data, searchUrl, q, ignoredParams);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
throw new errors_1.AnnoSearchValidationError('Failed to search autocomplete index');
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
76
98
|
//# sourceMappingURL=search.js.map
|
package/dist/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":";;;;;;;;;;;AA0CA,kCA2BC;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":";;;;;;;;;;;AA0CA,kCA2BC;AAMD,gDAcC;AAzFD,yCAA0C;AAC1C,qCAAqD;AACrD,iCAAsE;AACtE,yCAAyM;AAEzM,MAAM,WAAW,GAAG,kBAAkB,CAAC;AACvC,MAAM,cAAc,GAAG,IAAA,uBAAY,EAAC,WAAW,CAAC,CAAC;AAGjD,SAAS,wBAAwB,CAAC,gBAAwB;IACtD,8DAA8D;IAC9D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/C,2DAA2D;IAC3D,OAAO,UAAU;SACZ,GAAG,CAAC,KAAK,CAAC,EAAE;QACT,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,kCAAyB,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,YAAY,KAAK,OAAO,GAAG,GAAG,CAAC;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAChD,8DAA8D;IAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpC,0DAA0D;IAC1D,OAAO,KAAK;SACP,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,IAAI,oBAAoB,IAAI,IAAI,CAAC;SAC1D,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,KAAK;SACP,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,IAAI,IAAI,CAAC;SACrC,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED,SAAsB,WAAW,CAAC,OAAe,EAAE,CAAS,EAAE,UAAkB,EAAE,OAAe,EAAE,IAAY,EAAE,SAAiB,EAAE,IAAY,EAAE,IAAY;;QAC1J,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC;QACnC,IAAA,uCAA4B,EAAC,CAAC,CAAC,CAAC;QAChC,IAAA,6BAAkB,EAAC,IAAI,CAAC,CAAC;QACzB,IAAA,0BAAe,EAAC,OAAO,CAAC,CAAC;QACzB,IAAA,6BAAkB,EAAC,IAAI,CAAC,CAAC;QACzB,IAAA,yBAAc,EAAC,WAAW,CAAC,CAAC;QAC5B,IAAA,6BAAkB,EAAC,UAAU,CAAC,CAAC;QAC/B,IAAA,uBAAY,EAAC,IAAI,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,SAAS,GAAG,GAAG,MAAM,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;QACxE,iDAAiD;QACjD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,cAAc,SAAS,EAAE;YAC7E,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,OAAO;YACjB,YAAY,EAAE,WAAW;SAC5B,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,IAAA,yBAAkB,EAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3G,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,kCAAyB,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;CAAA;AAED,SAAS,gCAAgC,CAAC,OAAe;IACrD,OAAO,QAAQ,OAAO,GAAG,CAAA;AAC7B,CAAC;AAED,SAAsB,kBAAkB,CAAC,OAAe,EAAE,CAAS,EAAE,OAAe,EAAE,SAAiB,EAAE,aAAuB;;QAC5H,IAAA,6CAAkC,EAAC,CAAC,CAAC,CAAC;QACtC,IAAA,0BAAe,EAAC,OAAO,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,gCAAgC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,eAAe,SAAS,EAAE;YAC9E,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,OAAO;SACpB,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,IAAA,+BAAwB,EAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;QAChF,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,kCAAyB,CAAC,qCAAqC,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;CAAA"}
|
package/dist/server.js
CHANGED
|
@@ -46,6 +46,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
46
46
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
47
|
};
|
|
48
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
+
exports.buildIgnoredTerms = buildIgnoredTerms;
|
|
49
50
|
exports.serve = serve;
|
|
50
51
|
const express_1 = __importDefault(require("express"));
|
|
51
52
|
const package_json_1 = require("../package.json"); // Import version from package.json
|
|
@@ -53,6 +54,16 @@ const utils_1 = require("./utils");
|
|
|
53
54
|
const logger_1 = __importStar(require("./logger")); // Import shared logger
|
|
54
55
|
const pino_http_1 = __importDefault(require("pino-http"));
|
|
55
56
|
const errors_1 = require("./errors");
|
|
57
|
+
function buildIgnoredTerms(queryParams) {
|
|
58
|
+
const ignoredParams = ['date', 'motivation', 'user', 'min'];
|
|
59
|
+
const ignoredTerms = [];
|
|
60
|
+
for (const param of ignoredParams) {
|
|
61
|
+
if (queryParams.hasOwnProperty(param)) {
|
|
62
|
+
ignoredTerms.push(param);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return ignoredTerms;
|
|
66
|
+
}
|
|
56
67
|
function serve(client) {
|
|
57
68
|
return __awaiter(this, void 0, void 0, function* () {
|
|
58
69
|
const app = (0, express_1.default)();
|
|
@@ -74,6 +85,18 @@ function serve(client) {
|
|
|
74
85
|
(0, utils_1.handleWebError)(error, res);
|
|
75
86
|
}
|
|
76
87
|
}));
|
|
88
|
+
app.get('/:index/autocomplete', (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
try {
|
|
90
|
+
const ignoredParams = buildIgnoredTerms(req.query);
|
|
91
|
+
const index = req.params.index || '';
|
|
92
|
+
const q = req.query.q || '';
|
|
93
|
+
const results = yield client.searchAutocomplete(index, q, ignoredParams);
|
|
94
|
+
res.json(results);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
(0, utils_1.handleWebError)(error, res);
|
|
98
|
+
}
|
|
99
|
+
}));
|
|
77
100
|
app.get('/version', (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
78
101
|
try {
|
|
79
102
|
res.json({ version: package_json_1.version });
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAAA,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUlB,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/validate.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.motivations = void 0;
|
|
4
|
-
exports.
|
|
4
|
+
exports.validateSearchQueryParameter = validateSearchQueryParameter;
|
|
5
|
+
exports.validateAutocompleteQueryParameter = validateAutocompleteQueryParameter;
|
|
5
6
|
exports.validateOffset = validateOffset;
|
|
6
7
|
exports.validatePageNumber = validatePageNumber;
|
|
7
8
|
exports.validateMaxHits = validateMaxHits;
|
|
@@ -18,9 +19,36 @@ exports.motivations = [
|
|
|
18
19
|
'commenting',
|
|
19
20
|
'tagging'
|
|
20
21
|
];
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
function validateSearchQueryParameter(query) {
|
|
23
|
+
const trimmedQuery = query.trim();
|
|
24
|
+
if (!trimmedQuery) {
|
|
25
|
+
throw new errors_1.AnnoSearchValidationError('Missing query parameter.');
|
|
26
|
+
}
|
|
27
|
+
const minKeywordLength = 3;
|
|
28
|
+
const whitelistedShortKeywords = new Set(["uk", "ai", "us"]);
|
|
29
|
+
const invalidCharPattern = /[^\p{L}\p{N}\-]/u; // Allow letters, numbers, and hyphens
|
|
30
|
+
const keywords = trimmedQuery.split(/\s+/);
|
|
31
|
+
for (const keyword of keywords) {
|
|
32
|
+
if (keyword.length < minKeywordLength && !whitelistedShortKeywords.has(keyword.toLowerCase())) {
|
|
33
|
+
throw new errors_1.AnnoSearchValidationError(`Keyword "${keyword}" must be at least ${minKeywordLength} characters long.`);
|
|
34
|
+
}
|
|
35
|
+
if (invalidCharPattern.test(keyword)) {
|
|
36
|
+
throw new errors_1.AnnoSearchValidationError(`Keyword "${keyword}" contains invalid characters.`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function validateAutocompleteQueryParameter(query) {
|
|
41
|
+
const trimmedQuery = query.trim();
|
|
42
|
+
const minQueryLength = 3;
|
|
43
|
+
const invalidCharPattern = /[^\p{L}\p{N}\-]/u; // Allow Latin letters, numbers, and hyphens
|
|
44
|
+
if (!trimmedQuery) {
|
|
45
|
+
throw new errors_1.AnnoSearchValidationError('Missing autocomplete query parameter.');
|
|
46
|
+
}
|
|
47
|
+
if (trimmedQuery.length < minQueryLength) {
|
|
48
|
+
throw new errors_1.AnnoSearchValidationError(`Autocomplete query must be at least ${minQueryLength} characters long.`);
|
|
49
|
+
}
|
|
50
|
+
if (invalidCharPattern.test(trimmedQuery)) {
|
|
51
|
+
throw new errors_1.AnnoSearchValidationError('Autocomplete query contains invalid characters. Only Latin letters, numbers, and hyphens are allowed.');
|
|
24
52
|
}
|
|
25
53
|
}
|
|
26
54
|
function validateOffset(offset) {
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":";;;AAYA,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "annosearch",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**/*"
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"axios": "^1.7.9",
|
|
35
35
|
"express": "^4.21.2",
|
|
36
36
|
"jest": "^29.7.0",
|
|
37
|
-
"maniiifest": "^1.3.
|
|
37
|
+
"maniiifest": "^1.3.4",
|
|
38
38
|
"nock": "^13.5.6",
|
|
39
39
|
"pino": "^9.5.0",
|
|
40
40
|
"pino-http": "^10.3.0",
|