From a624dd1222e3641337ed3039029602e9bb033aa5 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 14 Jun 2023 21:32:06 -0400 Subject: [PATCH 1/4] refactor(module): move mjs files from src to module directory Release-As: 1.0.2 --- module/browser.mjs | 1 + module/browser.test.mjs | 45 +++++++++++++++++++++++++++++++++++++++++ module/index.mjs | 1 + module/index.test.mjs | 39 +++++++++++++++++++++++++++++++++++ package.json | 14 +++++++------ src/browser.mjs | 1 - src/index.mjs | 1 - 7 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 module/browser.mjs create mode 100644 module/browser.test.mjs create mode 100644 module/index.mjs create mode 100644 module/index.test.mjs delete mode 100644 src/browser.mjs delete mode 100644 src/index.mjs diff --git a/module/browser.mjs b/module/browser.mjs new file mode 100644 index 0000000..be866d1 --- /dev/null +++ b/module/browser.mjs @@ -0,0 +1 @@ +export { digest } from '../lib/browser.js'; diff --git a/module/browser.test.mjs b/module/browser.test.mjs new file mode 100644 index 0000000..68b6548 --- /dev/null +++ b/module/browser.test.mjs @@ -0,0 +1,45 @@ +import crypto from 'node:crypto'; +import { before, describe, it } from 'node:test'; + +import assert from 'assert'; + +describe('browser', () => { + let digest; + + before(async () => { + global.crypto = crypto; + digest = (await import('./browser.mjs')).digest; + }); + + it('exports "digest" function', () => { + assert.strictEqual(typeof digest, 'function'); + }); + + it('returns "SHA-1"', async () => { + assert.strictEqual( + await digest('SHA-1', ''), + 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + ); + }); + + it('returns "SHA-256"', async () => { + assert.strictEqual( + await digest('SHA-256', ''), + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' + ); + }); + + it('returns "SHA-384"', async () => { + assert.strictEqual( + await digest('SHA-384', ''), + '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' + ); + }); + + it('returns "SHA-512"', async () => { + assert.strictEqual( + await digest('SHA-384', ''), + '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' + ); + }); +}); diff --git a/module/index.mjs b/module/index.mjs new file mode 100644 index 0000000..756ae7b --- /dev/null +++ b/module/index.mjs @@ -0,0 +1 @@ +export { digest } from '../lib/index.js'; diff --git a/module/index.test.mjs b/module/index.test.mjs new file mode 100644 index 0000000..be7f9f5 --- /dev/null +++ b/module/index.test.mjs @@ -0,0 +1,39 @@ +import { describe, it } from 'node:test'; + +import assert from 'assert'; + +import { digest } from './index.mjs'; + +describe('index', () => { + it('exports "digest" function', () => { + assert.strictEqual(typeof digest, 'function'); + }); + + it('returns "SHA-1"', async () => { + assert.strictEqual( + await digest('SHA-1', ''), + 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + ); + }); + + it('returns "SHA-256"', async () => { + assert.strictEqual( + await digest('SHA-256', ''), + 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' + ); + }); + + it('returns "SHA-384"', async () => { + assert.strictEqual( + await digest('SHA-384', ''), + '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' + ); + }); + + it('returns "SHA-512"', async () => { + assert.strictEqual( + await digest('SHA-384', ''), + '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' + ); + }); +}); diff --git a/package.json b/package.json index 63c25b8..689f007 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,22 @@ "author": "Mark ", "main": "lib/index.js", "types": "lib/index.d.ts", - "module": "lib/index.mjs", + "module": "module/index.mjs", "exports": { "types": "./lib/index.d.ts", - "import": "./lib/index.mjs", + "import": "./module/index.mjs", "require": "./lib/index.js" }, "browser": { "./lib/index.js": "./lib/browser.js", - "./lib/index.mjs": "./lib/browser.mjs" + "./module/index.mjs": "./module/browser.mjs" }, "scripts": { - "build": "tsc && cp src/*.mjs lib", + "build": "tsc", "build:watch": "tsc --watch", "clean": "rm -rf coverage docs lib", "docs": "typedoc", - "lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .", + "lint": "eslint --ignore-path .gitignore --ext .js,.mjs,.ts .", "lint:fix": "npm run lint -- --fix", "lint:tsc": "tsc --noEmit", "postinstall": "husky install", @@ -28,6 +28,7 @@ "prepublishOnly": "pinst --disable && npm run lint && npm run lint:tsc && npm run test:ci && npm run clean && npm run build", "test": "jest", "test:ci": "CI=true jest --ci --colors --coverage", + "test:module": "npm run build && node --test module", "test:watch": "jest --watch" }, "repository": { @@ -61,7 +62,8 @@ "typescript": "5.1.3" }, "files": [ - "lib/" + "lib/", + "module/" ], "license": "MIT" } diff --git a/src/browser.mjs b/src/browser.mjs deleted file mode 100644 index 86b1ef7..0000000 --- a/src/browser.mjs +++ /dev/null @@ -1 +0,0 @@ -export { digest } from './browser.js'; diff --git a/src/index.mjs b/src/index.mjs deleted file mode 100644 index 2d17dad..0000000 --- a/src/index.mjs +++ /dev/null @@ -1 +0,0 @@ -export { digest } from './index.js'; From 20877b2fb7281970b81c43ed212fa25f543fe063 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 14 Jun 2023 21:33:40 -0400 Subject: [PATCH 2/4] chore(husky): run module tests in pre-commit hook --- .husky/pre-commit | 1 + 1 file changed, 1 insertion(+) diff --git a/.husky/pre-commit b/.husky/pre-commit index fb5c1fd..e1119eb 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -3,4 +3,5 @@ npm run lint:tsc npm run test:ci +npm run test:module npx lint-staged From c1141f9bd2f1dcd0098ed358e257af947d737ac2 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 14 Jun 2023 21:34:13 -0400 Subject: [PATCH 3/4] ci(github): run module tests in workflow build.yml --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 77a02ef..1458faf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,6 +35,9 @@ jobs: - name: Run tests run: npm run test:ci + - name: Run module tests + run: npm run test:module + - name: Codecov uses: codecov/codecov-action@v3 From e6a2c987c65ad86110070d3cb3be8164f2d86b4c Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 14 Jun 2023 21:38:20 -0400 Subject: [PATCH 4/4] test: colocate tests and improve test description --- __tests__/__snapshots__/index.test.ts.snap | 9 --------- module/browser.test.mjs | 8 ++++---- module/index.test.mjs | 8 ++++---- src/__snapshots__/index.test.ts.snap | 9 +++++++++ {__tests__ => src}/index.test.ts | 6 ++---- tsconfig.json | 3 ++- 6 files changed, 21 insertions(+), 22 deletions(-) delete mode 100644 __tests__/__snapshots__/index.test.ts.snap create mode 100644 src/__snapshots__/index.test.ts.snap rename {__tests__ => src}/index.test.ts (55%) diff --git a/__tests__/__snapshots__/index.test.ts.snap b/__tests__/__snapshots__/index.test.ts.snap deleted file mode 100644 index 397355f..0000000 --- a/__tests__/__snapshots__/index.test.ts.snap +++ /dev/null @@ -1,9 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`digest hashes message with algorithm SHA-1 1`] = `"da39a3ee5e6b4b0d3255bfef95601890afd80709"`; - -exports[`digest hashes message with algorithm SHA-256 1`] = `"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"`; - -exports[`digest hashes message with algorithm SHA-384 1`] = `"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"`; - -exports[`digest hashes message with algorithm SHA-512 1`] = `"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"`; diff --git a/module/browser.test.mjs b/module/browser.test.mjs index 68b6548..e5fee66 100644 --- a/module/browser.test.mjs +++ b/module/browser.test.mjs @@ -15,28 +15,28 @@ describe('browser', () => { assert.strictEqual(typeof digest, 'function'); }); - it('returns "SHA-1"', async () => { + it('hashes message with algorithm "SHA-1"', async () => { assert.strictEqual( await digest('SHA-1', ''), 'da39a3ee5e6b4b0d3255bfef95601890afd80709' ); }); - it('returns "SHA-256"', async () => { + it('hashes message with algorithm "SHA-256"', async () => { assert.strictEqual( await digest('SHA-256', ''), 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' ); }); - it('returns "SHA-384"', async () => { + it('hashes message with algorithm "SHA-384"', async () => { assert.strictEqual( await digest('SHA-384', ''), '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' ); }); - it('returns "SHA-512"', async () => { + it('hashes message with algorithm "SHA-512"', async () => { assert.strictEqual( await digest('SHA-384', ''), '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' diff --git a/module/index.test.mjs b/module/index.test.mjs index be7f9f5..b25ad6c 100644 --- a/module/index.test.mjs +++ b/module/index.test.mjs @@ -9,28 +9,28 @@ describe('index', () => { assert.strictEqual(typeof digest, 'function'); }); - it('returns "SHA-1"', async () => { + it('hashes message with algorithm "SHA-1"', async () => { assert.strictEqual( await digest('SHA-1', ''), 'da39a3ee5e6b4b0d3255bfef95601890afd80709' ); }); - it('returns "SHA-256"', async () => { + it('hashes message with algorithm "SHA-256"', async () => { assert.strictEqual( await digest('SHA-256', ''), 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' ); }); - it('returns "SHA-384"', async () => { + it('hashes message with algorithm "SHA-384"', async () => { assert.strictEqual( await digest('SHA-384', ''), '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' ); }); - it('returns "SHA-512"', async () => { + it('hashes message with algorithm "SHA-512"', async () => { assert.strictEqual( await digest('SHA-384', ''), '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b' diff --git a/src/__snapshots__/index.test.ts.snap b/src/__snapshots__/index.test.ts.snap new file mode 100644 index 0000000..52aec1a --- /dev/null +++ b/src/__snapshots__/index.test.ts.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`digest hashes message with algorithm "SHA-1" 1`] = `"da39a3ee5e6b4b0d3255bfef95601890afd80709"`; + +exports[`digest hashes message with algorithm "SHA-256" 1`] = `"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"`; + +exports[`digest hashes message with algorithm "SHA-384" 1`] = `"38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"`; + +exports[`digest hashes message with algorithm "SHA-512" 1`] = `"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"`; diff --git a/__tests__/index.test.ts b/src/index.test.ts similarity index 55% rename from __tests__/index.test.ts rename to src/index.test.ts index 4bf2790..3997784 100644 --- a/__tests__/index.test.ts +++ b/src/index.test.ts @@ -1,10 +1,8 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import { digest } from '../src/index.ts'; +import { digest } from './index'; describe('digest', () => { it.each(['SHA-1', 'SHA-256', 'SHA-384', 'SHA-512'] as const)( - 'hashes message with algorithm %s', + 'hashes message with algorithm "%s"', async (algorithm) => { expect(await digest(algorithm, '')).toMatchSnapshot(); } diff --git a/tsconfig.json b/tsconfig.json index f8fa43d..c1f397f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,5 +10,6 @@ "strict": true, "outDir": "lib" }, - "include": ["src"] + "include": ["src"], + "exclude": ["node_modules", "src/**/*.test.ts"] }