API to expose test data in a convenient and consistent way
npm install -D data-test-api
Api Reference: https://cheminfo.github.io/data-test-api/
// src/index.ts
import { join } from 'node:path';
import type { AbsolutePath } from 'data-test-api';
import init from 'data-test-api';
const zipFilesApi = init(
join(import.meta.dirname, '../data/zipped') as AbsolutePath,
(dirent) => dirent.isFile() && dirent.name.endsWith('.zip'),
);
const flatFilesApi = init(join(import.meta.dirname, '../data/flat'));
export { zipFilesApi, flatFilesApi };
import { join } from 'node:path';
import type { AbsolutePath } from 'data-test-api';
import init from 'data-test-api';
const api = init(join(import.meta.dirname, '../data') as AbsolutePath);
const root = api.root;
const filePath = api.getPath('relative/path/to/file.txt');
// .getPath('./relative/path/to/file.txt') // also works
// .getPath('../data/relative/path/to/file.txt') // also works
// .getPath('/absolute/path') // typecheck error, absolute paths are not allowed
const fileByPath = await api.getFile('relative/path/to/file.txt'); // fulfill a FileEntry or reject a FileNotExistsError
const fileByPathBuffer = await fileByPath.buffer();
const fileByPathStream = await fileByPath.stream();
const fileByName = await api.findFile('file.txt'); // fulfill a FileEntry or reject a FileNotFoundError
const fileByNameBuffer = await fileByPath.buffer();
const fileByNameStream = await fileByPath.stream();
// async iteration on files
for await (const file of api.filesAsyncValues()) {
const buffer = await file.buffer();
console.log(file.path, buffer.toString());
}
// iteration on files
const values = await api.filesValues();
for (const file of values) {
console.log(file.path);
}
// you can also use Iterator helpers if you use Node >= 22
// and add "ESNext.Iterator" to your tsconfig.json `compilerOptions.lib`
// array of files
const files = await api.files();
// get buffer with relative path
const bufferByPath = await api.getData('relative/path/to/file.txt');
const bufferByName = await api.findData('file.txt');
https://cheminfo.github.io/data-test-api/interfaces/FileEntry.html
NB: default export of data-test-api
is an alias for new DataTestApi(root, filter)
.
import { join } from 'node:path';
import { DataTestApi } from 'data-test-api';
export class JdxDataTestApi extends DataTestApi {
constructor() {
super(
join(import.meta.dirname, '../data/jdx'),
(dirent) => dirent.isFile() && dirent.name.endsWith('.jdx'),
);
}
// you can override methods or add new ones
}
// ls-recursive.js
import init from 'data-test-api';
const api = init('./', () => true);
for await (const file of api.filesAsyncValues()) {
console.log(file.path); // path is relative to cwd
}