yoda-seo-tips
Version:
SEO tips from Yoda
102 lines • 3.61 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const cheerio = require("cheerio");
const fs_1 = require("fs");
;
class HtmlValidator {
constructor(rules) {
this.rules = rules;
}
process(input, output) {
return __awaiter(this, void 0, void 0, function* () {
let inputStream = typeof input === 'string' ? fs_1.createReadStream(input)
: input && typeof input.on === 'function' ? input
: error('input: expecting filename or readable stream as input');
var writer = !output ? new ConsoleWriter
: typeof output === 'string' ? new FileWriter(output)
: typeof output.write === 'function' ? new StreamWriter(output)
: error('output: expecting filename or writable stream');
let data = yield consumeStream(inputStream);
let cheerioDom = cheerio.load(data);
for (let rule of this.rules) {
rule(cheerioDom, msg => {
writer.write(msg + '\n');
});
}
yield writer.close();
});
}
}
exports.HtmlValidator = HtmlValidator;
class StreamWriter {
constructor(stream) {
this.stream = stream;
}
write(msg) {
this.stream.write(msg);
}
close() {
return __awaiter(this, void 0, void 0, function* () { });
}
}
class ConsoleWriter {
write(msg) {
return __awaiter(this, void 0, void 0, function* () {
console.log(msg.replace(/\s*$/, ''));
});
}
close() {
return __awaiter(this, void 0, void 0, function* () { });
}
}
class FileWriter {
constructor(filename) {
this.filename = filename;
this.stream = fs_1.createWriteStream(this.filename, { flags: 'w' });
this.stream.on('error', err => { this.error = err; });
}
write(msg) {
if (this.error)
throw this.error;
this.stream.write(msg);
}
close() {
return __awaiter(this, void 0, void 0, function* () {
if (this.error)
throw this.error;
return new Promise((resolve, reject) => {
this.stream.on('error', reject);
this.stream.on('finish', () => {
this.stream.close();
this.stream.destroy();
resolve();
});
this.stream.end();
});
});
}
}
function consumeStream(stream) {
return new Promise((resolve, reject) => {
let data = '';
stream.on('data', chunk => {
data += chunk;
});
stream.on('end', () => {
resolve(data);
});
stream.on('error', reject);
});
}
function error(msg) {
throw new Error(msg);
}
//# sourceMappingURL=validator.js.map