// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:async';

import '../io.dart';
import '../path.dart';
import '../validator.dart';

/// Validates that a package doesn't contain compiled Dartdoc output.
class CompiledDartdocValidator extends Validator {
  @override
  Future validate() {
    return Future.sync(() {
      for (var entry in files) {
        if (p.basename(entry) != 'nav.json') continue;
        final dir = p.dirname(entry);

        // Look for tell-tale Dartdoc output files all in the same directory.
        final files = [
          entry,
          p.join(dir, 'index.html'),
          p.join(dir, 'styles.css'),
          p.join(dir, 'dart-logo-small.png'),
          p.join(dir, 'client-live-nav.js'),
        ];

        if (files.every(fileExists)) {
          warnings.add(
            'Avoid putting generated documentation in '
            '${p.relative(dir)}.\n'
            'Generated documentation bloats the package with redundant '
            'data.',
          );
        }
      }
    });
  }
}
