diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 4b060da..71e0af2 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -6,40 +6,9 @@ on: - main pull_request: -env: - NODE_VERSION: 16.x - jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Install dependencies - run: npm install - - name: Run ESLint - run: npm run eslint - - name: Run Prettier - run: npm run prettier - - name: Check types - run: npm run check-types - test: - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [14.x, 16.x, 18.x] - fail-fast: false - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - name: Install dependencies - run: npm install - - name: Run tests - run: npm run test-only - - name: Send coverage report to Codecov - uses: codecov/codecov-action@v2 + nodejs: + # Documentation: https://github.com/zakodium/workflows#nodejs-ci + uses: zakodium/workflows/.github/workflows/nodejs.yml@nodejs-v1 + with: + lint-check-types: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85d9a05..7f5db58 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,33 +5,12 @@ on: branches: - main -env: - NODE_VERSION: 16.x - jobs: - release-please: - runs-on: ubuntu-latest - steps: - - name: Get package name - run: echo "PACKAGE_NAME=$(jq .name package.json | tr -d '"')" >> $GITHUB_ENV - - uses: GoogleCloudPlatform/release-please-action@v2 - id: release - with: - token: ${{ secrets.BOT_TOKEN }} - release-type: node - package-name: ${{ env.PACKAGE_NAME }} - bump-minor-pre-major: Yes - - uses: actions/checkout@v2 - # These if statements ensure that a publication only occurs when a new release is created - if: ${{ steps.release.outputs.release_created }} - - uses: actions/setup-node@v2 - with: - node-version: ${{ env.NODE_VERSION }} - registry-url: 'https://registry.npmjs.org' - if: ${{ steps.release.outputs.release_created }} - - run: npm install - if: ${{ steps.release.outputs.release_created }} - - run: npm publish --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_BOT_TOKEN }} - if: ${{ steps.release.outputs.release_created }} + release: + # Documentation: https://github.com/zakodium/workflows#release + uses: zakodium/workflows/.github/workflows/release.yml@release-v1 + with: + npm: true + secrets: + github-token: ${{ secrets.BOT_TOKEN }} + npm-token: ${{ secrets.NPM_BOT_TOKEN }} diff --git a/package.json b/package.json index ee127e1..013c148 100644 --- a/package.json +++ b/package.json @@ -39,20 +39,20 @@ "testEnvironment": "node" }, "dependencies": { - "iobuffer": "^5.0.4", - "pako": "^2.0.4" + "iobuffer": "^5.3.2", + "pako": "^2.1.0" }, "devDependencies": { - "@types/jest": "^27.0.3", - "@types/node": "^16.11.11", - "@types/pako": "^1.0.2", - "eslint": "^8.3.0", - "eslint-config-cheminfo-typescript": "^10.2.4", - "jest": "^27.4.3", - "prettier": "^2.5.0", - "rimraf": "^3.0.2", - "ts-jest": "^27.0.7", - "typescript": "^4.5.2" + "@types/jest": "^29.5.11", + "@types/node": "^20.10.5", + "@types/pako": "^2.0.3", + "eslint": "^8.56.0", + "eslint-config-cheminfo-typescript": "^12.1.0", + "jest": "^29.7.0", + "prettier": "^3.1.1", + "rimraf": "^5.0.5", + "ts-jest": "^29.1.1", + "typescript": "^5.3.3" }, "prettier": { "arrowParens": "always", diff --git a/src/__tests__/decode.test.ts b/src/__tests__/decode.test.ts index 6c2484b..b6fbd59 100644 --- a/src/__tests__/decode.test.ts +++ b/src/__tests__/decode.test.ts @@ -173,7 +173,7 @@ test.each(cases)('should decode %s', (name, file, image) => { expect(components).toBe(file.components); expect(bitsPerSample).toBe(file.bitsPerSample); expect(data).toHaveLength(file.width * file.height * file.components); - expect(alpha).toBe(file.alpha ? true : false); + expect(alpha).toBe(Boolean(file.alpha)); }); // prettier-ignore @@ -239,7 +239,7 @@ test('should read exif data', () => { pages: [0], ignoreImageData: true, }); - // @ts-ignore + // @ts-expect-error We know exif is defined. expect(result[0].exif.map).toStrictEqual({ ColorSpace: 65535, PixelXDimension: 30, @@ -282,7 +282,7 @@ test('should decode palette', () => { expect(decoded).toHaveLength(1); const { palette } = decoded[0]; expect(palette).toHaveLength(256); - // @ts-ignore + // @ts-expect-error We know palette is defined. expect(palette[0]).toStrictEqual([65535, 0, 0]); }); diff --git a/src/ifd.ts b/src/ifd.ts index 4d24552..d775b26 100644 --- a/src/ifd.ts +++ b/src/ifd.ts @@ -43,7 +43,7 @@ export default class IFD { public get map(): Record { if (!this._hasMap) { const taglist = tags[this.kind].tagsById; - for (let key of this.fields.keys()) { + for (const key of this.fields.keys()) { if (taglist[key]) { this._map[taglist[key]] = this.fields.get(key); } diff --git a/src/ifdValue.ts b/src/ifdValue.ts index 2be6e1b..f8f6de4 100644 --- a/src/ifdValue.ts +++ b/src/ifdValue.ts @@ -1,6 +1,6 @@ import TIFFDecoder from './tiffDecoder'; -let types = new Map< +const types = new Map< number, [number, (decoder: TIFFDecoder, count: number) => any] >([ @@ -36,7 +36,7 @@ export function readData( function readByte(decoder: TIFFDecoder, count: number): number | Uint8Array { if (count === 1) return decoder.readUint8(); - let array = new Uint8Array(count); + const array = new Uint8Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readUint8(); } @@ -44,10 +44,10 @@ function readByte(decoder: TIFFDecoder, count: number): number | Uint8Array { } function readASCII(decoder: TIFFDecoder, count: number): string | string[] { - let strings = []; + const strings = []; let currentString = ''; for (let i = 0; i < count; i++) { - let char = String.fromCharCode(decoder.readUint8()); + const char = String.fromCharCode(decoder.readUint8()); if (char === '\0') { strings.push(currentString); currentString = ''; @@ -64,7 +64,7 @@ function readASCII(decoder: TIFFDecoder, count: number): string | string[] { function readShort(decoder: TIFFDecoder, count: number): number | Uint16Array { if (count === 1) return decoder.readUint16(); - let array = new Uint16Array(count); + const array = new Uint16Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readUint16(); } @@ -73,7 +73,7 @@ function readShort(decoder: TIFFDecoder, count: number): number | Uint16Array { function readLong(decoder: TIFFDecoder, count: number): number | Uint32Array { if (count === 1) return decoder.readUint32(); - let array = new Uint32Array(count); + const array = new Uint32Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readUint32(); } @@ -84,7 +84,7 @@ function readRational(decoder: TIFFDecoder, count: number): number | number[] { if (count === 1) { return decoder.readUint32() / decoder.readUint32(); } - let rationals = new Array(count); + const rationals = new Array(count); for (let i = 0; i < count; i++) { rationals[i] = decoder.readUint32() / decoder.readUint32(); } @@ -93,7 +93,7 @@ function readRational(decoder: TIFFDecoder, count: number): number | number[] { function readSByte(decoder: TIFFDecoder, count: number): number | Int8Array { if (count === 1) return decoder.readInt8(); - let array = new Int8Array(count); + const array = new Int8Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readInt8(); } @@ -102,7 +102,7 @@ function readSByte(decoder: TIFFDecoder, count: number): number | Int8Array { function readSShort(decoder: TIFFDecoder, count: number): number | Int16Array { if (count === 1) return decoder.readInt16(); - let array = new Int16Array(count); + const array = new Int16Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readInt16(); } @@ -111,7 +111,7 @@ function readSShort(decoder: TIFFDecoder, count: number): number | Int16Array { function readSLong(decoder: TIFFDecoder, count: number): number | Int32Array { if (count === 1) return decoder.readInt32(); - let array = new Int32Array(count); + const array = new Int32Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readInt32(); } @@ -122,7 +122,7 @@ function readSRational(decoder: TIFFDecoder, count: number): number | number[] { if (count === 1) { return decoder.readInt32() / decoder.readInt32(); } - let rationals = new Array(count); + const rationals = new Array(count); for (let i = 0; i < count; i++) { rationals[i] = decoder.readInt32() / decoder.readInt32(); } @@ -131,7 +131,7 @@ function readSRational(decoder: TIFFDecoder, count: number): number | number[] { function readFloat(decoder: TIFFDecoder, count: number): number | Float32Array { if (count === 1) return decoder.readFloat32(); - let array = new Float32Array(count); + const array = new Float32Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readFloat32(); } @@ -143,7 +143,7 @@ function readDouble( count: number, ): number | Float64Array { if (count === 1) return decoder.readFloat64(); - let array = new Float64Array(count); + const array = new Float64Array(count); for (let i = 0; i < count; i++) { array[i] = decoder.readFloat64(); } diff --git a/src/tags/exif.ts b/src/tags/exif.ts index 4d6f257..3dd796a 100644 --- a/src/tags/exif.ts +++ b/src/tags/exif.ts @@ -71,7 +71,7 @@ const tagsById: Record = { }; const tagsByName: Record = {}; -for (let i in tagsById) { +for (const i in tagsById) { tagsByName[tagsById[i]] = Number(i); } diff --git a/src/tags/gps.ts b/src/tags/gps.ts index 760a2c4..d33fee8 100644 --- a/src/tags/gps.ts +++ b/src/tags/gps.ts @@ -34,7 +34,7 @@ const tagsById: Record = { }; const tagsByName: Record = {}; -for (let i in tagsById) { +for (const i in tagsById) { tagsByName[tagsById[i]] = Number(i); } diff --git a/src/tags/standard.ts b/src/tags/standard.ts index 456141f..b027a26 100644 --- a/src/tags/standard.ts +++ b/src/tags/standard.ts @@ -176,7 +176,7 @@ const tagsById: Record = { }; const tagsByName: Record = {}; -for (let i in tagsById) { +for (const i in tagsById) { tagsByName[tagsById[i]] = Number(i); } diff --git a/src/tiffDecoder.ts b/src/tiffDecoder.ts index 56c95d8..c3a4374 100644 --- a/src/tiffDecoder.ts +++ b/src/tiffDecoder.ts @@ -63,7 +63,7 @@ export default class TIFFDecoder extends IOBuffer { const maxIndex = pages ? Math.max(...pages) : Infinity; - options = Object.assign({}, defaultOptions, options); + options = { ...defaultOptions, ...options }; const result = []; this.decodeHeader(); let index = 0; @@ -160,7 +160,7 @@ export default class TIFFDecoder extends IOBuffer { // Read sub-IFDs if (tag === 0x8769 || tag === 0x8825) { - let currentOffset = this.offset; + const currentOffset = this.offset; let kind: IFDKind = 'exif'; if (tag === 0x8769) { kind = 'exif'; @@ -203,7 +203,7 @@ export default class TIFFDecoder extends IOBuffer { if (ifd.type === 0) { // WhiteIsZero: we invert the values const bitDepth = ifd.bitsPerSample; - const maxValue = Math.pow(2, bitDepth) - 1; + const maxValue = 2 ** bitDepth - 1; for (let i = 0; i < ifd.data.length; i++) { ifd.data[i] = maxValue - ifd.data[i]; } @@ -227,14 +227,14 @@ export default class TIFFDecoder extends IOBuffer { let remainingPixels = size; let pixel = 0; for (let i = 0; i < stripOffsets.length; i++) { - let stripData = new DataView( + const stripData = new DataView( this.buffer, this.byteOffset + stripOffsets[i], stripByteCounts[i], ); // Last strip can be smaller - let length = remainingPixels > maxPixels ? maxPixels : remainingPixels; + const length = remainingPixels > maxPixels ? maxPixels : remainingPixels; remainingPixels -= length; let dataToFill = stripData; @@ -401,8 +401,8 @@ function unsupported(type: string, value: any): Error { } function checkPages(pages: number[] | undefined) { if (pages) { - for (let page of pages) { - if (page < 0 || Number.isInteger(page) === false) { + for (const page of pages) { + if (page < 0 || !Number.isInteger(page)) { throw new RangeError( `Index ${page} is invalid. Must be a positive integer.`, ); diff --git a/src/tiffIfd.ts b/src/tiffIfd.ts index 2910fda..f539e23 100644 --- a/src/tiffIfd.ts +++ b/src/tiffIfd.ts @@ -22,8 +22,8 @@ export default class TiffIfd extends Ifd { return this.samplesPerPixel; } public get date(): Date { - let date = new Date(); - let result = dateTimeRegex.exec(this.dateTime); + const date = new Date(); + const result = dateTimeRegex.exec(this.dateTime); if (result === null) { throw new Error(`invalid dateTime: ${this.dateTime}`); } @@ -100,7 +100,7 @@ export default class TiffIfd extends Ifd { return this.get('MinSampleValue') || 0; } public get maxSampleValue(): number { - return this.get('MaxSampleValue') || Math.pow(2, this.bitsPerSample) - 1; + return this.get('MaxSampleValue') || 2 ** this.bitsPerSample - 1; } public get xResolution(): number { return this.get('XResolution'); @@ -129,14 +129,14 @@ export default class TiffIfd extends Ifd { public get sMaxSampleValue(): number { return this.get('SMaxSampleValue') || this.maxSampleValue; } - public get palette(): [number, number, number][] | undefined { + public get palette(): Array<[number, number, number]> | undefined { const totalColors = 2 ** this.bitsPerSample; const colorMap: number[] = this.get('ColorMap'); if (!colorMap) return undefined; if (colorMap.length !== 3 * totalColors) { throw new Error(`ColorMap size must be ${totalColors}`); } - const palette: [number, number, number][] = []; + const palette: Array<[number, number, number]> = []; for (let i = 0; i < totalColors; i++) { palette.push([ colorMap[i],