0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2025-03-11 02:15:57 -05:00

fix: local search keyword undefined errors (#3992)

* fix: local search keyword undefined errors

* Update indexer.ts
This commit is contained in:
Juan Picado 2023-08-26 15:24:00 +02:00 committed by GitHub
parent e445db0a1f
commit 35cc57b79e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 700 additions and 419 deletions

View file

@ -0,0 +1,5 @@
---
'@verdaccio/search': patch
---
fix: keyword undefined errors

View file

@ -87,6 +87,7 @@
"@verdaccio/eslint-config": "workspace:*", "@verdaccio/eslint-config": "workspace:*",
"@verdaccio/types": "workspace:*", "@verdaccio/types": "workspace:*",
"@verdaccio/ui-theme": "workspace:*", "@verdaccio/ui-theme": "workspace:*",
"@vitest/coverage-v8": "^0.34.3",
"babel-core": "7.0.0-bridge.0", "babel-core": "7.0.0-bridge.0",
"babel-jest": "29.4.3", "babel-jest": "29.4.3",
"babel-plugin-dynamic-import-node": "2.3.3", "babel-plugin-dynamic-import-node": "2.3.3",
@ -123,7 +124,8 @@
"verdaccio-audit": "workspace:*", "verdaccio-audit": "workspace:*",
"verdaccio-auth-memory": "workspace:*", "verdaccio-auth-memory": "workspace:*",
"verdaccio-htpasswd": "workspace:*", "verdaccio-htpasswd": "workspace:*",
"verdaccio-memory": "workspace:*" "verdaccio-memory": "workspace:*",
"vitest": "^0.34.3"
}, },
"scripts": { "scripts": {
"prepare": "husky install", "prepare": "husky install",

View file

@ -31,7 +31,7 @@
}, },
"scripts": { "scripts": {
"clean": "rimraf ./build", "clean": "rimraf ./build",
"test": "echo 1", "test": "vitest run",
"type-check": "tsc --noEmit -p tsconfig.build.json", "type-check": "tsc --noEmit -p tsconfig.build.json",
"build:types": "tsc --emitDeclarationOnly -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:js": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps",
@ -39,7 +39,7 @@
}, },
"devDependencies": { "devDependencies": {
"@verdaccio/types": "workspace:12.0.0-next.0", "@verdaccio/types": "workspace:12.0.0-next.0",
"@orama/orama": "1.1.1", "@orama/orama": "1.2.1",
"debug": "4.3.4", "debug": "4.3.4",
"esbuild": "0.14.10" "esbuild": "0.14.10"
}, },

View file

@ -1,7 +1,7 @@
import { create, insert, remove, search } from '@orama/orama'; import { create, insert, remove, search } from '@orama/orama';
import buildDebug from 'debug'; import buildDebug from 'debug';
import { Version } from '@verdaccio/types'; import { Logger, Version } from '@verdaccio/types';
const debug = buildDebug('verdaccio:search:indexer'); const debug = buildDebug('verdaccio:search:indexer');
@ -10,6 +10,7 @@ type Results = any;
class SearchMemoryIndexer { class SearchMemoryIndexer {
private database: any | undefined; private database: any | undefined;
private storage: any; private storage: any;
private logger: Logger | undefined;
/** /**
* Set up the {Storage} * Set up the {Storage}
@ -31,13 +32,21 @@ class SearchMemoryIndexer {
debug('searching %s at indexer', term); debug('searching %s at indexer', term);
const searchResult = await search(this.database, { const searchResult = await search(this.database, {
term, term,
properties: '*',
}); });
return searchResult; 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 * Add a new element to index
* @param {*} pkg the package * @param {*} pkg the package
@ -46,14 +55,15 @@ class SearchMemoryIndexer {
if (this.database) { if (this.database) {
const name = pkg.name; const name = pkg.name;
debug('adding item %s to the indexer', name); debug('adding item %s to the indexer', name);
insert(this.database, { const item = {
id: name, id: name,
name: name, name: name,
description: pkg.description, description: pkg.description,
version: `v${pkg.version}`, version: pkg.version,
keywords: pkg.keywords, keywords: this.prepareKeywords(pkg.keywords),
author: pkg._npmUser ? pkg._npmUser.name : '???', author: pkg._npmUser ? pkg._npmUser.name : '',
}); };
await insert(this.database, item);
} }
} }
@ -71,9 +81,9 @@ class SearchMemoryIndexer {
/** /**
* Force a re-index. * Force a re-index.
*/ */
public reindex(): void { public async reindex(): Promise<void> {
debug('reindexing search indexer'); debug('reindexing search indexer');
this.storage?.getLocalDatabase((error, packages): void => { this.storage?.getLocalDatabase(async (error, packages): Promise<void> => {
if (error) { if (error) {
// that function shouldn't produce any // that function shouldn't produce any
throw error; throw error;
@ -86,13 +96,18 @@ class SearchMemoryIndexer {
while (i--) { while (i--) {
const pkg = packages[i]; const pkg = packages[i];
debug('indexing package %s', pkg?.name); 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'); debug('reindexed search indexer');
}); });
} }
public async init() { public async init(logger: Logger) {
this.logger = logger;
this.database = await create({ this.database = await create({
schema: { schema: {
id: 'string', id: 'string',

View file

@ -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']);
});

1022
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff