[web3.js][experimental] Set up test/dev infra (#28950)

* Update `@solana/eslint-config-solana`

* [web3.js][experimental] Add Watchman config to ignore `dist` and `node_modules` folders

* [web3.js][experimental] Install Jest

* [web3.js][experimental] Configure Jest to lint, format, and test code

* [web3.js][experimental] Add a typecheck step

* [web3.js][experimental] Add fake tests and fake implementation to exercise the build infra
This commit is contained in:
Steven Luscher 2022-11-23 18:25:02 -08:00 committed by GitHub
parent 2e99668111
commit 656b150e57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 3357 additions and 61 deletions

View File

@ -1,3 +1,3 @@
{
"extends": ["@solana/eslint-config-solana"]
"extends": ["@solana/eslint-config-solana", "@solana/eslint-config-solana/jest"]
}

View File

@ -0,0 +1,3 @@
{
"ignore_dirs": ["dist", "node_modules"]
}

View File

@ -0,0 +1,11 @@
import type { Config } from 'jest';
export default {
projects: [
'<rootDir>/internal/jest/jest-lint.config.ts',
'<rootDir>/internal/jest/jest-prettier.config.ts',
'<rootDir>/internal/jest/jest-unit.config.browser.ts',
'<rootDir>/internal/jest/jest-unit.config.node.ts',
],
rootDir: '../../',
} as Config;

View File

@ -0,0 +1,8 @@
import type { Config } from 'jest';
export default {
displayName: 'ESLint',
rootDir: '../../',
runner: 'eslint',
testMatch: ['<rootDir>src/**/*.ts', '<rootDir>internal/**'],
} as Config;

View File

@ -0,0 +1,9 @@
import type { Config } from 'jest';
export default {
displayName: 'Prettier',
moduleFileExtensions: ['js', 'ts', 'json', 'md'],
rootDir: '../../',
runner: 'prettier',
testMatch: ['<rootDir>README.md', '<rootDir>internal/**', '<rootDir>src/**', '<rootDir>*'],
} as Config;

View File

@ -0,0 +1,15 @@
import type { Config } from 'jest';
import commonConfig from './jest-unit.config.common';
export default {
...commonConfig,
displayName: 'Unit Test (Browser)',
globals: {
...commonConfig.globals,
__BROWSER__: true,
__NODEJS__: false,
__REACTNATIVE__: false,
},
testEnvironment: 'jsdom',
testEnvironmentOptions: {},
} as Config;

View File

@ -0,0 +1,20 @@
import type { Config } from 'jest';
export default {
globals: {
__DEV__: false,
},
rootDir: '../../',
roots: ['<rootDir>src/'],
setupFilesAfterEnv: ['<rootDir>internal/jest/setupFile.ts'],
transform: {
'^.+\\.(ts|js)$': [
'@swc/jest',
{
jsc: {
target: 'es2020',
},
},
],
},
} as Config;

View File

@ -0,0 +1,13 @@
import { Config } from 'jest';
import commonConfig from './jest-unit.config.common';
export default {
...commonConfig,
displayName: 'Unit Test (Node)',
globals: {
...commonConfig.globals,
__BROWSER__: false,
__NODEJS__: true,
__REACTNATIVE__: false,
},
} as Config;

View File

@ -36,14 +36,18 @@
"web3"
],
"scripts": {
"build": "turbo run compile:js compile:typedefs lint verifyTreeShakability:browser verifyTreeShakability:native verifyTreeShakability:node",
"build": "turbo run compile:js compile:typedefs test:lint test:prettier test:typecheck test:unit:browser test:unit:node test:treeshakability:browser test:treeshakability:native test:treeshakability:node",
"compile:js": "tsup",
"compile:typedefs": "tsc -p ./tsconfig.declarations.json",
"dev": "pnpm run compile:js --watch",
"lint": "eslint 'src/**'",
"verifyTreeShakability:browser": "agadoo dist/index.browser.js",
"verifyTreeShakability:native": "agadoo dist/index.node.js",
"verifyTreeShakability:node": "agadoo dist/index.native.js"
"dev": "jest -c ./internal/jest/jest-dev.config.ts --watch",
"test:lint": "jest -c ./internal/jest/jest-lint.config.ts --silent",
"test:prettier": "jest -c ./internal/jest/jest-prettier.config.ts --silent",
"test:typecheck": "tsc --noEmit",
"test:unit:browser": "jest -c ./internal/jest/jest-unit.config.browser.ts --silent",
"test:unit:node": "jest -c ./internal/jest/jest-unit.config.node.ts --silent",
"test:treeshakability:browser": "agadoo dist/index.browser.js",
"test:treeshakability:native": "agadoo dist/index.node.js",
"test:treeshakability:node": "agadoo dist/index.native.js"
},
"author": "Solana Maintainers <maintainers@solana.com>",
"license": "MIT",
@ -59,20 +63,28 @@
"maintained node versions"
],
"devDependencies": {
"@solana/eslint-config-solana": "0.0.1",
"@solana/eslint-config-solana": "^0.0.4",
"@solana/prettier-config-solana": "0.0.1",
"@swc/core": "^1",
"@swc/core": "^1.3.18",
"@swc/jest": "^0.2.23",
"@types/jest": "^29.2.3",
"@typescript-eslint/eslint-plugin": "^5.43.0",
"@typescript-eslint/parser": "^5.43.0",
"agadoo": "^2.0.0",
"eslint": "^8.27.0",
"eslint-plugin-jest": "^27.1.5",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-sort-keys-fix": "^1.1.2",
"jest": "^29.3.1",
"jest-environment-jsdom": "^29.3.1",
"jest-runner-eslint": "^1.1.0",
"jest-runner-prettier": "^1.0.0",
"postcss": "^8.4.12",
"prettier": "^2.7.1",
"ts-node": "^10.9.1",
"tsup": "6.5.0",
"turbo": "^1.6.3",
"typescript": "^4.1.0"
"typescript": "~4.8"
},
"bundlewatch": {
"defaultCompression": "gzip",

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,19 @@
import rpc from '../rpc';
describe('rpc', () => {
if (__BROWSER__) {
it('logs stuff in the browser', () => {
const spy = jest.spyOn(console, 'log');
rpc();
expect(spy).toHaveBeenCalledWith(`This is the browser fork of \`doThing()\``);
});
}
if (__NODEJS__) {
it('logs stuff in node', () => {
const spy = jest.spyOn(console, 'log');
rpc();
expect(spy).toHaveBeenCalledWith(`This is the node fork of \`doThing()\``);
});
}
it.todo('does something useful');
});

View File

@ -1,6 +1,6 @@
import doThingBrowser from './doThing.browser.js';
import doThingNative from './doThing.native.js';
import doThingNode from './doThing.js';
import doThingBrowser from './doThing.browser';
import doThingNative from './doThing.native';
import doThingNode from './doThing';
export default function rpc() {
if (__DEV__) {

View File

@ -1,6 +1,7 @@
{
"compilerOptions": {
"moduleResolution": "node",
"target": "es2020"
},
"include": ["src"]
"include": ["internal", "src"]
}

View File

@ -1,29 +1,44 @@
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"analyzeBundleSize": {
"dependsOn": ["compile:js"],
"outputs": []
},
"compile:js": {
"inputs": ["./src/**"],
"outputs": ["dist/**"]
},
"compile:typedefs": {
"dependsOn": ["compile:js"],
"inputs": ["./src/**"],
"outputs": ["dist/**"]
},
"lint": {
"test:lint": {
"inputs": ["./internal/**", "./src/**"],
"outputs": []
},
"verifyTreeShakability:browser": {
"test:prettier": {
"inputs": ["./internal/**", "./src/**"],
"outputs": []
},
"test:typecheck": {
"inputs": ["./internal/**", "./src/**"],
"outputs": []
},
"test:unit:browser": {
"inputs": ["./src/**"],
"outputs": []
},
"test:unit:node": {
"inputs": ["./src/**"],
"outputs": []
},
"test:treeshakability:browser": {
"dependsOn": ["compile:js"],
"outputs": []
},
"verifyTreeShakability:native": {
"test:treeshakability:native": {
"dependsOn": ["compile:js"],
"outputs": []
},
"verifyTreeShakability:node": {
"test:treeshakability:node": {
"dependsOn": ["compile:js"],
"outputs": []
}