diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..874fc1b --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +types/index.d.ts +types/index.test-d.ts diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 5a08d5b..085ed7e 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -47,7 +47,7 @@ jobs: - run: node --version - run: npm --version - run: npm install --ignore-scripts - - run: npm run test-only + - run: npm run test:unit env: CI: true @@ -57,4 +57,4 @@ jobs: steps: - uses: fastify/github-action-merge-dependabot@v2.0.0 with: - github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index ba6121f..2cb1c19 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ package-lock.json # node clinic *clinic* +/.idea/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..abfef68 --- /dev/null +++ b/.npmignore @@ -0,0 +1,10 @@ +.editorconfig +.gitattributes +.git +.DS_Store +.gitignore +.github +.dependabot +.clinic +tsconfig.json +types/index.test-d.ts diff --git a/index.js b/index.js index a3eea4e..d2e8426 100644 --- a/index.js +++ b/index.js @@ -377,4 +377,16 @@ function actualClose (sonic) { sonic._buf = '' } +/** + * These export configurations enable JS and TS developers + * to consumer SonicBoom in whatever way best suits their needs. + * Some examples of supported import syntax includes: + * - `const SonicBoom = require('SonicBoom')` + * - `const { SonicBoom } = require('SonicBoom')` + * - `import * as SonicBoom from 'SonicBoom'` + * - `import { SonicBoom } from 'SonicBoom'` + * - `import SonicBoom from 'SonicBoom'` + */ +SonicBoom.SonicBoom = SonicBoom +SonicBoom.default = SonicBoom module.exports = SonicBoom diff --git a/package.json b/package.json index 5f6ded3..09e7d17 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,12 @@ "version": "1.4.1", "description": "Extremely fast utf8 only stream implementation", "main": "index.js", + "type": "commonjs", + "types": "types/index.d.ts", "scripts": { - "test-only": "tap test.js", - "test": "standard && tap test.js", + "test": "npm run test:types && standard && tap test.js", + "test:unit": "tap test.js", + "test:types": "tsc && tsd", "prepare": "husky install" }, "repository": { @@ -28,11 +31,14 @@ }, "homepage": "https://github.com/mcollina/sonic-boom#readme", "devDependencies": { + "@types/node": "^15.3.0", "fastbench": "^1.0.1", "husky": "^6.0.0", "proxyquire": "^2.1.0", "standard": "^16.0.3", - "tap": "^15.0.1" + "tap": "^15.0.1", + "tsd": "^0.15.1", + "typescript": "^4.2.4" }, "dependencies": { "atomic-sleep": "^1.0.0", @@ -42,5 +48,8 @@ "hooks": { "pre-commit": "npm test" } + }, + "tsd": { + "directory": "./types" } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..19bebcc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es6", + "lib": [ "es2015" ], + "module": "commonjs", + "noEmit": true, + "strict": true + }, + "include": [ + "./types/index.test-d.ts", + "./types/index.d.ts" + ] +} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..919a20d --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,48 @@ +// Type definitions for sonic-boom 0.7 +// Definitions by: Alex Ferrando +// Igor Savin +/// + +import { EventEmitter } from 'events'; + +export default SonicBoom; + +export class SonicBoom extends EventEmitter { + /** + * @param [fileDescriptor] File path or numerical file descriptor + * relative protocol is enabled. Default: process.stdout + * @returns a new sonic-boom instance + */ + constructor(fileDescriptor: string | number, minLength?: number, sync?: boolean) + + /** + * Writes the string to the file. It will return false to signal the producer to slow down. + */ + write(string: string): void; + + /** + * Writes the current buffer to the file if a write was not in progress. + * Do nothing if minLength is zero or if it is already writing. + */ + flush(): void; + + /** + * Reopen the file in place, useful for log rotation. + */ + reopen(fileDescriptor?: string | number): void; + + /** + * Flushes the buffered data synchronously. This is a costly operation. + */ + flushSync(): void; + + /** + * Closes the stream, the data will be flushed down asynchronously + */ + end(): void; + + /** + * Closes the stream immediately, the data is not flushed. + */ + destroy(): void; +} diff --git a/types/index.test-d.ts b/types/index.test-d.ts new file mode 100644 index 0000000..69cf526 --- /dev/null +++ b/types/index.test-d.ts @@ -0,0 +1,34 @@ +import { expectType } from "tsd"; +import SonicBoom, { SonicBoom as SonicBoomNamed } from "../"; +import SonicBoomDefault from "../"; +import * as SonicBoomStar from "../"; +import SonicBoomCjsImport = require ("../"); +const SonicBoomCjs = require("../"); +const { SonicBoom: SonicBoomCjsNamed } = require('SonicBoom') + +const sonic = new SonicBoom(1); + +expectType(new SonicBoomNamed(1)); +expectType( new SonicBoomDefault(1)); +expectType( new SonicBoomStar.SonicBoom(1)); +expectType( new SonicBoomStar.default(1)); +expectType( new SonicBoomCjsImport.SonicBoom(1)); +expectType( new SonicBoomCjsImport.default(1)); +expectType( new SonicBoomCjs(1)); +expectType( new SonicBoomCjsNamed(1)); + +sonic.write('hello sonic\n'); + +sonic.flush(); + +sonic.flushSync(); + +sonic.reopen(); + +sonic.end(); + +sonic.destroy(); + +const extraSonic = new SonicBoom(1, 0, true); + +extraSonic.write('extra sonic\n');