@verdaccio/search 6.0.0-6-next.2 → 7.0.0-next.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.
@@ -1,8 +1,9 @@
1
- import { Version } from '@verdaccio/types';
1
+ import { Logger, Version } from '@verdaccio/types';
2
2
  type Results = any;
3
3
  declare class SearchMemoryIndexer {
4
4
  private database;
5
5
  private storage;
6
+ private logger;
6
7
  /**
7
8
  * Set up the {Storage}
8
9
  * @param {*} storage An storage reference.
@@ -16,6 +17,7 @@ declare class SearchMemoryIndexer {
16
17
  * @return {Array} list of results.
17
18
  */
18
19
  query(term: string): Promise<Results | void>;
20
+ private prepareKeywords;
19
21
  /**
20
22
  * Add a new element to index
21
23
  * @param {*} pkg the package
@@ -29,8 +31,8 @@ declare class SearchMemoryIndexer {
29
31
  /**
30
32
  * Force a re-index.
31
33
  */
32
- reindex(): void;
33
- init(): Promise<void>;
34
+ reindex(): Promise<void>;
35
+ init(logger: Logger): Promise<void>;
34
36
  }
35
37
  declare const _default: SearchMemoryIndexer;
36
38
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/search",
3
- "version": "6.0.0-6-next.2",
3
+ "version": "7.0.0-next.1",
4
4
  "description": "verdaccio search utitlity tools",
5
5
  "main": "./build/dist.js",
6
6
  "types": "build/index.d.ts",
@@ -30,9 +30,8 @@
30
30
  "npm": ">=6"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/node": "16.18.10",
34
- "@verdaccio/types": "11.0.0-6-next.25",
35
- "@orama/orama": "1.0.0-beta.16",
33
+ "@verdaccio/types": "12.0.0-next.0",
34
+ "@orama/orama": "1.2.1",
36
35
  "debug": "4.3.4",
37
36
  "esbuild": "0.14.10"
38
37
  },
@@ -42,7 +41,7 @@
42
41
  },
43
42
  "scripts": {
44
43
  "clean": "rimraf ./build",
45
- "test": "echo 1",
44
+ "test": "vitest run",
46
45
  "type-check": "tsc --noEmit -p tsconfig.build.json",
47
46
  "build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
48
47
  "build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
package/src/indexer.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { create, insert, remove, search } from '@orama/orama';
2
2
  import buildDebug from 'debug';
3
3
 
4
- import { Version } from '@verdaccio/types';
4
+ import { Logger, Version } from '@verdaccio/types';
5
5
 
6
6
  const debug = buildDebug('verdaccio:search:indexer');
7
7
 
@@ -10,6 +10,7 @@ type Results = any;
10
10
  class SearchMemoryIndexer {
11
11
  private database: any | undefined;
12
12
  private storage: any;
13
+ private logger: Logger | undefined;
13
14
 
14
15
  /**
15
16
  * Set up the {Storage}
@@ -31,13 +32,21 @@ class SearchMemoryIndexer {
31
32
  debug('searching %s at indexer', term);
32
33
  const searchResult = await search(this.database, {
33
34
  term,
34
- properties: '*',
35
35
  });
36
36
 
37
37
  return searchResult;
38
38
  }
39
39
  }
40
40
 
41
+ private prepareKeywords(keywords?: string[] | string): string {
42
+ if (typeof keywords === 'undefined') {
43
+ return '';
44
+ } else if (typeof keywords === 'string') {
45
+ return keywords;
46
+ }
47
+ return keywords.join(',');
48
+ }
49
+
41
50
  /**
42
51
  * Add a new element to index
43
52
  * @param {*} pkg the package
@@ -46,14 +55,15 @@ class SearchMemoryIndexer {
46
55
  if (this.database) {
47
56
  const name = pkg.name;
48
57
  debug('adding item %s to the indexer', name);
49
- insert(this.database, {
58
+ const item = {
50
59
  id: name,
51
60
  name: name,
52
61
  description: pkg.description,
53
- version: `v${pkg.version}`,
54
- keywords: pkg.keywords,
55
- author: pkg._npmUser ? pkg._npmUser.name : '???',
56
- });
62
+ version: pkg.version,
63
+ keywords: this.prepareKeywords(pkg.keywords),
64
+ author: pkg._npmUser ? pkg._npmUser.name : '',
65
+ };
66
+ await insert(this.database, item);
57
67
  }
58
68
  }
59
69
 
@@ -71,9 +81,9 @@ class SearchMemoryIndexer {
71
81
  /**
72
82
  * Force a re-index.
73
83
  */
74
- public reindex(): void {
84
+ public async reindex(): Promise<void> {
75
85
  debug('reindexing search indexer');
76
- this.storage?.getLocalDatabase((error, packages): void => {
86
+ this.storage?.getLocalDatabase(async (error, packages): Promise<void> => {
77
87
  if (error) {
78
88
  // that function shouldn't produce any
79
89
  throw error;
@@ -86,13 +96,18 @@ class SearchMemoryIndexer {
86
96
  while (i--) {
87
97
  const pkg = packages[i];
88
98
  debug('indexing package %s', pkg?.name);
89
- this.add(pkg);
99
+ try {
100
+ await this.add(pkg);
101
+ } catch (err: any) {
102
+ this.logger?.error({ err: err.message }, 'error @{err} indexing package');
103
+ }
90
104
  }
91
105
  debug('reindexed search indexer');
92
106
  });
93
107
  }
94
108
 
95
- public async init() {
109
+ public async init(logger: Logger) {
110
+ this.logger = logger;
96
111
  this.database = await create({
97
112
  schema: {
98
113
  id: 'string',
@@ -0,0 +1,47 @@
1
+ import { expect, test } from 'vitest';
2
+
3
+ import { Logger } from '@verdaccio/types';
4
+
5
+ import { SearchMemoryIndexer } from '../src';
6
+
7
+ class MockStore {
8
+ getLocalDatabase(cb) {
9
+ return cb(null, [
10
+ {
11
+ name: 'verdaccio-search',
12
+ version: '1.0.0',
13
+ readme: 'foo',
14
+ description: 'foo',
15
+ keywords: ['foo', 'bar'],
16
+ },
17
+ {
18
+ name: 'verdaccio-utils',
19
+ version: '2.0.0',
20
+ readme: 'foo',
21
+ description: 'foo',
22
+ keywords: 'some',
23
+ },
24
+ ]);
25
+ }
26
+ }
27
+
28
+ const logger = {
29
+ // eslint-disable-next-line no-console
30
+ error: (...arg) => console.error(...arg),
31
+ } as Logger;
32
+
33
+ test('should search', async () => {
34
+ const store = new MockStore();
35
+
36
+ SearchMemoryIndexer.configureStorage(store);
37
+ await SearchMemoryIndexer.init(logger);
38
+ // @ts-expect-error
39
+ await SearchMemoryIndexer.add({
40
+ name: 'verdaccio',
41
+ version: '2.0.0',
42
+ readme: 'foo',
43
+ description: '',
44
+ });
45
+ const query = await SearchMemoryIndexer.query('verdaccio');
46
+ expect(query.hits.map((item) => item.id)).toEqual(['verdaccio', 'verdaccio-utils']);
47
+ });