diff --git a/packages/browser-test-runner/src/createKarmaConfig.ts b/packages/browser-test-runner/src/createKarmaConfig.ts index 14f8e34f7e..38d09d8285 100644 --- a/packages/browser-test-runner/src/createKarmaConfig.ts +++ b/packages/browser-test-runner/src/createKarmaConfig.ts @@ -1,19 +1,40 @@ import fs from 'fs' +import type { Configuration, ExternalItem } from 'webpack' const DEBUG_MODE = process.env.BROWSER_TEST_DEBUG_MODE ?? false export const createKarmaConfig = ( - testPaths: string[], webpackConfig: () => Record, localDirectory: string + testPaths: string[], webpackConfig: () => Configuration, localDirectory?: string ): (config: any) => any => { const setupFiles = [__dirname + '/karma-setup.js'] - const localSetupFile = localDirectory + '/karma-setup.js' - if (fs.existsSync(localSetupFile)) { - setupFiles.push(localSetupFile) + + if (localDirectory !== undefined) { + const localSetupFile = localDirectory + '/karma-setup.js' + if (fs.existsSync(localSetupFile)) { + setupFiles.push(localSetupFile) + } } + const preprocessors: Record = {} setupFiles.forEach((f) => preprocessors[f] = ['webpack']) testPaths.forEach((f) => preprocessors[f] = ['webpack', 'sourcemap']) const baseWebpack = webpackConfig() + + const mergedExternals: ExternalItem[] = [] + if (baseWebpack.externals !== undefined) { + if (Array.isArray(baseWebpack.externals)) { + mergedExternals.push(...baseWebpack.externals) + } else { + mergedExternals.push(baseWebpack.externals) + } + } + mergedExternals.push({ + 'expect': 'commonjs2 expect', + '@jest/expect-utils': 'commonjs2 @jest/expect-utils', + 'pretty-format': 'commonjs2 pretty-format', + 'jest-diff': 'commonjs2 jest-diff', + }) + return (config: any) => { config.set({ plugins: [ @@ -56,13 +77,7 @@ export const createKarmaConfig = ( singleRun: !DEBUG_MODE, //set to false to leave electron window open webpack: { ...baseWebpack, - externals: { - ...(baseWebpack.externals ?? {}), - 'expect': 'commonjs2 expect', - '@jest/expect-utils': 'commonjs2 @jest/expect-utils', - 'pretty-format': 'commonjs2 pretty-format', - 'jest-diff': 'commonjs2 jest-diff', - }, + externals: mergedExternals, } }) } diff --git a/packages/browser-test-runner/src/createWebpackConfig.ts b/packages/browser-test-runner/src/createWebpackConfig.ts index 6920c9b169..293d89f9d6 100644 --- a/packages/browser-test-runner/src/createWebpackConfig.ts +++ b/packages/browser-test-runner/src/createWebpackConfig.ts @@ -1,17 +1,19 @@ import path from 'path' -import webpack from 'webpack' +import webpack, { type Configuration } from 'webpack' import NodePolyfillPlugin from 'node-polyfill-webpack-plugin' interface CreateWebpackConfigOptions { libraryName: string - alias?: Record - fallback?: Record - externals?: Record + alias?: webpack.ResolveOptions['alias'] + fallback?: webpack.ResolveOptions['fallback'] + externals?: webpack.Externals } +type CreateWebpackConfigReturnType = () => Configuration + export const createWebpackConfig = ( { libraryName, alias = {}, fallback = {}, externals = {} }: CreateWebpackConfigOptions -): Record => { +): CreateWebpackConfigReturnType => { return () => { return { cache: { diff --git a/packages/dht/karma.config.js b/packages/dht/karma.config.ts similarity index 51% rename from packages/dht/karma.config.js rename to packages/dht/karma.config.ts index ce05384d34..505d61e569 100644 --- a/packages/dht/karma.config.js +++ b/packages/dht/karma.config.ts @@ -1,6 +1,5 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -const path = require('path') -const { createKarmaConfig, createWebpackConfig } = require('@streamr/browser-test-runner') +import { resolve } from 'path' +import { createKarmaConfig, createWebpackConfig } from '@streamr/browser-test-runner' const TEST_PATHS = [ 'test/unit/**/!(connectivityRequestHandler*).ts', @@ -8,12 +7,12 @@ const TEST_PATHS = [ './test/end-to-end/**/!(RecoveryFromFailedAutoCertification*|memory-leak*|GeoIpLayer0*).ts' ] -const NodeWebrtcConnection = path.resolve(__dirname, 'src/connection/webrtc/NodeWebrtcConnection.ts') -const BrowserWebrtcConnection = path.resolve(__dirname, 'src/connection/webrtc/BrowserWebrtcConnection.ts') -const NodeWebsocketClientConnection = path.resolve(__dirname, 'src/connection/websocket/NodeWebsocketClientConnection.ts') -const BrowserWebsocketClientConnection = path.resolve(__dirname, 'src/connection/websocket/BrowserWebsocketClientConnection.ts') +const NodeWebrtcConnection = resolve(__dirname, 'src/connection/webrtc/NodeWebrtcConnection.ts') +const BrowserWebrtcConnection = resolve(__dirname, 'src/connection/webrtc/BrowserWebrtcConnection.ts') +const NodeWebsocketClientConnection = resolve(__dirname, 'src/connection/websocket/NodeWebsocketClientConnection.ts') +const BrowserWebsocketClientConnection = resolve(__dirname, 'src/connection/websocket/BrowserWebsocketClientConnection.ts') -module.exports = createKarmaConfig( +export default createKarmaConfig( TEST_PATHS, createWebpackConfig({ libraryName: 'dht', diff --git a/packages/dht/package.json b/packages/dht/package.json index 85c7dd200b..49e1684ec6 100644 --- a/packages/dht/package.json +++ b/packages/dht/package.json @@ -30,7 +30,7 @@ "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "npm run test-unit && npm run test-integration && npm run test-end-to-end", - "test-browser": "karma start karma.config.js", + "test-browser": "karma start karma.config.ts", "test-unit": "jest test/unit", "test-integration": "jest --bail test/integration", "test-end-to-end": "jest --bail test/end-to-end", diff --git a/packages/proto-rpc/karma.config.js b/packages/proto-rpc/karma.config.js deleted file mode 100644 index e0b4f2c1a4..0000000000 --- a/packages/proto-rpc/karma.config.js +++ /dev/null @@ -1,11 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-require-imports -const { createKarmaConfig, createWebpackConfig } = require('@streamr/browser-test-runner') - -const TEST_PATHS = ['test/**/*.ts'] - -module.exports = createKarmaConfig(TEST_PATHS, createWebpackConfig({ - libraryName: 'proto-rpc', - fallback: { - module: false - } -})) diff --git a/packages/proto-rpc/karma.config.ts b/packages/proto-rpc/karma.config.ts new file mode 100644 index 0000000000..3bae5dd158 --- /dev/null +++ b/packages/proto-rpc/karma.config.ts @@ -0,0 +1,10 @@ +import { createKarmaConfig, createWebpackConfig } from '@streamr/browser-test-runner' + +const TEST_PATHS = ['test/**/*.ts'] + +export default createKarmaConfig(TEST_PATHS, createWebpackConfig({ + libraryName: 'proto-rpc', + fallback: { + module: false + } +})) diff --git a/packages/proto-rpc/package.json b/packages/proto-rpc/package.json index c63d749d14..ebb0e24bb0 100644 --- a/packages/proto-rpc/package.json +++ b/packages/proto-rpc/package.json @@ -25,7 +25,7 @@ "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", "eslint": "./test-proto.sh && eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "./test-proto.sh && npm run test-unit && npm run test-integration", - "test-browser": "./test-proto.sh && karma start karma.config.js", + "test-browser": "./test-proto.sh && karma start karma.config.ts", "test-unit": "./test-proto.sh && jest test/unit", "test-integration": "./test-proto.sh && jest --bail test/integration" }, diff --git a/packages/sdk/karma-end-to-end.config.js b/packages/sdk/karma-end-to-end.config.js deleted file mode 100644 index 9dbebea2ca..0000000000 --- a/packages/sdk/karma-end-to-end.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -const webpackConfig = require('./webpack-karma.config') -const { createKarmaConfig } = require('@streamr/browser-test-runner') - -module.exports = createKarmaConfig(['test/end-to-end/**/*.ts'], webpackConfig, __dirname) diff --git a/packages/sdk/karma-end-to-end.config.ts b/packages/sdk/karma-end-to-end.config.ts new file mode 100644 index 0000000000..4cdf76f6ec --- /dev/null +++ b/packages/sdk/karma-end-to-end.config.ts @@ -0,0 +1,4 @@ +import webpackConfig from './webpack-karma.config' +import { createKarmaConfig } from '@streamr/browser-test-runner' + +export default createKarmaConfig(['test/end-to-end/**/*.ts'], webpackConfig, __dirname) diff --git a/packages/sdk/karma-integration.config.js b/packages/sdk/karma-integration.config.js deleted file mode 100644 index 8ae7fc1f5d..0000000000 --- a/packages/sdk/karma-integration.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -const webpackConfig = require('./webpack-karma.config') -const { createKarmaConfig } = require('@streamr/browser-test-runner') - -module.exports = createKarmaConfig(['test/integration/**/*.ts'], webpackConfig, __dirname) diff --git a/packages/sdk/karma-integration.config.ts b/packages/sdk/karma-integration.config.ts new file mode 100644 index 0000000000..b2848a6117 --- /dev/null +++ b/packages/sdk/karma-integration.config.ts @@ -0,0 +1,4 @@ +import webpackConfig from './webpack-karma.config' +import { createKarmaConfig } from '@streamr/browser-test-runner' + +export default createKarmaConfig(['test/integration/**/*.ts'], webpackConfig, __dirname) diff --git a/packages/sdk/karma-setup.js b/packages/sdk/karma-setup.js index 43dd7d02df..c65072a44a 100644 --- a/packages/sdk/karma-setup.js +++ b/packages/sdk/karma-setup.js @@ -3,8 +3,7 @@ * package. See karma-config.js in that package for more details. */ -// eslint-disable-next-line @typescript-eslint/no-require-imports -require('./test/test-utils/customMatchers') +import './test/test-utils/customMatchers' +import { customMatchers } from '@streamr/test-utils' -const { customMatchers } = require('@streamr/test-utils') -expect.extend(customMatchers) \ No newline at end of file +expect.extend(customMatchers) diff --git a/packages/sdk/karma-unit.config.js b/packages/sdk/karma-unit.config.js deleted file mode 100644 index 097e80fd97..0000000000 --- a/packages/sdk/karma-unit.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -const webpackConfig = require('./webpack-karma.config') -const { createKarmaConfig } = require('@streamr/browser-test-runner') - -module.exports = createKarmaConfig(['test/unit/**/*.ts'], webpackConfig, __dirname) diff --git a/packages/sdk/karma-unit.config.ts b/packages/sdk/karma-unit.config.ts new file mode 100644 index 0000000000..907753406d --- /dev/null +++ b/packages/sdk/karma-unit.config.ts @@ -0,0 +1,4 @@ +import webpackConfig from './webpack-karma.config' +import { createKarmaConfig } from '@streamr/browser-test-runner' + +export default createKarmaConfig(['test/unit/**/*.ts'], webpackConfig, __dirname) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 88908bd17a..c97018878b 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -44,9 +44,9 @@ "test-unit": "jest --useStderr --forceExit test/unit", "test-integration": "jest --bail --useStderr --forceExit --testTimeout=40000 test/integration/*.test.*", "test-end-to-end": "jest --bail --useStderr --forceExit --testTimeout=40000 test/end-to-end/*.test.*", - "test-browser-unit": "karma start karma-unit.config.js", - "test-browser-integration": "karma start karma-integration.config.js", - "test-browser-end-to-end": "karma start karma-end-to-end.config.js", + "test-browser-unit": "karma start karma-unit.config.ts", + "test-browser-integration": "karma start karma-integration.config.ts", + "test-browser-end-to-end": "karma start karma-end-to-end.config.ts", "test-browser-smoke": "bash test/browser-smoke-test/smoke-test.sh", "test-exports": "cd test/exports && npm run link && tsc --noEmit --project ./tsconfig.json && npm test" }, diff --git a/packages/sdk/webpack-karma.config.js b/packages/sdk/webpack-karma.config.ts similarity index 58% rename from packages/sdk/webpack-karma.config.js rename to packages/sdk/webpack-karma.config.ts index 51d82b06b8..3b36c09dac 100644 --- a/packages/sdk/webpack-karma.config.js +++ b/packages/sdk/webpack-karma.config.ts @@ -1,7 +1,8 @@ -const defaultConfig = require('./webpack.config') -const path = require('path') +import type { Configuration } from 'webpack' +import defaultConfig from './webpack.config' +import path from 'path' -module.exports = (env, argv) => { +const karmaWebpackConfig: (env?: Record, argv?: Record) => Configuration = (env = {}, argv = {}) => { const config = defaultConfig(env, argv) return { @@ -17,6 +18,8 @@ module.exports = (env, argv) => { v8: false, 'jest-leak-detector': false, } - } - } + }, + } as Configuration } + +export default karmaWebpackConfig diff --git a/packages/sdk/webpack.config.js b/packages/sdk/webpack.config.js index 4b93a3ca8f..d7005da143 100644 --- a/packages/sdk/webpack.config.js +++ b/packages/sdk/webpack.config.js @@ -52,6 +52,8 @@ module.exports = (env, argv) => { ] }, resolve: { + alias: {}, + fallback: {}, modules: ['node_modules', ...require.resolve.paths('')], extensions: ['.json', '.js', '.ts'], }, diff --git a/packages/trackerless-network/karma-setup.js b/packages/trackerless-network/karma-setup.js index c87bf6e6e5..4e1f75011f 100644 --- a/packages/trackerless-network/karma-setup.js +++ b/packages/trackerless-network/karma-setup.js @@ -3,5 +3,5 @@ * package. See karma-config.js in that package for more details. */ -const { customMatchers } = require('@streamr/test-utils') -expect.extend(customMatchers) \ No newline at end of file +import { customMatchers } from '@streamr/test-utils' +expect.extend(customMatchers) diff --git a/packages/trackerless-network/karma.config.js b/packages/trackerless-network/karma.config.js deleted file mode 100644 index 692143b6a4..0000000000 --- a/packages/trackerless-network/karma.config.js +++ /dev/null @@ -1,30 +0,0 @@ -/* eslint-disable @typescript-eslint/no-require-imports */ -const path = require('path') -const { createKarmaConfig, createWebpackConfig } = require('@streamr/browser-test-runner') - -const TEST_PATHS = [ - './test/unit/**/*.ts', - './test/integration/**/*.ts', - './test/end-to-end/**/!(webrtc*|websocket*)', -] - -module.exports = createKarmaConfig(TEST_PATHS, createWebpackConfig({ - libraryName: 'trackerless-network', - alias: { - [path.resolve(__dirname, '../dht/src/connection/webrtc/NodeWebrtcConnection.ts')]: - path.resolve(__dirname, '../dht/src/connection/webrtc/BrowserWebrtcConnection.ts'), - [path.resolve(__dirname, '../dht/src/connection/websocket/NodeWebsocketClientConnection.ts')]: - path.resolve(__dirname, '../dht/src/connection/websocket/BrowserWebsocketClientConnection.ts'), - '@streamr/dht': path.resolve('../dht/src/exports.ts'), - '@streamr/proto-rpc': path.resolve('../proto-rpc/src/exports.ts'), - }, - fallback: { - module: false - }, - externals: { - 'node-datachannel': 'commonjs node-datachannel', - express: 'Express', - http: 'HTTP', - ws: 'WebSocket', - } -}), __dirname) diff --git a/packages/trackerless-network/karma.config.ts b/packages/trackerless-network/karma.config.ts new file mode 100644 index 0000000000..4d2fb6f2be --- /dev/null +++ b/packages/trackerless-network/karma.config.ts @@ -0,0 +1,29 @@ +import { resolve } from 'path' +import { createKarmaConfig, createWebpackConfig } from '@streamr/browser-test-runner' + +const TEST_PATHS = [ + './test/unit/**/*.ts', + './test/integration/**/*.ts', + './test/end-to-end/**/!(webrtc*|websocket*)', +] + +export default createKarmaConfig(TEST_PATHS, createWebpackConfig({ + libraryName: 'trackerless-network', + alias: { + [resolve(__dirname, '../dht/src/connection/webrtc/NodeWebrtcConnection.ts')]: + resolve(__dirname, '../dht/src/connection/webrtc/BrowserWebrtcConnection.ts'), + [resolve(__dirname, '../dht/src/connection/websocket/NodeWebsocketClientConnection.ts')]: + resolve(__dirname, '../dht/src/connection/websocket/BrowserWebsocketClientConnection.ts'), + '@streamr/dht': resolve('../dht/src/exports.ts'), + '@streamr/proto-rpc': resolve('../proto-rpc/src/exports.ts'), + }, + fallback: { + module: false + }, + externals: { + 'node-datachannel': 'commonjs node-datachannel', + express: 'Express', + http: 'HTTP', + ws: 'WebSocket', + } +}), __dirname) diff --git a/packages/trackerless-network/package.json b/packages/trackerless-network/package.json index 85fcdd75e6..38597c80a4 100644 --- a/packages/trackerless-network/package.json +++ b/packages/trackerless-network/package.json @@ -26,7 +26,7 @@ "coverage": "jest --coverage", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "npm run test-unit && npm run test-integration && npm run test-end-to-end", - "test-browser": "karma start karma.config.js", + "test-browser": "karma start karma.config.ts", "test-unit": "jest test/unit", "test-integration": "jest --bail test/integration", "test-end-to-end": "jest --bail test/end-to-end", diff --git a/packages/utils/karma.config.js b/packages/utils/karma.config.js deleted file mode 100644 index 7bbe1a2d31..0000000000 --- a/packages/utils/karma.config.js +++ /dev/null @@ -1,11 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-require-imports -const { createKarmaConfig, createWebpackConfig } = require('@streamr/browser-test-runner') - -const TEST_PATHS = ['test/**/*.ts'] - -module.exports = createKarmaConfig(TEST_PATHS, createWebpackConfig({ - libraryName: 'utils', - fallback: { - module: false - } -})) diff --git a/packages/utils/karma.config.ts b/packages/utils/karma.config.ts new file mode 100644 index 0000000000..79cb15a828 --- /dev/null +++ b/packages/utils/karma.config.ts @@ -0,0 +1,10 @@ +import { createKarmaConfig, createWebpackConfig } from '@streamr/browser-test-runner' + +const TEST_PATHS = ['test/**/*.ts'] + +export default createKarmaConfig(TEST_PATHS, createWebpackConfig({ + libraryName: 'utils', + fallback: { + module: false + } +})) diff --git a/packages/utils/package.json b/packages/utils/package.json index 81f5d087cd..619b5c3a87 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -21,7 +21,7 @@ "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "jest", - "test-browser": "karma start karma.config.js" + "test-browser": "karma start karma.config.ts" }, "author": "Streamr Network AG ", "license": "Apache-2.0",