diff --git a/.eslintrc b/.eslintrc
index e4c49d2..4364a67 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -30,7 +30,8 @@
"plugin:jsx-a11y/recommended",
"plugin:prettier/recommended",
"plugin:react/recommended",
- "plugin:react-hooks/recommended"
+ "plugin:react-hooks/recommended",
+ "plugin:@next/next/recommended"
],
"plugins": ["@typescript-eslint", "react"],
"rules": {
diff --git a/package-lock.json b/package-lock.json
index f13925c..74e5ad6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
},
"devDependencies": {
"@next/bundle-analyzer": "^11.1.2",
+ "@next/eslint-plugin-next": "^11.1.2",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^12.1.0",
"@types/jest": "^27.0.1",
@@ -2280,6 +2281,15 @@
"resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.2.tgz",
"integrity": "sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA=="
},
+ "node_modules/@next/eslint-plugin-next": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-11.1.2.tgz",
+ "integrity": "sha512-cN+ojHRsufr9Yz0rtvjv8WI5En0RPZRJnt0y16Ha7DD+0n473evz8i1ETEJHmOLeR7iPJR0zxRrxeTN/bJMOjg==",
+ "dev": true,
+ "dependencies": {
+ "glob": "7.1.7"
+ }
+ },
"node_modules/@next/polyfill-module": {
"version": "11.1.2",
"resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.2.tgz",
@@ -6551,9 +6561,9 @@
}
},
"node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -17065,6 +17075,15 @@
"resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.2.tgz",
"integrity": "sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA=="
},
+ "@next/eslint-plugin-next": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-11.1.2.tgz",
+ "integrity": "sha512-cN+ojHRsufr9Yz0rtvjv8WI5En0RPZRJnt0y16Ha7DD+0n473evz8i1ETEJHmOLeR7iPJR0zxRrxeTN/bJMOjg==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.7"
+ }
+ },
"@next/polyfill-module": {
"version": "11.1.2",
"resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.2.tgz",
@@ -20315,9 +20334,9 @@
}
},
"glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
diff --git a/package.json b/package.json
index e782e8a..ffe90ab 100644
--- a/package.json
+++ b/package.json
@@ -6,9 +6,10 @@
"start": "next dev",
"build": "next build",
"serve": "next start",
- "test": "npm run lint && NODE_ENV=test jest",
- "test:watch": "npm run lint && NODE_ENV=test jest --watch",
+ "test": "npm run lint && npm run type-check && NODE_ENV=test jest",
+ "test:watch": "npm run lint && npm run type-check && NODE_ENV=test jest --watch",
"lint": "eslint --ignore-path .gitignore --ext .js --ext .tsx --ext .ts .",
+ "type-check": "tsc --noEmit",
"format": "prettier --ignore-path .gitignore '**/*.{css,yml,js,jsx,ts,tsx,json}' --write",
"analyze": "ANALYZE=true next build"
},
@@ -27,6 +28,7 @@
},
"devDependencies": {
"@next/bundle-analyzer": "^11.1.2",
+ "@next/eslint-plugin-next": "^11.1.2",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^12.1.0",
"@types/jest": "^27.0.1",
diff --git a/src/@types/ipfs.d.ts b/src/@types/ipfs.d.ts
index 8a31b6a..8d717f6 100644
--- a/src/@types/ipfs.d.ts
+++ b/src/@types/ipfs.d.ts
@@ -1,8 +1,10 @@
import { CID } from 'ipfs-http-client'
+// mirroring AddResult, which is not exported from 'ipfs-http-client'
export interface FileIpfs {
- path: string
cid: CID
size: number
+ path: string
mode?: number
+ mtime?: Mtime
}
diff --git a/src/__tests__/Layout.test.tsx b/src/__tests__/Layout.test.tsx
index 0702b92..31edc9f 100644
--- a/src/__tests__/Layout.test.tsx
+++ b/src/__tests__/Layout.test.tsx
@@ -1,10 +1,10 @@
import React from 'react'
-import { render } from '@testing-library/react'
+import { render, screen } from '@testing-library/react'
import Layout from '../Layout'
describe('Layout', () => {
it('renders without crashing', () => {
- const { container } = render(Hello)
- expect(container.firstChild).toBeInTheDocument()
+ render(Hello)
+ expect(screen.getByText('Hello')).toBeInTheDocument()
})
})
diff --git a/src/__tests__/Loader.test.tsx b/src/__tests__/Loader.test.tsx
index 6c48f41..4a3090c 100644
--- a/src/__tests__/Loader.test.tsx
+++ b/src/__tests__/Loader.test.tsx
@@ -1,10 +1,10 @@
import React from 'react'
-import { render } from '@testing-library/react'
+import { render, screen } from '@testing-library/react'
import Loader from '../components/Loader'
describe('Loader', () => {
- it('renders without crashing', () => {
- const { container } = render()
- expect(container.firstChild).toBeInTheDocument()
+ it('renders without crashing', async () => {
+ render()
+ expect(screen.getByText('Hello')).toBeInTheDocument()
})
})
diff --git a/src/__tests__/index.test.tsx b/src/__tests__/index.test.tsx
index 0b5fca8..65399ab 100644
--- a/src/__tests__/index.test.tsx
+++ b/src/__tests__/index.test.tsx
@@ -1,10 +1,11 @@
import React from 'react'
-import { render } from '@testing-library/react'
+import { render, waitFor, screen } from '@testing-library/react'
import Home from '../pages'
describe('Home', () => {
it('renders without crashing', async () => {
- const { container } = render()
- expect(container.firstChild).toBeInTheDocument()
+ render()
+ await waitFor(() => screen.getAllByTitle('Online').length === 2)
+ expect(screen.getAllByTitle('Online').length).toBe(2)
})
})
diff --git a/src/hooks/use-ipfs-api.tsx b/src/hooks/use-ipfs-api.tsx
index aca5e4e..e232919 100644
--- a/src/hooks/use-ipfs-api.tsx
+++ b/src/hooks/use-ipfs-api.tsx
@@ -1,5 +1,6 @@
import { useCallback, useEffect, useState } from 'react'
import { create, IPFSHTTPClient, Options } from 'ipfs-http-client'
+import type { CIDVersion } from 'multiformats/cid'
import { formatBytes } from '../utils'
import { FileDropzone } from '../components/Dropzone'
import { FileIpfs } from '../@types/ipfs'
@@ -30,7 +31,7 @@ export default function useIpfsApi(config: Options): IpfsApiValue {
const options = {
wrapWithDirectory: true,
- cidVersion: 1,
+ cidVersion: 1 as CIDVersion,
hashAlg: 'sha2-256',
progress: (length: number) => formatBytes(length, 0)
}