Loading SOVA...
Loading SOVA...
Parsers extract dependency names and versions from language-specific manifest and lock files. Each parser implements a common IParser interface.
cp src/parsers/_template/TEMPLATE-parser.ts src/parsers/mylang-parser.ts
parse()export class MylangParser implements IParser {
readonly language = 'mylang';
readonly packageManager = 'mypkg';
canParse(filename: string): boolean {
return filename === 'my-manifest.json' || filename === 'my-lock.json';
}
parse(filePath: string, content: string): ParseResult {
const dependencies: string[] = [];
// ... your parsing logic ...
return {
language: this.language,
packageManager: this.packageManager,
fileType: 'manifest',
dependencies,
additionalDependencies: {},
};
}
}Format every dependency as "name_:_version". Use "name_:_unknown" when version is absent.
Lock files should also populate additionalDependencies (adjacency list for the dependency graph).
Never throw — return an empty result on parse failure and log a warning.
Add to src/parsers/parser-registry.ts:
mylang: async () => {
const { MylangParser } = await import('./mylang-parser.js');
return new MylangParser();
},Also add 'mylang' to the language icon map in src/cli.ts.
tests/fixtures/mylang/
basic-manifest/
my-manifest.json <- minimal valid manifest
lock-file/
my-lock.json <- representative lock file
empty/
my-manifest.json <- empty / no depsimport { describe, it, expect } from 'vitest';
import { MylangParser } from '../../src/parsers/mylang-parser.js';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
const parser = new MylangParser();
const fixture = (name: string) =>
readFileSync(join('tests/fixtures/mylang', name), 'utf-8');
describe('MylangParser', () => {
it('parses basic manifest', () => {
const result = parser.parse(
'my-manifest.json',
fixture('basic-manifest/my-manifest.json'),
);
expect(result.dependencies).toContain('somelib_:_1.2.3');
});
it('returns empty array for empty manifest', () => {
const result = parser.parse(
'my-manifest.json',
fixture('empty/my-manifest.json'),
);
expect(result.dependencies).toHaveLength(0);
});
});Run the full test suite to make sure nothing is broken:
npm test
All existing tests must continue to pass.
Open a pull request. The maintainers will review fixture coverage and edge case handling.