@rnx-kit/cli 0.9.54 → 0.9.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +24 -3
  2. package/coverage/clover.xml +116 -73
  3. package/coverage/coverage-final.json +3 -2
  4. package/coverage/lcov-report/index.html +43 -28
  5. package/coverage/lcov-report/src/bundle/index.html +15 -15
  6. package/coverage/lcov-report/src/bundle/kit-config.ts.html +1 -1
  7. package/coverage/lcov-report/src/bundle/metro.ts.html +15 -78
  8. package/coverage/lcov-report/src/bundle/overrides.ts.html +1 -1
  9. package/coverage/lcov-report/src/index.html +21 -21
  10. package/coverage/lcov-report/src/metro-config.ts.html +112 -121
  11. package/coverage/lcov-report/src/typescript/index.html +111 -0
  12. package/coverage/lcov-report/src/typescript/project-cache.ts.html +626 -0
  13. package/coverage/lcov.info +208 -128
  14. package/lib/bundle/metro.d.ts +1 -2
  15. package/lib/bundle/metro.d.ts.map +1 -1
  16. package/lib/bundle/metro.js +5 -17
  17. package/lib/bundle/metro.js.map +1 -1
  18. package/lib/bundle.d.ts.map +1 -1
  19. package/lib/bundle.js +1 -3
  20. package/lib/bundle.js.map +1 -1
  21. package/lib/metro-config.d.ts +3 -3
  22. package/lib/metro-config.d.ts.map +1 -1
  23. package/lib/metro-config.js +58 -67
  24. package/lib/metro-config.js.map +1 -1
  25. package/lib/start.d.ts.map +1 -1
  26. package/lib/start.js +6 -17
  27. package/lib/start.js.map +1 -1
  28. package/lib/types.d.ts +3 -4
  29. package/lib/types.d.ts.map +1 -1
  30. package/lib/typescript/project-cache.d.ts +42 -0
  31. package/lib/typescript/project-cache.d.ts.map +1 -0
  32. package/lib/typescript/project-cache.js +114 -0
  33. package/lib/typescript/project-cache.js.map +1 -0
  34. package/package.json +2 -2
  35. package/src/bundle/metro.ts +6 -27
  36. package/src/bundle.ts +1 -4
  37. package/src/metro-config.ts +78 -81
  38. package/src/start.ts +7 -26
  39. package/src/types.ts +3 -5
  40. package/src/typescript/project-cache.ts +182 -0
  41. package/CHANGELOG.json +0 -3289
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">31.58% </span>
26
+ <span class="strong">50% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>18/57</span>
28
+ <span class='fraction'>27/54</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">43.33% </span>
33
+ <span class="strong">50% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>13/30</span>
35
+ <span class='fraction'>14/28</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">12.5% </span>
40
+ <span class="strong">20% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>1/8</span>
42
+ <span class='fraction'>2/10</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">32.14% </span>
47
+ <span class="strong">50.94% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>18/56</span>
49
+ <span class='fraction'>27/53</span>
50
50
  </div>
51
51
 
52
52
 
@@ -55,7 +55,7 @@
55
55
  Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
56
  </p>
57
57
  </div>
58
- <div class='status-line low'></div>
58
+ <div class='status-line medium'></div>
59
59
  <pre><table class="coverage">
60
60
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
61
  <a name='L2'></a><a href='#L2'>2</a>
@@ -222,10 +222,7 @@
222
222
  <a name='L163'></a><a href='#L163'>163</a>
223
223
  <a name='L164'></a><a href='#L164'>164</a>
224
224
  <a name='L165'></a><a href='#L165'>165</a>
225
- <a name='L166'></a><a href='#L166'>166</a>
226
- <a name='L167'></a><a href='#L167'>167</a>
227
- <a name='L168'></a><a href='#L168'>168</a>
228
- <a name='L169'></a><a href='#L169'>169</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
225
+ <a name='L166'></a><a href='#L166'>166</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
229
226
  <span class="cline-any cline-neutral">&nbsp;</span>
230
227
  <span class="cline-any cline-neutral">&nbsp;</span>
231
228
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -252,84 +249,77 @@
252
249
  <span class="cline-any cline-neutral">&nbsp;</span>
253
250
  <span class="cline-any cline-neutral">&nbsp;</span>
254
251
  <span class="cline-any cline-neutral">&nbsp;</span>
255
- <span class="cline-any cline-no">&nbsp;</span>
256
252
  <span class="cline-any cline-neutral">&nbsp;</span>
257
253
  <span class="cline-any cline-neutral">&nbsp;</span>
258
- <span class="cline-any cline-no">&nbsp;</span>
259
- <span class="cline-any cline-no">&nbsp;</span>
260
- <span class="cline-any cline-no">&nbsp;</span>
261
- <span class="cline-any cline-no">&nbsp;</span>
262
254
  <span class="cline-any cline-neutral">&nbsp;</span>
263
255
  <span class="cline-any cline-neutral">&nbsp;</span>
264
256
  <span class="cline-any cline-neutral">&nbsp;</span>
265
257
  <span class="cline-any cline-neutral">&nbsp;</span>
266
- <span class="cline-any cline-no">&nbsp;</span>
267
- <span class="cline-any cline-no">&nbsp;</span>
258
+ <span class="cline-any cline-yes">6x</span>
268
259
  <span class="cline-any cline-neutral">&nbsp;</span>
269
- <span class="cline-any cline-no">&nbsp;</span>
270
- <span class="cline-any cline-no">&nbsp;</span>
271
- <span class="cline-any cline-no">&nbsp;</span>
272
- <span class="cline-any cline-no">&nbsp;</span>
260
+ <span class="cline-any cline-yes">6x</span>
261
+ <span class="cline-any cline-yes">6x</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-yes">6x</span>
273
264
  <span class="cline-any cline-no">&nbsp;</span>
274
265
  <span class="cline-any cline-no">&nbsp;</span>
275
266
  <span class="cline-any cline-no">&nbsp;</span>
276
267
  <span class="cline-any cline-neutral">&nbsp;</span>
277
268
  <span class="cline-any cline-neutral">&nbsp;</span>
278
- <span class="cline-any cline-no">&nbsp;</span>
279
269
  <span class="cline-any cline-neutral">&nbsp;</span>
280
270
  <span class="cline-any cline-no">&nbsp;</span>
281
271
  <span class="cline-any cline-neutral">&nbsp;</span>
282
272
  <span class="cline-any cline-neutral">&nbsp;</span>
283
- <span class="cline-any cline-no">&nbsp;</span>
284
- <span class="cline-any cline-no">&nbsp;</span>
285
- <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
275
  <span class="cline-any cline-no">&nbsp;</span>
287
276
  <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-no">&nbsp;</span>
288
278
  <span class="cline-any cline-neutral">&nbsp;</span>
289
279
  <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-no">&nbsp;</span>
290
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-no">&nbsp;</span>
291
283
  <span class="cline-any cline-neutral">&nbsp;</span>
292
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-no">&nbsp;</span>
293
286
  <span class="cline-any cline-neutral">&nbsp;</span>
294
287
  <span class="cline-any cline-neutral">&nbsp;</span>
295
288
  <span class="cline-any cline-neutral">&nbsp;</span>
296
289
  <span class="cline-any cline-neutral">&nbsp;</span>
297
290
  <span class="cline-any cline-no">&nbsp;</span>
298
291
  <span class="cline-any cline-no">&nbsp;</span>
299
- <span class="cline-any cline-neutral">&nbsp;</span>
300
292
  <span class="cline-any cline-no">&nbsp;</span>
301
293
  <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-no">&nbsp;</span>
303
294
  <span class="cline-any cline-neutral">&nbsp;</span>
304
295
  <span class="cline-any cline-neutral">&nbsp;</span>
305
296
  <span class="cline-any cline-no">&nbsp;</span>
306
297
  <span class="cline-any cline-no">&nbsp;</span>
307
298
  <span class="cline-any cline-no">&nbsp;</span>
308
- <span class="cline-any cline-no">&nbsp;</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
299
  <span class="cline-any cline-neutral">&nbsp;</span>
311
300
  <span class="cline-any cline-neutral">&nbsp;</span>
312
301
  <span class="cline-any cline-no">&nbsp;</span>
313
- <span class="cline-any cline-neutral">&nbsp;</span>
314
- <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-no">&nbsp;</span>
303
+ <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-no">&nbsp;</span>
315
305
  <span class="cline-any cline-neutral">&nbsp;</span>
316
306
  <span class="cline-any cline-neutral">&nbsp;</span>
317
307
  <span class="cline-any cline-neutral">&nbsp;</span>
318
308
  <span class="cline-any cline-no">&nbsp;</span>
319
309
  <span class="cline-any cline-no">&nbsp;</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span>
321
310
  <span class="cline-any cline-no">&nbsp;</span>
322
311
  <span class="cline-any cline-no">&nbsp;</span>
323
312
  <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-no">&nbsp;</span>
325
- <span class="cline-any cline-no">&nbsp;</span>
326
313
  <span class="cline-any cline-neutral">&nbsp;</span>
327
314
  <span class="cline-any cline-neutral">&nbsp;</span>
328
315
  <span class="cline-any cline-no">&nbsp;</span>
329
316
  <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
330
318
  <span class="cline-any cline-neutral">&nbsp;</span>
331
319
  <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-yes">6x</span>
333
323
  <span class="cline-any cline-neutral">&nbsp;</span>
334
324
  <span class="cline-any cline-neutral">&nbsp;</span>
335
325
  <span class="cline-any cline-yes">2x</span>
@@ -390,8 +380,12 @@
390
380
  <span class="cline-any cline-neutral">&nbsp;</span>
391
381
  <span class="cline-any cline-neutral">&nbsp;</span>
392
382
  <span class="cline-any cline-yes">6x</span>
383
+ <span class="cline-any cline-yes">6x</span>
384
+ <span class="cline-any cline-no">&nbsp;</span>
385
+ <span class="cline-any cline-yes">6x</span>
386
+ <span class="cline-any cline-yes">6x</span>
393
387
  <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-yes">6x</span>
395
389
  <span class="cline-any cline-neutral">&nbsp;</span>
396
390
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
397
391
  CyclicDependencies,
@@ -406,98 +400,91 @@ import {
406
400
  esbuildTransformerConfig,
407
401
  MetroSerializer as MetroSerializerEsbuild,
408
402
  } from "@rnx-kit/metro-serializer-esbuild";
409
- import type { AllPlatforms } from "@rnx-kit/tools-react-native/platform";
410
- import { changeHostToUseReactNativeResolver } from "@rnx-kit/typescript-react-native-resolver";
411
- import {
412
- Project,
413
- readConfigFile,
414
- createDiagnosticWriter,
415
- } from "@rnx-kit/typescript-service";
403
+ import { AllPlatforms } from "@rnx-kit/tools-react-native/platform";
404
+ import { Project } from "@rnx-kit/typescript-service";
405
+ &nbsp;
406
+ import { createProjectCache } from "./typescript/project-cache";
407
+ import type { TypeScriptValidationOptions } from "./types";
408
+ &nbsp;
416
409
  import type { DeltaResult, Graph } from "metro";
417
410
  import type { InputConfigT, SerializerConfigT } from "metro-config";
418
- import type { LanguageServiceHost } from "typescript";
419
411
  &nbsp;
420
- import type { TSProjectInfo } from "./types";
421
- &nbsp;
422
- function <span class="fstat-no" title="function not covered" >createSerializerHook(</span>{ service, configFileName }: TSProjectInfo) {
423
- const tsprojectByPlatform: Map&lt;AllPlatforms, Project&gt; = <span class="cstat-no" title="statement not covered" >new Map();</span>
412
+ /**
413
+ * Create a hook function to be registered with Metro during serialization.
414
+ * Each serialization pass runs the hook which type-checks each added/updated
415
+ * source file.
416
+ *
417
+ * Source file in node_modules (external packages) are ignored.
418
+ *
419
+ * @param options TypeScript validation options
420
+ * @returns Hook function
421
+ */
422
+ function createSerializerHook(options: TypeScriptValidationOptions) {
423
+ const projectCache = createProjectCache(options.print);
424
424
  &nbsp;
425
- function <span class="fstat-no" title="function not covered" >resetProject(</span>platform: AllPlatforms): void {
426
- const tsproject = <span class="cstat-no" title="statement not covered" >tsprojectByPlatform.get(platform);</span>
427
- <span class="cstat-no" title="statement not covered" > if (tsproject) {</span>
428
- <span class="cstat-no" title="statement not covered" > tsproject.dispose();</span>
429
- <span class="cstat-no" title="statement not covered" > tsprojectByPlatform.delete(platform);</span>
430
- }
431
- }
425
+ const patternNodeModules = /[/\\]node_modules[/\\]/;
426
+ const excludeNodeModules = <span class="fstat-no" title="function not covered" >(p</span>: string) =&gt; <span class="cstat-no" title="statement not covered" >!patternNodeModules.test(p);</span>
432
427
  &nbsp;
433
- function <span class="fstat-no" title="function not covered" >getProject(</span>platform: AllPlatforms): Project {
434
- let tsproject = <span class="cstat-no" title="statement not covered" >tsprojectByPlatform.get(platform);</span>
435
- <span class="cstat-no" title="statement not covered" > if (!tsproject) {</span>
436
- // start with an empty project, ignoring the file graph provided by tsconfig.json
437
- const cmdLine = <span class="cstat-no" title="statement not covered" >readConfigFile(configFileName);</span>
438
- <span class="cstat-no" title="statement not covered" > if (!cmdLine) {</span>
439
- <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to load '${configFileName}'`);</span>
440
- } else <span class="cstat-no" title="statement not covered" >if (cmdLine.errors.length &gt; 0) {</span>
441
- const writer = <span class="cstat-no" title="statement not covered" >createDiagnosticWriter();</span>
442
- <span class="cstat-no" title="statement not covered" > cmdLine.errors.forEach(<span class="fstat-no" title="function not covered" >(e</span>) =&gt; <span class="cstat-no" title="statement not covered" >writer.print(e))</span>;</span>
443
- <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to load '${configFileName}'`);</span>
428
+ const hook = <span class="fstat-no" title="function not covered" >(g</span>raph: Graph, delta: DeltaResult): void =&gt; {
429
+ const platform = <span class="cstat-no" title="statement not covered" >graph.transformOptions.platform as AllPlatforms;</span>
430
+ <span class="cstat-no" title="statement not covered" > if (platform) {</span>
431
+ <span class="cstat-no" title="statement not covered" > if (delta.reset) {</span>
432
+ // Metro is signaling that all cached data for this Graph should be
433
+ // thrown out. Each Graph is scoped to one platform, so discard all
434
+ // of that platform's projects.
435
+ <span class="cstat-no" title="statement not covered" > projectCache.clearPlatform(platform);</span>
444
436
  }
445
437
  &nbsp;
446
- const enhanceLanguageServiceHost = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(h</span>ost: LanguageServiceHost): void =&gt; {</span>
447
- const platformExtensionNames =
448
- <span class="cstat-no" title="statement not covered" > platform === "windows" || platform === "win32"</span>
449
- ? ["win", "native"]
450
- : ["native"];
451
- const disableReactNativePackageSubstitution = <span class="cstat-no" title="statement not covered" >true;</span>
452
- const traceReactNativeModuleResolutionErrors = <span class="cstat-no" title="statement not covered" >false;</span>
453
- const traceResolutionLog = <span class="cstat-no" title="statement not covered" >undefined;</span>
454
- <span class="cstat-no" title="statement not covered" > changeHostToUseReactNativeResolver({</span>
455
- host,
456
- options: cmdLine.options,
457
- platform,
458
- platformExtensionNames,
459
- disableReactNativePackageSubstitution,
460
- traceReactNativeModuleResolutionErrors,
461
- traceResolutionLog,
462
- });
463
- };
438
+ // Filter adds, updates, and deletes coming from Metro. Do not look at
439
+ // anything in an external package (e.g. under node_modules).
440
+ const adds = <span class="cstat-no" title="statement not covered" >Array.from(</span>
441
+ delta.added.values(),
442
+ <span class="fstat-no" title="function not covered" > (m</span>odule) =&gt; <span class="cstat-no" title="statement not covered" >module.path</span>
443
+ ).filter(excludeNodeModules);
464
444
  &nbsp;
465
- <span class="cstat-no" title="statement not covered" > tsproject = service.openProject(cmdLine, enhanceLanguageServiceHost);</span>
466
- <span class="cstat-no" title="statement not covered" > tsproject.removeAllFiles();</span>
445
+ const updates = <span class="cstat-no" title="statement not covered" >Array.from(</span>
446
+ delta.modified.values(),
447
+ <span class="fstat-no" title="function not covered" > (m</span>odule) =&gt; <span class="cstat-no" title="statement not covered" >module.path</span>
448
+ ).filter(excludeNodeModules);
467
449
  &nbsp;
468
- <span class="cstat-no" title="statement not covered" > tsprojectByPlatform.set(platform, tsproject);</span>
469
- }
470
- <span class="cstat-no" title="statement not covered" > return tsproject;</span>
471
- }
450
+ const deletes = <span class="cstat-no" title="statement not covered" >Array.from(delta.deleted.values()).filter(</span>
451
+ excludeNodeModules
452
+ );
472
453
  &nbsp;
473
- const hook = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(g</span>raph: Graph, delta: DeltaResult): void =&gt; {</span>
474
- const platform = <span class="cstat-no" title="statement not covered" >graph.transformOptions.platform as AllPlatforms;</span>
475
- <span class="cstat-no" title="statement not covered" > if (platform) {</span>
476
- <span class="cstat-no" title="statement not covered" > if (delta.reset) {</span>
477
- <span class="cstat-no" title="statement not covered" > resetProject(platform);</span>
478
- }
454
+ // Map each file to a TypeScript project, and apply its delta operation.
455
+ const tsprojectsToValidate: Set&lt;Project&gt; = <span class="cstat-no" title="statement not covered" >new Set();</span>
456
+ <span class="cstat-no" title="statement not covered" > adds.concat(updates).forEach(<span class="fstat-no" title="function not covered" >(s</span>ourceFile) =&gt; {</span>
457
+ const { tsproject, tssourceFiles } = <span class="cstat-no" title="statement not covered" >projectCache.getProjectInfo(</span>
458
+ sourceFile,
459
+ platform
460
+ );
461
+ <span class="cstat-no" title="statement not covered" > if (tssourceFiles.has(sourceFile)) {</span>
462
+ <span class="cstat-no" title="statement not covered" > tsproject.setFile(sourceFile);</span>
463
+ <span class="cstat-no" title="statement not covered" > tsprojectsToValidate.add(tsproject);</span>
464
+ }
465
+ });
466
+ <span class="cstat-no" title="statement not covered" > deletes.forEach(<span class="fstat-no" title="function not covered" >(s</span>ourceFile) =&gt; {</span>
467
+ const { tsproject } = <span class="cstat-no" title="statement not covered" >projectCache.getProjectInfo(sourceFile, platform);</span>
468
+ <span class="cstat-no" title="statement not covered" > tsproject.removeFile(sourceFile);</span>
469
+ <span class="cstat-no" title="statement not covered" > tsprojectsToValidate.add(tsproject);</span>
470
+ });
479
471
  &nbsp;
480
- const tsproject = <span class="cstat-no" title="statement not covered" >getProject(platform);</span>
472
+ // Validate all projects which changed, printing all type errors.
473
+ let isValid = <span class="cstat-no" title="statement not covered" >true;</span>
474
+ <span class="cstat-no" title="statement not covered" > tsprojectsToValidate.forEach(<span class="fstat-no" title="function not covered" >(p</span>) =&gt; {</span>
475
+ <span class="cstat-no" title="statement not covered" > if (!p.validate()) {</span>
476
+ <span class="cstat-no" title="statement not covered" > isValid = false;</span>
477
+ }
478
+ });
481
479
  &nbsp;
482
- // Apply delta change changes to the TypeScript project. New files are
483
- // added to the project file list. Updated files have their cached
484
- // snapshot cleared, causing the file to be reloaded. Deleted files
485
- // are removed from the project file list.
486
- <span class="cstat-no" title="statement not covered" > for (const module of delta.added.values()) {</span>
487
- <span class="cstat-no" title="statement not covered" > tsproject.setFile(module.path);</span>
480
+ <span class="cstat-no" title="statement not covered" > if (!isValid &amp;&amp; options.throwOnError) {</span>
481
+ // Type-checking failed. Fail the Metro operation (bundling or serving).
482
+ <span class="cstat-no" title="statement not covered" > throw new Error("Type validation failed");</span>
488
483
  }
489
- <span class="cstat-no" title="statement not covered" > for (const module of delta.modified.values()) {</span>
490
- <span class="cstat-no" title="statement not covered" > tsproject.setFile(module.path);</span>
491
- }
492
- <span class="cstat-no" title="statement not covered" > for (const module of delta.deleted.values()) {</span>
493
- <span class="cstat-no" title="statement not covered" > tsproject.removeFile(module);</span>
494
- }
495
- &nbsp;
496
- <span class="cstat-no" title="statement not covered" > tsproject.validate();</span>
497
484
  }
498
485
  };
499
486
  &nbsp;
500
- <span class="cstat-no" title="statement not covered" > return hook;</span>
487
+ return hook;
501
488
  }
502
489
  &nbsp;
503
490
  const emptySerializerHook = <span class="fstat-no" title="function not covered" >(_</span>graph: Graph, _delta: DeltaResult): void =&gt; {
@@ -510,14 +497,14 @@ const emptySerializerHook = <span class="fstat-no" title="function not covered"
510
497
  * @param metroConfigReadonly Metro configuration
511
498
  * @param detectCyclicDependencies When true, cyclic dependency checking is enabled with a default set of options. Otherwise the object allows for fine-grained control over the detection process.
512
499
  * @param detectDuplicateDependencies When true, duplicate dependency checking is enabled with a default set of options. Otherwise, the object allows for fine-grained control over the detection process.
513
- * @param tsprojectInfo When set, TypeScript validation is enabled during bundling and serving.
500
+ * @param typescriptValidation When true, TypeScript type-checking is enabled with a default set of options. Otherwise, the object allows for fine-grained control over the type-checking process.
514
501
  * @param experimental_treeShake When true, experimental tree-shaking is enabled.
515
502
  */
516
503
  export function customizeMetroConfig(
517
504
  metroConfigReadonly: InputConfigT,
518
505
  detectCyclicDependencies: boolean | CyclicDetectorOptions,
519
506
  detectDuplicateDependencies: boolean | DuplicateDetectorOptions,
520
- tsprojectInfo: TSProjectInfo | undefined,
507
+ typescriptValidation: boolean | TypeScriptValidationOptions,
521
508
  experimental_treeShake: boolean
522
509
  ): void {
523
510
  // We will be making changes to the Metro configuration. Coerce from a
@@ -557,9 +544,13 @@ export function customizeMetroConfig(
557
544
  delete metroConfig.serializer.customSerializer;
558
545
  }
559
546
  &nbsp;
560
- metroConfig.serializer.experimentalSerializerHook = tsprojectInfo
561
- ? <span class="branch-0 cbranch-no" title="branch not covered" >createSerializerHook(tsprojectInfo)</span>
562
- : emptySerializerHook;
547
+ let hook = emptySerializerHook;
548
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (typeof typescriptValidation === "object") {
549
+ <span class="cstat-no" title="statement not covered" > hook = createSerializerHook(typescriptValidation);</span>
550
+ } else <span class="missing-if-branch" title="else path not taken" >E</span>if (typescriptValidation !== false) {
551
+ hook = createSerializerHook({});
552
+ }
553
+ metroConfig.serializer.experimentalSerializerHook = hook;
563
554
  }
564
555
  &nbsp;</pre></td></tr></table></pre>
565
556
 
@@ -568,7 +559,7 @@ export function customizeMetroConfig(
568
559
  <div class='footer quiet pad2 space-top1 center small'>
569
560
  Code coverage generated by
570
561
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
571
- at Tue Nov 30 2021 17:20:38 GMT+0000 (Coordinated Universal Time)
562
+ at Tue Dec 21 2021 01:09:41 GMT+0000 (Coordinated Universal Time)
572
563
  </div>
573
564
  </div>
574
565
  <script src="../prettify.js"></script>
@@ -0,0 +1,111 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/typescript</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> src/typescript</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">8.7% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>4/46</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/14</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">10% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>1/10</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">9.09% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>4/44</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ </div>
58
+ <div class='status-line low'></div>
59
+ <div class="pad1">
60
+ <table class="coverage-summary">
61
+ <thead>
62
+ <tr>
63
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
64
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
65
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
66
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
67
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
68
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
69
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
70
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
71
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
72
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ </tr>
74
+ </thead>
75
+ <tbody><tr>
76
+ <td class="file low" data-value="project-cache.ts"><a href="project-cache.ts.html">project-cache.ts</a></td>
77
+ <td data-value="8.7" class="pic low">
78
+ <div class="chart"><div class="cover-fill" style="width: 8%"></div><div class="cover-empty" style="width: 92%"></div></div>
79
+ </td>
80
+ <td data-value="8.7" class="pct low">8.7%</td>
81
+ <td data-value="46" class="abs low">4/46</td>
82
+ <td data-value="0" class="pct low">0%</td>
83
+ <td data-value="14" class="abs low">0/14</td>
84
+ <td data-value="10" class="pct low">10%</td>
85
+ <td data-value="10" class="abs low">1/10</td>
86
+ <td data-value="9.09" class="pct low">9.09%</td>
87
+ <td data-value="44" class="abs low">4/44</td>
88
+ </tr>
89
+
90
+ </tbody>
91
+ </table>
92
+ </div>
93
+ <div class='push'></div><!-- for sticky footer -->
94
+ </div><!-- /wrapper -->
95
+ <div class='footer quiet pad2 space-top1 center small'>
96
+ Code coverage generated by
97
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
98
+ at Tue Dec 21 2021 01:09:41 GMT+0000 (Coordinated Universal Time)
99
+ </div>
100
+ </div>
101
+ <script src="../../prettify.js"></script>
102
+ <script>
103
+ window.onload = function () {
104
+ prettyPrint();
105
+ };
106
+ </script>
107
+ <script src="../../sorter.js"></script>
108
+ <script src="../../block-navigation.js"></script>
109
+ </body>
110
+ </html>
111
+