Skip to content

Commit

Permalink
fix: local search keyword undefined errors (#3992)
Browse files Browse the repository at this point in the history
* fix: local search keyword undefined errors

* Update indexer.ts
  • Loading branch information
juanpicado committed Aug 26, 2023
1 parent e445db0 commit 35cc57b
Show file tree
Hide file tree
Showing 6 changed files with 696 additions and 415 deletions.
5 changes: 5 additions & 0 deletions .changeset/shiny-worms-retire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@verdaccio/search': patch
---

fix: keyword undefined errors
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
"@verdaccio/eslint-config": "workspace:*",
"@verdaccio/types": "workspace:*",
"@verdaccio/ui-theme": "workspace:*",
"@vitest/coverage-v8": "^0.34.3",
"babel-core": "7.0.0-bridge.0",
"babel-jest": "29.4.3",
"babel-plugin-dynamic-import-node": "2.3.3",
Expand Down Expand Up @@ -123,7 +124,8 @@
"verdaccio-audit": "workspace:*",
"verdaccio-auth-memory": "workspace:*",
"verdaccio-htpasswd": "workspace:*",
"verdaccio-memory": "workspace:*"
"verdaccio-memory": "workspace:*",
"vitest": "^0.34.3"
},
"scripts": {
"prepare": "husky install",
Expand Down
4 changes: 2 additions & 2 deletions packages/search/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@
},
"scripts": {
"clean": "rimraf ./build",
"test": "echo 1",
"test": "vitest run",
"type-check": "tsc --noEmit -p tsconfig.build.json",
"build:types": "tsc --emitDeclarationOnly -p tsconfig.build.json",
"build:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
"build": "esbuild src/index.ts --bundle --outfile=build/dist.js --platform=node --target=node12 && pnpm run build:types"
},
"devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.0",
"@orama/orama": "1.1.1",
"@orama/orama": "1.2.1",
"debug": "4.3.4",
"esbuild": "0.14.10"
},
Expand Down
37 changes: 26 additions & 11 deletions packages/search/src/indexer.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { create, insert, remove, search } from '@orama/orama';
import buildDebug from 'debug';

import { Version } from '@verdaccio/types';
import { Logger, Version } from '@verdaccio/types';

const debug = buildDebug('verdaccio:search:indexer');

Expand All @@ -10,6 +10,7 @@ type Results = any;
class SearchMemoryIndexer {
private database: any | undefined;
private storage: any;
private logger: Logger | undefined;

/**
* Set up the {Storage}
Expand All @@ -31,13 +32,21 @@ class SearchMemoryIndexer {
debug('searching %s at indexer', term);
const searchResult = await search(this.database, {
term,
properties: '*',
});

return searchResult;
}
}

private prepareKeywords(keywords?: string[] | string): string {
if (typeof keywords === 'undefined') {
return '';
} else if (typeof keywords === 'string') {
return keywords;
}
return keywords.join(',');
}

/**
* Add a new element to index
* @param {*} pkg the package
Expand All @@ -46,14 +55,15 @@ class SearchMemoryIndexer {
if (this.database) {
const name = pkg.name;
debug('adding item %s to the indexer', name);
insert(this.database, {
const item = {
id: name,
name: name,
description: pkg.description,
version: `v${pkg.version}`,
keywords: pkg.keywords,
author: pkg._npmUser ? pkg._npmUser.name : '???',
});
version: pkg.version,
keywords: this.prepareKeywords(pkg.keywords),
author: pkg._npmUser ? pkg._npmUser.name : '',
};
await insert(this.database, item);
}
}

Expand All @@ -71,9 +81,9 @@ class SearchMemoryIndexer {
/**
* Force a re-index.
*/
public reindex(): void {
public async reindex(): Promise<void> {
debug('reindexing search indexer');
this.storage?.getLocalDatabase((error, packages): void => {
this.storage?.getLocalDatabase(async (error, packages): Promise<void> => {
if (error) {
// that function shouldn't produce any
throw error;
Expand All @@ -86,13 +96,18 @@ class SearchMemoryIndexer {
while (i--) {
const pkg = packages[i];
debug('indexing package %s', pkg?.name);
this.add(pkg);
try {
await this.add(pkg);
} catch (err: any) {
this.logger?.error({ err: err.message }, 'error @{err} indexing package');
}
}
debug('reindexed search indexer');
});
}

public async init() {
public async init(logger: Logger) {
this.logger = logger;
this.database = await create({
schema: {
id: 'string',
Expand Down
47 changes: 47 additions & 0 deletions packages/search/test/index.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { expect, test } from 'vitest';

import { Logger } from '@verdaccio/types';

import { SearchMemoryIndexer } from '../src';

class MockStore {
getLocalDatabase(cb) {
return cb(null, [
{
name: 'verdaccio-search',
version: '1.0.0',
readme: 'foo',
description: 'foo',
keywords: ['foo', 'bar'],
},
{
name: 'verdaccio-utils',
version: '2.0.0',
readme: 'foo',
description: 'foo',
keywords: 'some',
},
]);
}
}

const logger = {
// eslint-disable-next-line no-console
error: (...arg) => console.error(...arg),
} as Logger;

test('should search', async () => {
const store = new MockStore();

SearchMemoryIndexer.configureStorage(store);
await SearchMemoryIndexer.init(logger);
// @ts-expect-error
await SearchMemoryIndexer.add({
name: 'verdaccio',
version: '2.0.0',
readme: 'foo',
description: '',
});
const query = await SearchMemoryIndexer.query('verdaccio');
expect(query.hits.map((item) => item.id)).toEqual(['verdaccio', 'verdaccio-utils']);
});

0 comments on commit 35cc57b

Please sign in to comment.