@@ -23,6 +23,7 @@ var globby = require("globby");
23
23
// Ugh... replacement needed to kill processes on any OS
24
24
// - because childProcess.kill does not work properly on windows
25
25
var treeKill = require ( "tree-kill" ) ;
26
+ var blc = require ( "broken-link-checker" ) ;
26
27
27
28
// TODO:
28
29
// 1. Think about using runSequence
@@ -424,6 +425,13 @@ gulp.task('test-api-builder', function (cb) {
424
425
execCommands ( [ 'npm run test-api-builder' ] , { } , cb ) ;
425
426
} ) ;
426
427
428
+ // Usage:
429
+ // angular.io: gulp link-checker
430
+ // local site: gulp link-checker --url=http://localhost:3000
431
+ gulp . task ( 'link-checker' , function ( done ) {
432
+ return linkChecker ( ) ;
433
+ } ) ;
434
+
427
435
428
436
// Internal tasks
429
437
gulp . task ( 'set-prod-env' , function ( ) {
@@ -514,6 +522,80 @@ function harpCompile() {
514
522
return deferred . promise ;
515
523
}
516
524
525
+ function linkChecker ( options ) {
526
+ var deferred = Q . defer ( ) ;
527
+ var options = options || { } ;
528
+
529
+ var blcOptions = options . blcOptions || { } ;
530
+ var customData = options . customData || { } ;
531
+
532
+ var excludeBad ; // don't bother reporting bad links matching this RegExp
533
+ if ( argv . excludeBad ) {
534
+ excludeBad = new RegExp ( argv . excludeBad ) ;
535
+ } else {
536
+ excludeBad = options . excludeBad === undefined ? / d o c s \/ d a r t \/ l a t e s t \/ a p i / : '' ;
537
+ }
538
+
539
+ var previousPage ;
540
+ var siteUrl = argv . url || options . url || 'https://angular.io/' ;
541
+
542
+ // See https://github.com/stevenvachon/broken-link-checker#blcsitecheckeroptions-handlers
543
+ var handlers = {
544
+ robots : function ( robots , customData ) { } ,
545
+ html : function ( tree , robots , response , pageUrl , customData ) {
546
+ //gutil.log('Scanning ' + pageUrl);docs/ts/latest/api/core/
547
+ } ,
548
+ junk : function ( result , customData ) { } ,
549
+
550
+ // Analyze links
551
+ link : function ( result , customData ) {
552
+ if ( ! result . broken ) { return ; }
553
+ if ( excludeBad && excludeBad . test ( result . url . resolved ) ) { return ; }
554
+
555
+ var currentPage = result . base . resolved
556
+ if ( previousPage !== currentPage ) {
557
+ previousPage = currentPage ;
558
+ fs . appendFileSync ( outputFile , '\n' + currentPage ) ;
559
+ gutil . log ( 'broken: ' + currentPage ) ;
560
+ }
561
+ var msg = '\n [' + result . html . location . line + ', ' + result . brokenReason + '] ' + result . url . resolved ;
562
+ fs . appendFileSync ( outputFile , msg ) ;
563
+ //gutil.log(msg);
564
+ //gutil.log(result);
565
+ } ,
566
+
567
+ page : function ( error , pageUrl , customData ) { } ,
568
+ site : function ( error , siteUrl , customData ) { } ,
569
+
570
+ end : function ( ) {
571
+ var stopTime = new Date ( ) . getTime ( ) ;
572
+ var elapsed = 'Elapsed link-checking time: ' + ( ( stopTime - startTime ) / 1000 ) + ' seconds' ;
573
+ gutil . log ( elapsed ) ;
574
+ fs . appendFileSync ( outputFile , '\n' + elapsed ) ;
575
+ gutil . log ( 'Output in file: ' + outputFile ) ;
576
+ deferred . resolve ( true ) ;
577
+ }
578
+ } ;
579
+
580
+ // create an output file with header.
581
+ var outputFile = path . join ( process . cwd ( ) , 'link-checker-results.txt' ) ;
582
+ var header = 'Link checker results for: ' + siteUrl +
583
+ '\nStarted: ' + ( new Date ( ) ) . toLocaleString ( ) +
584
+ '\nSkipping bad links matching regex: ' + excludeBad . toString ( ) + '\n\n' ;
585
+ gutil . log ( header ) ;
586
+ fs . writeFileSync ( outputFile , header ) ;
587
+
588
+ var siteChecker = new blc . SiteChecker ( blcOptions , handlers ) ;
589
+ var startTime = new Date ( ) . getTime ( ) ;
590
+
591
+ try {
592
+ siteChecker . enqueue ( siteUrl , customData ) ;
593
+ } catch ( err ) {
594
+ deferred . reject ( err ) ;
595
+ }
596
+ return deferred . promise ;
597
+ }
598
+
517
599
// harp has issues with node_modules under the public dir
518
600
// but we need them there for example testing and development
519
601
// this method allows the node modules folder under '_examples'
0 commit comments