Skip to content

Commit c4b4629

Browse files
committed
chore: upgrade testing environment
1 parent 6a3c896 commit c4b4629

File tree

4 files changed

+79
-193
lines changed

4 files changed

+79
-193
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ node_modules
22
coverage
33
dist
44
.DS_Store
5+
.swc
56

67
# these cause more harm than good
78
# when working with contributors

package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,18 @@
3838
"validate": "kcd-scripts typecheck"
3939
},
4040
"devDependencies": {
41+
"@esbuild-plugins/node-modules-polyfill": "^0.2.2",
4142
"@ph.fritsche/scripts-config": "^2.4.0",
42-
"@ph.fritsche/toolbox": "^1.0.0-alpha.1",
43+
"@ph.fritsche/toolbox": "^1.0.0-alpha.11",
4344
"@testing-library/dom": "^8.19.0",
4445
"@testing-library/jest-dom": "^5.16.3",
4546
"@testing-library/react": "^13.4.0",
4647
"@types/jest-in-case": "^1.0.3",
4748
"@types/react": "^18.0.25",
4849
"@types/sinonjs__fake-timers": "^8.1.2",
4950
"css.escape": "^1.5.1",
51+
"esbuild": "^0.19.10",
52+
"esbuild-plugin-globals": "^0.2.0",
5053
"eslint-import-resolver-typescript": "^3.5.2",
5154
"eslint-plugin-local-rules": "^1.3.2",
5255
"expect": "^28.1.3",

scripts/setup.js

+20-51
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import fs from 'fs/promises'
22
import path from 'path'
3-
import {createBundleBuilder} from '@ph.fritsche/toolbox/dist/builder/index.js'
43
import {spawn} from 'child_process'
4+
import esbuild from 'esbuild'
5+
import pluginGlobals from 'esbuild-plugin-globals'
6+
import {NodeModulesPolyfillPlugin} from '@esbuild-plugins/node-modules-polyfill'
57

68
const dirname = path.dirname(new URL(import.meta.url).pathname)
79
const indexDirLib = path.join(dirname, '../testenv/libs')
@@ -92,61 +94,28 @@ async function buildLib(name, dir) {
9294

9395
process.stdout.write(`Bundling library "${name}" at ${dir}/index.js\n`)
9496

95-
const builder = createBundleBuilder({
96-
basePath: `${dir}/`,
97-
globals,
97+
await esbuild.build({
98+
entryPoints: [`${dir}/index.js`],
99+
outfile: `${dir}/index.bundle.js`,
100+
bundle: true,
101+
plugins: [
102+
pluginGlobals(globals),
103+
],
98104
})
99-
builder.inputFiles.set(`${dir}/index.js`, undefined)
100-
101-
builder.emitter.addListener('complete', e => {
102-
const content = String(e.outputFiles.get('index.js')?.content)
103-
fs.writeFile(`${dir}/index.bundle.js`, content).then(() =>
104-
process.stdout.write(
105-
[
106-
'<<<',
107-
`Wrote ${dir}/index.bundle.js`,
108-
`[${content.length} bytes]`,
109-
...(globals && Object.keys(globals).length
110-
? [
111-
` Depending on:`,
112-
...Object.entries(globals).map(
113-
([module, name]) => ` ${name} => ${module}`,
114-
),
115-
]
116-
: []),
117-
'>>>',
118-
'',
119-
].join('\n'),
120-
),
121-
)
122-
})
123-
124-
builder.build()
125105
}
126106

127107
async function buildEnv(name, file) {
128108
process.stdout.write(`Bundling environment "${name}" at ${file}\n`)
129109

130-
const builder = createBundleBuilder({
131-
basePath: `${indexDirEnv}/`,
132-
})
133-
const basename = path.basename(file, '.js')
134-
builder.inputFiles.set(file, undefined)
135-
136-
builder.emitter.addListener('complete', e => {
137-
const content = String(e.outputFiles.get(`${basename}.js`)?.content)
138-
fs.writeFile(`${indexDirEnv}/${basename}.bundle.js`, content).then(() =>
139-
process.stdout.write(
140-
[
141-
'<<<',
142-
`Wrote ${indexDirEnv}/${basename}.bundle.js`,
143-
`[${content.length} bytes]`,
144-
'>>>',
145-
'',
146-
].join('\n'),
147-
),
148-
)
149-
})
110+
const base = path.basename(file, '.js')
150111

151-
builder.build()
112+
await esbuild.build({
113+
entryPoints: [file],
114+
outfile: `${indexDirEnv}/${base}.bundle.js`,
115+
bundle: true,
116+
sourcemap: 'inline',
117+
plugins: [
118+
NodeModulesPolyfillPlugin(),
119+
],
120+
})
152121
}

scripts/test.js

+54-141
Original file line numberDiff line numberDiff line change
@@ -1,153 +1,66 @@
1-
import {
2-
createProjectBuildProvider,
3-
serveDir,
4-
serveToolboxRunner,
5-
} from '@ph.fritsche/toolbox'
6-
import {NodeTestConductor} from '@ph.fritsche/toolbox/dist/conductor/NodeTestConductor.js'
7-
import {ChromeTestConductor} from '@ph.fritsche/toolbox/dist/conductor/ChromeTestConductor.js'
8-
import {ConsoleReporter} from '@ph.fritsche/toolbox/dist/reporter/ConsoleReporter.js'
9-
import {ReporterServer} from '@ph.fritsche/toolbox/dist/reporter/ReporterServer.js'
10-
import {TestRunStack} from '@ph.fritsche/toolbox/dist/reporter/TestRunStack.js'
11-
12-
import IstanbulLibCoverage from 'istanbul-lib-coverage'
131
import IstanbulLibReport from 'istanbul-lib-report'
142
import IstanbulLibSourceMaps from 'istanbul-lib-source-maps'
153
import IstanbulReports from 'istanbul-reports'
4+
import { serveDir, setupChromeConductor, setupNodeConductor, setupSourceModuleLoader, setupToolboxTester } from '@ph.fritsche/toolbox'
165

17-
const tsConfigFile = './tests/tsconfig.json'
18-
19-
const toolbox = await serveToolboxRunner()
206
const env = await serveDir('testenv')
217

22-
const {buildProvider, fileProvider, fileServer, onBuildDone} =
23-
createProjectBuildProvider(['src', 'tests'], {
24-
tsConfigFile,
25-
globals: {
26-
'@testing-library/dom': 'DomTestingLibrary',
27-
'@testing-library/react': 'ReactTestingLibrary',
28-
react: 'React',
29-
'react-dom': 'ReactDom',
30-
},
31-
})
32-
33-
for (const {builder} of buildProvider.builders) {
34-
builder.emitter.addListener('start', ({type, buildId, inputFiles}) =>
35-
console.log(builder.id, {type, buildId, inputFiles: inputFiles.size}),
36-
)
37-
builder.emitter.addListener(
38-
'complete',
39-
({type, buildId, inputFiles, outputFiles}) =>
40-
console.log(builder.id, {
41-
type,
42-
buildId,
43-
inputFiles: inputFiles.size,
44-
outputFiles: outputFiles.size,
45-
}),
46-
)
47-
builder.emitter.addListener('error', ({type, buildId, error}) =>
48-
console.log(builder.id, {type, buildId, error}),
49-
)
50-
builder.emitter.addListener('done', ({type, buildId}) =>
51-
console.log(builder.id, {type, buildId}),
52-
)
53-
}
54-
buildProvider
55-
.getBuilder('dependencies')
56-
.builder.emitter.addListener('start', ({inputFiles}) =>
57-
console.log('dependencies', inputFiles.keys()),
58-
)
59-
60-
const filter = f =>
61-
f.startsWith('tests') &&
62-
/(?<!\.json)\.js$/.test(f) &&
63-
!/\/_.+(?<!\.test)\.[jt]sx?$/.test(f)
64-
65-
const reporterServer = new ReporterServer()
66-
await reporterServer.registerFileServer(toolbox.server)
67-
await reporterServer.registerFileServer(env.server)
68-
await reporterServer.registerFileServer(fileServer)
69-
70-
const consoleReporter = new ConsoleReporter()
71-
consoleReporter.config.result = !!process.env.CI
72-
consoleReporter.connect(reporterServer)
73-
74-
const conductors = [
75-
new ChromeTestConductor(
76-
reporterServer,
77-
toolbox.url,
78-
'Chrome, DTL8, React18',
8+
const tester = await setupToolboxTester(
9+
[
10+
'src',
11+
'tests',
12+
],
13+
[
14+
setupNodeConductor('Node, DTL8, React18', [
15+
new URL('../testenv/node.js', import.meta.url),
16+
new URL('./libs/dom8/index.bundle.js', env.url),
17+
new URL('./libs/react18/index.bundle.js', env.url),
18+
]),
19+
setupNodeConductor('Node, DTL8, React17', [
20+
new URL('../testenv/node.js', import.meta.url),
21+
new URL('./libs/dom8/index.bundle.js', env.url),
22+
new URL('./libs/react17/index.bundle.js', env.url),
23+
]),
24+
setupChromeConductor('Chrome, DTL8, React18', [
25+
new URL('./browser.bundle.js', env.url),
26+
new URL('./libs/dom8/index.bundle.js', env.url),
27+
new URL('./libs/react18/index.bundle.js', env.url),
28+
])
29+
],
7930
[
80-
{server: env.url, paths: ['browser.bundle.js']},
81-
{
82-
server: env.url,
83-
paths: ['libs/dom8/index.bundle.js', 'libs/react18/index.bundle.js'],
84-
},
31+
await setupSourceModuleLoader({
32+
globals: {
33+
'@testing-library/dom': 'DomTestingLibrary',
34+
'@testing-library/react': 'ReactTestingLibrary',
35+
'react': 'React',
36+
'react-dom': 'ReactDom',
37+
},
38+
}),
8539
],
86-
),
87-
new NodeTestConductor(reporterServer, toolbox.url, 'Node, DTL8, React18', [
88-
{server: new URL(`file://${env.provider.origin}`), paths: ['node.js']},
8940
{
90-
server: env.url,
91-
paths: ['libs/dom8/index.bundle.js', 'libs/react18/index.bundle.js'],
92-
},
93-
]),
94-
]
95-
96-
if (process.env.CI) {
97-
conductors.push(
98-
new NodeTestConductor(reporterServer, toolbox.url, 'Node, DTL8, React17', [
99-
{server: new URL(`file://${env.provider.origin}`), paths: ['node.js']},
100-
{
101-
server: env.url,
102-
paths: ['libs/dom8/index.bundle.js', 'libs/react17/index.bundle.js'],
103-
},
104-
]),
105-
)
106-
}
107-
108-
onBuildDone(async () => {
109-
const files = {
110-
server: await fileServer.url,
111-
paths: Array.from(fileProvider.files.keys()).filter(filter),
112-
}
113-
const runs = conductors.map(c => c.createTestRun(files))
114-
const stack = new TestRunStack(runs.map(r => r.run))
115-
116-
for (const r of runs) {
117-
await r.exec()
118-
}
119-
120-
await stack.then()
121-
122-
const coverageMap = IstanbulLibCoverage.createCoverageMap()
123-
for (const run of stack.runs) {
124-
for (const coverage of run.coverage.values()) {
125-
coverageMap.merge(coverage)
41+
setExitCode: false,
12642
}
127-
}
128-
129-
const sourceStore = IstanbulLibSourceMaps.createSourceMapStore()
130-
const reportContext = IstanbulLibReport.createContext({
131-
coverageMap: await sourceStore.transformCoverage(coverageMap),
132-
dir: fileProvider.origin,
133-
sourceFinder: sourceStore.sourceFinder,
134-
defaultSummarizer: 'nested',
135-
watermarks: {
136-
branches: [80, 100],
137-
functions: [80, 100],
138-
lines: [80, 100],
139-
statements: [80, 100],
140-
},
141-
})
43+
)
44+
45+
tester.connectCoverageReporter(async map => {
46+
const sourceStore = IstanbulLibSourceMaps.createSourceMapStore()
47+
const reportContext = IstanbulLibReport.createContext({
48+
coverageMap: await sourceStore.transformCoverage(map),
49+
sourceFinder: sourceStore.sourceFinder,
50+
defaultSummarizer: 'nested',
51+
watermarks: {
52+
branches: [80, 100],
53+
functions: [80, 100],
54+
lines: [80, 100],
55+
statements: [80, 100],
56+
},
57+
})
58+
59+
IstanbulReports.create('text').execute(reportContext)
60+
})
14261

143-
IstanbulReports.create('text').execute(reportContext)
62+
await tester.start()
14463

145-
if (process.env.CI) {
146-
toolbox.server.close()
147-
env.server.close()
148-
fileServer.close()
149-
buildProvider.close()
150-
reporterServer.close()
151-
conductors.forEach(c => c.close())
152-
}
153-
})
64+
if (process.env.CI) {
65+
await env.server.close()
66+
}

0 commit comments

Comments
 (0)