diff --git a/README.md b/README.md index 440cc4d..d796148 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![workflow status](https://github.com/hyparam/hyparquet/actions/workflows/ci.yml/badge.svg)](https://github.com/hyparam/hyparquet/actions) [![mit license](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![dependencies](https://img.shields.io/badge/Dependencies-0-blueviolet)](https://www.npmjs.com/package/hyparquet?activeTab=dependencies) +![coverage](https://img.shields.io/badge/Coverage-94-darkred) Dependency free since 2023! diff --git a/package.json b/package.json index ccca415..6b759de 100644 --- a/package.json +++ b/package.json @@ -28,14 +28,14 @@ }, "devDependencies": { "@types/node": "20.12.7", - "@typescript-eslint/eslint-plugin": "7.7.0", - "@vitest/coverage-v8": "1.5.0", + "@typescript-eslint/eslint-plugin": "7.7.1", + "@vitest/coverage-v8": "1.5.2", "eslint": "8.57.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-jsdoc": "48.2.3", "http-server": "14.1.1", "hysnappy": "0.3.0", "typescript": "5.4.5", - "vitest": "1.5.0" + "vitest": "1.5.2" } } diff --git a/src/hyparquet.d.ts b/src/hyparquet.d.ts index 40ce2ed..c49e68d 100644 --- a/src/hyparquet.d.ts +++ b/src/hyparquet.d.ts @@ -1,4 +1,6 @@ -export { AsyncBuffer, FileMetaData, SchemaTree } from './types' +import type { AsyncBuffer, Compressors, FileMetaData, SchemaTree } from './types.d.ts' + +export type { AsyncBuffer, FileMetaData, SchemaTree } /** * Read parquet data rows from a file-like object. @@ -22,7 +24,7 @@ export { AsyncBuffer, FileMetaData, SchemaTree } from './types' * @param {Compressors} [options.compressor] custom decompressors * @returns {Promise} resolves when all requested rows and columns are parsed */ -export async function parquetRead(options: ParquetReadOptions): Promise +export function parquetRead(options: ParquetReadOptions): Promise /** * Read parquet metadata from an async buffer. @@ -48,7 +50,7 @@ export async function parquetRead(options: ParquetReadOptions): Promise * @param {number} initialFetchSize initial fetch size in bytes (default 512kb) * @returns {Promise} parquet metadata object */ -export async function parquetMetadataAsync(asyncBuffer: AsyncBuffer, initialFetchSize: number = 1 << 19 /* 512kb */): Promise +export function parquetMetadataAsync(asyncBuffer: AsyncBuffer, initialFetchSize?: number): Promise /** * Read parquet metadata from a buffer diff --git a/src/read.js b/src/read.js index e64b4e0..856a5e3 100644 --- a/src/read.js +++ b/src/read.js @@ -137,13 +137,15 @@ async function readRowGroup(options, rowGroup, groupStart) { } // use pre-loaded row group byte data if available, else read column data + /** @type {Promise} */ let buffer let bufferOffset = 0 if (groupBuffer) { buffer = Promise.resolve(groupBuffer) bufferOffset = columnStartByte - groupStartByte } else { - buffer = file.slice(columnStartByte, columnEndByte) + // wrap awaitable to ensure it's a promise + buffer = Promise.resolve(file.slice(columnStartByte, columnEndByte)) } // read column data async diff --git a/src/types.d.ts b/src/types.d.ts index 3f90c40..8ad741c 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -1,9 +1,11 @@ +type Awaitable = T | Promise + /** * File-like object that can read slices of a file asynchronously. */ export interface AsyncBuffer { byteLength: number - slice(start: number, end?: number): Promise + slice(start: number, end?: number): Awaitable } /** diff --git a/test/files/README.md b/test/files/README.md index beb0bcb..e63083b 100644 --- a/test/files/README.md +++ b/test/files/README.md @@ -3,5 +3,3 @@ This directory contains binary test files from [apache/parquet-testing](https://github.com/apache/parquet-testing), under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0). Copyright 2004 The Apache Software Foundation (http://www.apache.org/). - - diff --git a/test/metadata.test.js b/test/metadata.test.js index 6dd062a..fb5aa5a 100644 --- a/test/metadata.test.js +++ b/test/metadata.test.js @@ -63,6 +63,7 @@ describe('parquetMetadataAsync', () => { it('throws for asyncBuffer undefined', async () => { const arrayBuffer = undefined + // @ts-expect-error testing invalid input await expect(parquetMetadataAsync(arrayBuffer)).rejects .toThrow('parquet file is required') }) diff --git a/test/read.test.js b/test/read.test.js index 9644d4a..5357b5e 100644 --- a/test/read.test.js +++ b/test/read.test.js @@ -5,13 +5,14 @@ import { fileToAsyncBuffer } from './helpers.js' describe('parquetRead', () => { it('throws error for undefined file', async () => { - const file = undefined - await expect(parquetRead({ file })) + // @ts-expect-error testing invalid input + await expect(parquetRead({ file: undefined })) .rejects.toThrow('parquet file is required') }) it('throws error for undefined byteLength', async () => { const file = { byteLength: undefined, slice: () => new ArrayBuffer(0) } + // @ts-expect-error testing invalid input await expect(parquetRead({ file })) .rejects.toThrow('parquet file byteLength is required') }) diff --git a/tsconfig.json b/tsconfig.json index 6465dd1..d4f8118 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "module": "nodenext", "noEmit": true, "resolveJsonModule": true, - "skipLibCheck": true, + "skipLibCheck": false, "strict": true, "target": "esnext", },