annosearch 0.0.1

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 ADDED
@@ -0,0 +1,97 @@
1
+
2
+ # Annotation Search
3
+
4
+ AnnoSearch uses [Quickwit](https://quickwit.io) as its backend database to efficiently index and query [W3C Web Annotation](https://www.w3.org/TR/annotation-model/) data. Quickwit’s fast, scalable search engine enables AnnoSearch to handle large volumes of data and execute complex, full-text queries quickly. AnnoSearch can load data directly from [IIIF](https://iiif.io/) resources and web annotation servers such as [Miiify](https://github.com/nationalarchives/miiify).
5
+
6
+ ## Usage
7
+
8
+ Make sure you have Quickwit installed and [running](https://quickwit.io/docs/get-started/quickstart) and then install AnnoSearch.
9
+
10
+ ```bash
11
+ npm install annosearch
12
+ ```
13
+
14
+ ### Commands
15
+
16
+ #### `init`
17
+
18
+ Initialize a new index with a specified ID.
19
+
20
+ ```bash
21
+ annosearch init --index <index-id>
22
+ ```
23
+
24
+ #### `load`
25
+
26
+ Load an index from a URI, specifying the type of content being loaded (e.g., Manifest, Collection, or AnnotationCollection).
27
+
28
+ ```bash
29
+ annosearch load --index <index-id> --type <type> --uri <uri>
30
+ ```
31
+
32
+ - `type`: The type of content (Manifest, Collection, AnnotationCollection).
33
+ - `uri`: The URI to load the content from.
34
+
35
+ #### `delete`
36
+
37
+ Delete an existing index by ID.
38
+
39
+ ```bash
40
+ annosearch delete --index <index-id>
41
+ ```
42
+
43
+ #### `search`
44
+
45
+ Perform a search on a specified index.
46
+
47
+ ```bash
48
+ annosearch search --index <index-id> --query <search-query> [--page <page-number>]
49
+ ```
50
+
51
+ - `query`: The search query string.
52
+ - `page`: Optional page number (defaults to 0).
53
+
54
+ #### `serve`
55
+
56
+ Start a web server that provides a search service using the [IIIF Content Search 2.0 API](https://iiif.io/api/search/2.0/).
57
+
58
+ ```bash
59
+ annosearch serve --port <port> --host <host>
60
+ ```
61
+
62
+ - `port`: The port on which to run the server.
63
+ - `host`: The host on which to run the server.
64
+
65
+ #### `version`
66
+
67
+ Display the current version of AnnoSearch.
68
+
69
+ ```bash
70
+ annosearch version
71
+ ```
72
+
73
+
74
+ ## Configuration
75
+
76
+ Configure AnnoSearch by setting the following environment variables:
77
+
78
+ - **`ANNOSEARCH_MAX_HITS`**: Maximum number of search results per query.
79
+ - **Default**: `20`
80
+
81
+ - **`ANNOSEARCH_PORT`**: Port on which AnnoSearch runs.
82
+ - **Default**: `3000`
83
+
84
+ - **`ANNOSEARCH_HOST`**: Host on which AnnoSearch runs.
85
+ - **Default**: `localhost`
86
+
87
+ - **`ANNOSEARCH_PUBLIC_URL`**: URL for public-facing server requests.
88
+ - **Default**: `http://localhost:3000`
89
+
90
+ Adjust these values as needed to customize AnnoSearch’s configuration and behavior.
91
+
92
+
93
+ ## License
94
+
95
+ This project is licensed under the MIT License.
96
+
97
+
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "annosearch",
3
+ "version": "0.0.1",
4
+ "main": "dist/index.js",
5
+ "scripts": {
6
+ "build": "tsc",
7
+ "start": "ts-node src/index.ts",
8
+ "test": "echo \"Error: no test specified\" && exit 1"
9
+ },
10
+ "keywords": [],
11
+ "author": "John P. T. Moore",
12
+ "license": "MIT",
13
+ "description": "",
14
+ "devDependencies": {
15
+ "@types/express": "^5.0.0",
16
+ "@types/node": "^22.8.4",
17
+ "@types/pino": "^7.0.4",
18
+ "@types/yargs": "^17.0.33",
19
+ "maniiifest": "^1.2.9",
20
+ "typescript": "^5.6.3"
21
+ },
22
+ "dependencies": {
23
+ "axios": "^1.7.7",
24
+ "express": "^4.21.1",
25
+ "pino": "^9.5.0",
26
+ "pino-http": "^10.3.0",
27
+ "pino-pretty": "^12.1.0",
28
+ "yaml": "^2.6.0",
29
+ "yargs": "^17.7.2"
30
+ }
31
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const search_1 = require("./search");
13
+ const init_1 = require("./init");
14
+ const delete_1 = require("./delete");
15
+ const load_1 = require("./load");
16
+ function loadConfig() {
17
+ return {
18
+ maxHits: parseInt(process.env.ANNOSEARCH_MAX_HITS || '20'),
19
+ port: parseInt(process.env.ANNOSEARCH_PORT || '3000'),
20
+ host: process.env.ANNOSEARCH_HOST || 'localhost',
21
+ searchUrl: process.env.ANNOSEARCH_PUBLIC_URL || 'http://localhost:3000',
22
+ };
23
+ }
24
+ class AnnoSearch {
25
+ constructor({ maxHits, port, host, searchUrl } = loadConfig()) {
26
+ this.maxHits = maxHits;
27
+ this.port = port;
28
+ this.host = host;
29
+ this.searchUrl = searchUrl;
30
+ }
31
+ getHost() {
32
+ return this.host;
33
+ }
34
+ getPort() {
35
+ return this.port;
36
+ }
37
+ getMaxHits() {
38
+ return this.maxHits;
39
+ }
40
+ getSearchUrl() {
41
+ return this.searchUrl;
42
+ }
43
+ loadIndex(indexId, uri, type) {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ return yield (0, load_1.loadIndex)(indexId, uri, type);
46
+ });
47
+ }
48
+ searchIndex(indexId, query, page) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ return (0, search_1.searchIndex)(indexId, query, this.maxHits, page, this.searchUrl);
51
+ });
52
+ }
53
+ initIndex(indexId) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ return yield (0, init_1.initIndex)(indexId);
56
+ });
57
+ }
58
+ deleteIndex(indexId) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ return yield (0, delete_1.deleteIndex)(indexId);
61
+ });
62
+ }
63
+ }
64
+ exports.default = AnnoSearch;
65
+ //# sourceMappingURL=AnnoSearch.js.map
@@ -0,0 +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;QACH,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAEK,SAAS,CAAC,OAAe,EAAE,GAAW,EAAE,IAAY;;YACtD,OAAO,MAAM,IAAA,gBAAY,EAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;KAAA;IAEK,WAAW,CAAC,OAAe,EAAE,KAAa,EAAE,IAAY;;YAC1D,OAAO,IAAA,oBAAc,EAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9E,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"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.deleteIndex = deleteIndex;
13
+ const quickwit_1 = require("./quickwit");
14
+ const errors_1 = require("./errors");
15
+ const contentType = 'application/json';
16
+ const quickwitClient = (0, quickwit_1.createClient)(contentType);
17
+ function deleteIndex(indexId) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ if (!indexId.trim()) {
20
+ throw new errors_1.AnnoSearchValidationError('Invalid index parameter');
21
+ }
22
+ const response = yield quickwitClient.delete(`indexes/${indexId}`);
23
+ if (response.status === 200 && response.data) {
24
+ console.log('Index deleted successfully');
25
+ }
26
+ else {
27
+ throw new errors_1.AnnoSearchValidationError('Failed to delete index');
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/delete.ts"],"names":[],"mappings":";;;;;;;;;;;AAMA,kCAUC;AAhBD,yCAA0C;AAC1C,qCAAqD;AAErD,MAAM,WAAW,GAAG,kBAAkB,CAAC;AACvC,MAAM,cAAc,GAAG,IAAA,uBAAY,EAAC,WAAW,CAAC,CAAC;AAEjD,SAAsB,WAAW,CAAC,OAAe;;QAC7C,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,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,kCAAyB,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;CAAA"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ // errors.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AnnoSearchParseError = exports.AnnoSearchNotFoundError = exports.AnnoSearchNetworkError = exports.AnnoSearchValidationError = exports.AnnoSearchError = void 0;
5
+ class AnnoSearchError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = this.constructor.name;
9
+ Error.captureStackTrace(this, this.constructor); // Captures the correct stack trace
10
+ }
11
+ }
12
+ exports.AnnoSearchError = AnnoSearchError;
13
+ class AnnoSearchValidationError extends AnnoSearchError {
14
+ constructor(message = 'Invalid input data') {
15
+ super(message);
16
+ }
17
+ }
18
+ exports.AnnoSearchValidationError = AnnoSearchValidationError;
19
+ class AnnoSearchNetworkError extends AnnoSearchError {
20
+ constructor(message = 'Network error occurred') {
21
+ super(message);
22
+ }
23
+ }
24
+ exports.AnnoSearchNetworkError = AnnoSearchNetworkError;
25
+ class AnnoSearchNotFoundError extends AnnoSearchError {
26
+ constructor(message = 'Resource not found') {
27
+ super(message);
28
+ }
29
+ }
30
+ exports.AnnoSearchNotFoundError = AnnoSearchNotFoundError;
31
+ class AnnoSearchParseError extends AnnoSearchError {
32
+ constructor(message = 'Error parsing data') {
33
+ super(message);
34
+ }
35
+ }
36
+ exports.AnnoSearchParseError = AnnoSearchParseError;
37
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";AAAA,YAAY;;;AAEZ,MAAa,eAAgB,SAAQ,KAAK;IACtC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,mCAAmC;IACxF,CAAC;CACJ;AAND,0CAMC;AAED,MAAa,yBAA0B,SAAQ,eAAe;IAC1D,YAAY,OAAO,GAAG,oBAAoB;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAJD,8DAIC;AAED,MAAa,sBAAuB,SAAQ,eAAe;IACvD,YAAY,OAAO,GAAG,wBAAwB;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAJD,wDAIC;AAED,MAAa,uBAAwB,SAAQ,eAAe;IACxD,YAAY,OAAO,GAAG,oBAAoB;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAJD,0DAIC;AAED,MAAa,oBAAqB,SAAQ,eAAe;IACrD,YAAY,OAAO,GAAG,oBAAoB;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAJD,oDAIC"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSearchResponse = makeSearchResponse;
4
+ function makeSearchResponse(indexId, data, searchUrl, query, maxHits, page) {
5
+ const totalPages = Math.ceil(data.num_hits / maxHits);
6
+ const nextPage = page + 1 < totalPages ? page + 1 : null;
7
+ const prevPage = page > 0 ? page - 1 : null;
8
+ const q = encodeURIComponent(query);
9
+ return {
10
+ "@context": "http://www.w3.org/ns/anno.jsonld",
11
+ id: `${searchUrl}/${indexId}/search?q=${q}&page=${page}`,
12
+ type: "AnnotationPage",
13
+ partOf: totalPages > 1 ? {
14
+ id: `${searchUrl}/${indexId}/search?q=${q}`,
15
+ type: "AnnotationCollection",
16
+ total: data.num_hits,
17
+ first: {
18
+ id: `${searchUrl}/${indexId}/search?q=${q}&page=0`,
19
+ type: "AnnotationPage"
20
+ },
21
+ last: {
22
+ id: `${searchUrl}/${indexId}/search?q=${q}&page=${totalPages - 1}`,
23
+ type: "AnnotationPage"
24
+ }
25
+ } : undefined,
26
+ startIndex: page * maxHits,
27
+ items: data.hits.map((hit) => ({
28
+ "@context": "http://www.w3.org/ns/anno.jsonld",
29
+ id: hit.id,
30
+ type: hit.type,
31
+ body: hit.body,
32
+ target: hit.target,
33
+ motivation: hit.motivation,
34
+ })),
35
+ next: nextPage !== null ? `${searchUrl}/${indexId}/search?q=${q}&page=${nextPage}` : undefined,
36
+ prev: prevPage !== null ? `${searchUrl}/${indexId}/search?q=${q}&page=${prevPage}` : undefined,
37
+ };
38
+ }
39
+ //# sourceMappingURL=iiif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iiif.js","sourceRoot":"","sources":["../../src/iiif.ts"],"names":[],"mappings":";;AAwCA,gDAmCC;AAnCD,SAAgB,kBAAkB,CAAC,OAAe,EAAE,IAAS,EAAE,SAAiB,EAAE,KAAa,EAAE,OAAe,EAAE,IAAY;IAC1H,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,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEpC,OAAO;QACH,UAAU,EAAE,kCAAkC;QAC9C,EAAE,EAAE,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,SAAS,IAAI,EAAE;QACxD,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,EAAE,EAAE,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,EAAE;YAC3C,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,KAAK,EAAE;gBACH,EAAE,EAAE,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,SAAS;gBAClD,IAAI,EAAE,gBAAgB;aACzB;YACD,IAAI,EAAE;gBACF,EAAE,EAAE,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,SAAS,UAAU,GAAG,CAAC,EAAE;gBAClE,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,CAAC;YAChC,UAAU,EAAE,kCAAkC;YAC9C,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,GAAG,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QAC9F,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,OAAO,aAAa,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACjG,CAAC;AACN,CAAC"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const yargs_1 = __importDefault(require("yargs"));
16
+ const helpers_1 = require("yargs/helpers");
17
+ const AnnoSearch_1 = __importDefault(require("./AnnoSearch"));
18
+ const server_1 = require("./server");
19
+ const utils_1 = require("./utils");
20
+ const package_json_1 = require("../package.json"); // Import version from package.json
21
+ const client = new AnnoSearch_1.default();
22
+ function searchOptions(yargs) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ return yargs
25
+ .option('index', {
26
+ alias: 'i',
27
+ type: 'string',
28
+ description: 'Index ID',
29
+ demandOption: true,
30
+ })
31
+ .option('query', {
32
+ alias: 'q',
33
+ type: 'string',
34
+ description: 'Search query',
35
+ demandOption: true,
36
+ })
37
+ .option('page', {
38
+ alias: 'p',
39
+ type: 'number',
40
+ description: 'Page number',
41
+ default: 0, // Default page number if not specified
42
+ });
43
+ });
44
+ }
45
+ function searchCommand(argv) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ try {
48
+ const results = yield client.searchIndex(argv.index, argv.query, argv.page);
49
+ (0, utils_1.printJson)(results);
50
+ }
51
+ catch (error) {
52
+ (0, utils_1.logError)(error);
53
+ }
54
+ });
55
+ }
56
+ function initCommand(argv) {
57
+ return __awaiter(this, void 0, void 0, function* () {
58
+ try {
59
+ yield client.initIndex(argv.index);
60
+ }
61
+ catch (error) {
62
+ (0, utils_1.logError)(error);
63
+ }
64
+ });
65
+ }
66
+ function initOptions(yargs) {
67
+ return __awaiter(this, void 0, void 0, function* () {
68
+ return yargs.option('index', {
69
+ alias: 'i',
70
+ type: 'string',
71
+ description: 'Index ID',
72
+ demandOption: true,
73
+ });
74
+ });
75
+ }
76
+ function loadCommand(argv) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ try {
79
+ yield client.loadIndex(argv.index, argv.uri, argv.type);
80
+ }
81
+ catch (error) {
82
+ (0, utils_1.logError)(error);
83
+ }
84
+ });
85
+ }
86
+ function loadOptions(yargs) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ return yargs
89
+ .option('index', {
90
+ alias: 'i',
91
+ type: 'string',
92
+ description: 'Index ID',
93
+ demandOption: true,
94
+ })
95
+ .option('type', {
96
+ alias: 't',
97
+ type: 'string',
98
+ description: 'Type of IIIF specification or W3C web annotation collection',
99
+ choices: ['Manifest', 'Collection', 'AnnotationCollection'],
100
+ demandOption: true,
101
+ })
102
+ .option('uri', {
103
+ alias: 'u',
104
+ type: 'string',
105
+ description: 'URI to load the index from',
106
+ demandOption: true,
107
+ });
108
+ });
109
+ }
110
+ function deleteCommand(argv) {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ try {
113
+ yield client.deleteIndex(argv.index);
114
+ }
115
+ catch (error) {
116
+ (0, utils_1.logError)(error);
117
+ }
118
+ });
119
+ }
120
+ function deleteOptions(yargs) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ return yargs.option('index', {
123
+ alias: 'i',
124
+ type: 'string',
125
+ description: 'Index ID',
126
+ demandOption: true,
127
+ });
128
+ });
129
+ }
130
+ function serveOptions(yargs) {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ return yargs.option('port', {
133
+ type: 'number',
134
+ description: 'Port to run the server on',
135
+ default: client.getPort(),
136
+ })
137
+ .option('host', {
138
+ type: 'string',
139
+ description: 'Host to run the server on',
140
+ default: client.getHost(),
141
+ });
142
+ });
143
+ }
144
+ function serveCommand(yargs) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ (0, server_1.serve)(client);
147
+ });
148
+ }
149
+ function versionOptions(yargs) {
150
+ return __awaiter(this, void 0, void 0, function* () { });
151
+ }
152
+ function versionCommand() {
153
+ (0, utils_1.printJson)({ version: package_json_1.version });
154
+ }
155
+ function main() {
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ try {
158
+ yield (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
159
+ .scriptName('annosearch')
160
+ .usage('$0 <command> [options]')
161
+ .command('init', 'Initialize an index with the provided ID', initOptions, initCommand)
162
+ .command('load', 'Load an index with the provided ID from a URI', loadOptions, loadCommand)
163
+ .command('delete', 'Delete an index with the provided ID', deleteOptions, deleteCommand)
164
+ .command('search', 'Perform a search query on a specified index', searchOptions, searchCommand)
165
+ .command('serve', 'Start an Express server to call search', serveOptions, serveCommand)
166
+ .command('version', 'Show the version of the application', versionOptions, versionCommand)
167
+ .demandCommand(1, 'You need to specify a command (e.g., search, version)')
168
+ .strict()
169
+ .help()
170
+ .alias('h', 'help')
171
+ .alias('v', 'version')
172
+ .showHelpOnFail(true)
173
+ .parseAsync();
174
+ }
175
+ catch (error) {
176
+ (0, utils_1.logError)(error);
177
+ }
178
+ });
179
+ }
180
+ main();
181
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.initIndex = initIndex;
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const yaml_1 = __importDefault(require("yaml"));
19
+ const quickwit_1 = require("./quickwit");
20
+ const errors_1 = require("./errors");
21
+ const contentType = 'application/yaml';
22
+ const quickwitClient = (0, quickwit_1.createClient)(contentType);
23
+ // Function to read YAML configuration file
24
+ function readYamlConfig(filePath) {
25
+ const yamlData = fs_1.default.readFileSync(filePath, 'utf8');
26
+ return yaml_1.default.parse(yamlData);
27
+ }
28
+ // Function to modify the configuration with the provided index ID
29
+ function modifyConfig(config, indexId) {
30
+ config.index_id = indexId;
31
+ return yaml_1.default.stringify(config);
32
+ }
33
+ // Initialization function
34
+ function initIndex(indexId) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ if (!indexId.trim()) {
37
+ throw new errors_1.AnnoSearchValidationError('Invalid index parameter');
38
+ }
39
+ const filePath = path_1.default.resolve(__dirname, 'index-config.yaml');
40
+ const config = readYamlConfig(filePath);
41
+ const modifiedYamlData = modifyConfig(config, indexId);
42
+ const response = yield quickwitClient.post('indexes', modifiedYamlData);
43
+ if (response.status === 200 && response.data) {
44
+ console.log('Index created successfully');
45
+ }
46
+ else {
47
+ throw new errors_1.AnnoSearchValidationError('Failed to create index');
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAwBA,8BAcC;AAtCD,4CAAoB;AACpB,gDAAwB;AACxB,gDAAwB;AACxB,yCAA0C;AAC1C,qCAAqD;AAGrD,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,0BAA0B;AAC1B,SAAsB,SAAS,CAAC,OAAe;;QAC3C,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,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,kCAAyB,CAAC,wBAAwB,CAAC,CAAC;QAClE,CAAC;IAEL,CAAC;CAAA"}