From 14d464cc13e163b37148216a135cc66e30217245 Mon Sep 17 00:00:00 2001 From: Cecilia Sanare Date: Sat, 13 Jan 2024 21:13:46 -0600 Subject: [PATCH] feat(crypto): added a hook for utilizing the crypto.subtle api - temporarily lock semantic-release to v22 --- .github/workflows/ci.yml | 7 +++-- .swcrc | 16 ++++++++++ README.md | 16 ++++++++++ bun.lockb | Bin 346945 -> 345853 bytes jest.config.ts | 26 +++++++--------- package.json | 4 ++- .../__tests__/use-subtle-crypto.spec.tsx | 29 ++++++++++++++++++ src/hooks/use-subtle-crypto.ts | 19 ++++++++++++ src/utils/__tests__/subtle-crypto.spec.tsx | 25 +++++++++++++++ src/utils/subtle-crypto.ts | 16 ++++++++++ 10 files changed, 139 insertions(+), 19 deletions(-) create mode 100644 .swcrc create mode 100644 src/hooks/__tests__/use-subtle-crypto.spec.tsx create mode 100644 src/hooks/use-subtle-crypto.ts create mode 100644 src/utils/__tests__/subtle-crypto.spec.tsx create mode 100644 src/utils/subtle-crypto.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index be09d18..ed9462c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,7 +74,7 @@ jobs: - name: Build run: bun run build - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 with: name: build path: dist @@ -85,6 +85,7 @@ jobs: needs: [lint, test, build] steps: - uses: actions/checkout@v4 + - run: git --version - uses: oven-sh/setup-bun@v1 with: bun-version: latest @@ -92,13 +93,13 @@ jobs: - name: Install Packages run: bun install --frozen-lockfile - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 with: name: build path: dist - name: Deploy - run: bunx semantic-release + run: bunx semantic-release@^22 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.swcrc b/.swcrc new file mode 100644 index 0000000..32589e1 --- /dev/null +++ b/.swcrc @@ -0,0 +1,16 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": "inline", + "jsc": { + "target": "es2022", + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + } +} diff --git a/README.md b/README.md index 18204fb..64d0129 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,22 @@ export function MySimpleInput({ className: externalClassName, value: externalVal } ``` +## `useSubtleCrypto` + +```tsx +import { useSubtleCrypto } from '@rain-cafe/react-utils'; + +export type ProfileProps = { + email?: string; +}; + +export function Profile({ email }: ProfileProps) { + const hashedEmail = useSubtleCrypto('SHA-256', email); + + return ; +} +``` + [_**Want to Contribute?**_](/CONTRIBUTING.md) [npm-version-image]: https://img.shields.io/npm/v/@rain-cafe/react-utils.svg diff --git a/bun.lockb b/bun.lockb index 67fe63d22662d52e9319974e0cb92cce34a38366..923a35e260879ec464687a5ee9a31260c9915626 100755 GIT binary patch delta 62755 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쎌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�>w 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 diff --git a/jest.config.ts b/jest.config.ts index b6fc5c0..27cb5f1 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -1,23 +1,19 @@ -import type { JestConfigWithTsJest } from 'ts-jest'; +import type { Config } from 'jest'; +import { readFileSync } from 'fs'; -const jestConfig: JestConfigWithTsJest = { +// Changed sourcemaps to inline resolving issues with https://github.com/swc-project/swc/issues/3854 +const config = JSON.parse(readFileSync(`${__dirname}/.swcrc`, 'utf-8')); + +export default { roots: ['/src'], - testEnvironment: 'jsdom', + testEnvironment: '@happy-dom/jest-environment', transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - tsconfig: 'tsconfig.json', - }, - ], + '^.+\\.(t|j)sx?$': ['@swc/jest', config], }, collectCoverageFrom: ['/src/**/*'], - coveragePathIgnorePatterns: ['__tests__'], - - setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect'], -}; - -export default jestConfig; + setupFilesAfterEnv: ['@inrupt/jest-jsdom-polyfills', '@testing-library/jest-dom/extend-expect'], + extensionsToTreatAsEsm: ['.ts', '.tsx'], +} satisfies Config; diff --git a/package.json b/package.json index 44f3e7a..15a4786 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,9 @@ "classnames": "^2.5.1" }, "devDependencies": { + "@happy-dom/jest-environment": "^13.0.6", + "@inrupt/jest-jsdom-polyfills": "^3.0.2", + "@swc/jest": "^0.2.29", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", @@ -39,7 +42,6 @@ "eslint-plugin-react": "^7.33.1", "eslint-plugin-unused-imports": "^3.0.0", "jest": "^29.6.2", - "jest-environment-jsdom": "^29.6.2", "microbundle": "^0.15.1", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/src/hooks/__tests__/use-subtle-crypto.spec.tsx b/src/hooks/__tests__/use-subtle-crypto.spec.tsx new file mode 100644 index 0000000..5a05abb --- /dev/null +++ b/src/hooks/__tests__/use-subtle-crypto.spec.tsx @@ -0,0 +1,29 @@ +import { render, waitFor } from '@testing-library/react'; +import Chance from 'chance'; +import { useSubtleCrypto } from '../use-subtle-crypto'; +import { hash } from '../../utils/subtle-crypto'; + +const chance = new Chance(); + +describe('Crypto Hooks', () => { + describe('hook(useSubtleCrypto)', () => { + type ExampleComponentProps = { + value: string; + }; + + function ExampleComponent({ value }: ExampleComponentProps) { + const hashedValue = useSubtleCrypto('SHA-256', value); + + return
{hashedValue}
; + } + + it('should cache the value', async () => { + const value = chance.string(); + const expectedValue = await hash('SHA-256', value); + + const component = render(); + + await waitFor(() => expect(component.getByText(expectedValue)).toBeTruthy()); + }); + }); +}); diff --git a/src/hooks/use-subtle-crypto.ts b/src/hooks/use-subtle-crypto.ts new file mode 100644 index 0000000..1e38da8 --- /dev/null +++ b/src/hooks/use-subtle-crypto.ts @@ -0,0 +1,19 @@ +import { useEffect, useState } from 'react'; +import { Algorithms, hash } from '../utils/subtle-crypto'; + +/** + * Returns a hashed version of the value provided + * @param algorithm the hashing algorithm to use + * @param value the value to hash + * @returns the hashed value + * @see https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#browser_compatibility + */ +export function useSubtleCrypto(algorithm: Algorithms, value?: string | null): string | undefined { + const [hashedValue, setHashedValue] = useState(); + + useEffect(() => { + hash(algorithm, value).then(setHashedValue); + }, [algorithm, value]); + + return hashedValue; +} diff --git a/src/utils/__tests__/subtle-crypto.spec.tsx b/src/utils/__tests__/subtle-crypto.spec.tsx new file mode 100644 index 0000000..a0d9d4a --- /dev/null +++ b/src/utils/__tests__/subtle-crypto.spec.tsx @@ -0,0 +1,25 @@ +import { Algorithms, hash } from '../../utils/subtle-crypto'; + +describe('Crypto Utils', () => { + describe('fn(hash)', () => { + it.each([ + ['SHA-1', 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'], + ['SHA-256', '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + ['SHA-384', '768412320f7b0aa5812fce428dc4706b3cae50e02a64caa16a782249bfe8efc4b7ef1ccb126255d196047dfedf17a0a9'], + [ + 'SHA-512', + 'ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff', + ], + ])('should support %s', async (algorithm: Algorithms, expectedValue: string) => { + await expect(hash(algorithm, 'test')).resolves.toEqual(expectedValue); + }); + + it('should support being provided null', async () => { + await expect(hash('SHA-256', null)).resolves.toEqual(null); + }); + + it('should support being provided undefined', async () => { + await expect(hash('SHA-256', undefined)).resolves.toEqual(null); + }); + }); +}); diff --git a/src/utils/subtle-crypto.ts b/src/utils/subtle-crypto.ts new file mode 100644 index 0000000..5e5afc8 --- /dev/null +++ b/src/utils/subtle-crypto.ts @@ -0,0 +1,16 @@ +export type Algorithms = 'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512'; + +export async function hash(algorithm: Algorithms, message?: string): Promise { + if (!message) return null; + + const msgBuffer = new TextEncoder().encode(message); + + // hash the message + const hashBuffer = await crypto.subtle.digest(algorithm, msgBuffer); + + // convert ArrayBuffer to Array + const hashArray = Array.from(new Uint8Array(hashBuffer)); + + // convert bytes to hex string + return hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); +}