@@ -4,19 +4,21 @@ import {
4
4
isMainModule ,
5
5
writeResponseToNodeResponse ,
6
6
} from '@angular/ssr/node' ;
7
- import { glob } from 'tinyglobby' ;
8
7
import express from 'express' ;
9
- import { readFile } from 'node:fs/promises' ;
10
8
import { dirname , isAbsolute , join , resolve } from 'node:path' ;
11
9
import { fileURLToPath } from 'node:url' ;
10
+ import {
11
+ FetchedLocalReports ,
12
+ fetchReportsFromDisk ,
13
+ } from '../runner/reporting/report-local-disk' ;
12
14
13
15
const app = express ( ) ;
14
16
const reportsLoaderPromise = getReportLoader ( ) ;
15
17
const options = getOptions ( ) ;
16
18
const serverDistFolder = dirname ( fileURLToPath ( import . meta. url ) ) ;
17
19
const browserDistFolder = resolve ( serverDistFolder , '../browser' ) ;
18
20
const angularApp = new AngularNodeAppEngine ( ) ;
19
- let localDataPromise : Promise < LocalData > | null = null ;
21
+ let localDataPromise : Promise < FetchedLocalReports > | null = null ;
20
22
21
23
// Endpoint for fetching all available report groups.
22
24
app . get ( '/api/reports' , async ( _ , res ) => {
@@ -26,8 +28,8 @@ app.get('/api/reports', async (_, res) => {
26
28
] ) ;
27
29
const results = remoteGroups . slice ( ) ;
28
30
29
- for ( const [ , group ] of localData ) {
30
- results . unshift ( group . overview ) ;
31
+ for ( const [ , data ] of localData ) {
32
+ results . unshift ( data . group ) ;
31
33
}
32
34
33
35
res . json ( results ) ;
@@ -77,14 +79,6 @@ interface ReportLoader {
77
79
getGroupsList : ( ) => Promise < { id : string } [ ] > ;
78
80
}
79
81
80
- type LocalData = Map <
81
- string ,
82
- {
83
- overview : { id : string } ;
84
- run : { group : string } ;
85
- }
86
- > ;
87
-
88
82
/** Gets the server options from the command line. */
89
83
function getOptions ( ) {
90
84
const defaultPort = 4200 ;
@@ -135,37 +129,9 @@ async function getReportLoader() {
135
129
async function resolveLocalData ( directory : string ) {
136
130
// Reuse the same promise so that concurrent requests get the same response.
137
131
if ( ! localDataPromise ) {
138
- let resolveFn : ( data : LocalData ) => void ;
132
+ let resolveFn : ( data : FetchedLocalReports ) => void ;
139
133
localDataPromise = new Promise ( ( resolve ) => ( resolveFn = resolve ) ) ;
140
-
141
- const data : LocalData = new Map ( ) ;
142
- const groupFiles = await glob ( '**/groups.json' , {
143
- cwd : directory ,
144
- absolute : true ,
145
- } ) ;
146
-
147
- await Promise . all (
148
- // Note: sort the groups so that the indexes stay consistent no matter how the files
149
- // appear on disk. It appears to be non-deterministic when using the async glob.
150
- groupFiles . sort ( ) . map ( async ( configPath , index ) => {
151
- const [ groupContent , runContent ] = await Promise . all ( [
152
- readFile ( configPath , 'utf8' ) ,
153
- readFile ( join ( dirname ( configPath ) , 'summary.json' ) , 'utf8' ) ,
154
- ] ) ;
155
-
156
- // Note: Local reports only have one group.
157
- const overview = ( JSON . parse ( groupContent ) as { id : string } [ ] ) [ 0 ] ;
158
- const run = JSON . parse ( runContent ) as { group : string } ;
159
-
160
- // Local runs should not be grouped by their group ID, but rather if they
161
- // were part of the same invocation. Add a unique suffix to the ID to
162
- // prevent further grouping.
163
- run . group = overview . id = `${ overview . id } -l${ index } ` ;
164
- data . set ( overview . id , { overview, run } ) ;
165
- } )
166
- ) ;
167
-
168
- resolveFn ! ( data ) ;
134
+ resolveFn ! ( await fetchReportsFromDisk ( directory ) ) ;
169
135
}
170
136
171
137
return localDataPromise ;
0 commit comments