96 lines
2.8 KiB
Perl
Executable File
96 lines
2.8 KiB
Perl
Executable File
#!/usr/bin/env perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Getopt::Long;
|
|
use File::Copy qw/move/;
|
|
use File::Temp qw/tempfile/;
|
|
use File::Spec;
|
|
|
|
sub removeConsoleAssertsInFile($$);
|
|
sub removeConsoleAssertsInDirectory($);
|
|
|
|
our $inputDirectory;
|
|
our $inputScriptFilename;
|
|
our $outputScriptFilename;
|
|
|
|
GetOptions('input-directory=s' => \$inputDirectory,
|
|
'input-script=s' => \$inputScriptFilename,
|
|
'output-script=s' => \$outputScriptFilename);
|
|
|
|
if (defined $inputScriptFilename and defined $outputScriptFilename) {
|
|
removeConsoleAssertsInFile($inputScriptFilename, $outputScriptFilename);
|
|
exit;
|
|
}
|
|
|
|
if (defined $inputDirectory) {
|
|
removeConsoleAssertsInDirectory($inputDirectory);
|
|
exit;
|
|
}
|
|
|
|
print "Usage: $0 --input-script <path> --output-script <path>\n";
|
|
print "Usage: $0 --input-directory <path>\n";
|
|
exit;
|
|
|
|
sub removeConsoleAssertsInFile($$)
|
|
{
|
|
my $inputScriptFilename = shift;
|
|
my $outputScriptFilename = shift;
|
|
|
|
open IN, $inputScriptFilename or die "Couldn't open $inputScriptFilename: $!";
|
|
my ($out, $tempFilename) = tempfile(UNLINK => 0) or die;
|
|
|
|
my $previousLine = "";
|
|
while (<IN>) {
|
|
# Warn about console.assert in control flow statement without braces. Can change logic when stripped.
|
|
if (/console\.assert/) {
|
|
if ($previousLine =~ /^\s*(for|if|else|while|do)\b/ && $previousLine !~ /\{\s*$/) {
|
|
print "WARNING: console.assert inside control flow statement without braces on line: $.: $_";
|
|
}
|
|
}
|
|
|
|
s/^\s*console\.assert\(.*\);\s*//g;
|
|
print $out $_;
|
|
$previousLine = $_ if $_ !~ /^\s*$/;
|
|
|
|
# If console.assert is still on the line, either we missed a semicolon or it is multi-line. These did not get stripped.
|
|
if ($_ =~ /\s*console\.assert\(/) {
|
|
# Allow "console.assert()" to be used as part of a string.
|
|
next if /^.*?["'`].*?console\.assert/;
|
|
|
|
# Allow "console.assert()" to be used as part of a comment.
|
|
next if /^.*?(\/\/|\/\*).*?console\.assert/;
|
|
|
|
if ($_ =~ /\)\s*$/) {
|
|
print "WARNING: console.assert missing trailing semicolon on line $.: $_" ;
|
|
} else {
|
|
print "WARNING: Multi-line console.assert on line $.: $_" ;
|
|
}
|
|
}
|
|
}
|
|
|
|
close $out;
|
|
close IN;
|
|
|
|
move $tempFilename, $outputScriptFilename or die "$!";
|
|
}
|
|
|
|
sub removeConsoleAssertsInDirectory($)
|
|
{
|
|
my $inputDirectory = shift;
|
|
|
|
opendir(DIR, $inputDirectory) || die "$!";
|
|
my @files = grep { !/^\.{1,2}$/ } readdir (DIR);
|
|
closedir(DIR);
|
|
|
|
foreach my $file (@files) {
|
|
next if $file eq '.' or $file eq '..';
|
|
my $path = File::Spec->catdir($inputDirectory, $file);
|
|
if (-d $path) {
|
|
removeConsoleAssertsInDirectory($path);
|
|
} elsif ($file =~ /\.js$/) {
|
|
removeConsoleAssertsInFile($path, $path);
|
|
}
|
|
}
|
|
}
|