Skip to content
This repository was archived by the owner on Jan 27, 2019. It is now read-only.

Feature: ES6 #43

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions bin/getcss
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
#!/usr/bin/env node

var fs = require('fs');
var program = require('commander');
var normalizeUrl = require('normalize-url');
var getCss = require('..');
const program = require('commander');
const normalizeUrl = require('normalize-url');
const getCss = require('..');

program
.version('0.0.1')
.command('* <url>')
.action(function(url) {
if(url) {
.action((url) => {
if (url) {
url = normalizeUrl(url, { stripWWW: false });
getCss(url, { verbose: true }).then(function(css) {
getCss(url, { verbose: true }).then((css) => {
console.log(css.css);
});
}
Expand Down
104 changes: 56 additions & 48 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
'use strict';

var q = require('q');
var isCss = require('is-css');
var isPresent = require('is-present');
var isBlank = require('is-blank');
var isUrl = require('is-url-superb');
var request = require('request');
var cheerio = require('cheerio');
var normalizeUrl = require('normalize-url');
var stripHtmlComments = require('strip-html-comments');
var resolveCssImportUrls = require('resolve-css-import-urls');
var ua = require('ua-string');

var getLinkContents = require('./utils/get-link-contents');
var createLink = require('./utils/create-link');

module.exports = function(url, options){
var deferred = q.defer();
var options = options || {};
const q = require('q');
const isCss = require('is-css');
const isPresent = require('is-present');
const isBlank = require('is-blank');
const isUrl = require('is-url-superb');
const request = require('request');
const cheerio = require('cheerio');
const normalizeUrl = require('normalize-url');
const stripHtmlComments = require('strip-html-comments');
const resolveCssImportUrls = require('resolve-css-import-urls');
const ua = require('ua-string');

const getLinkContents = require('./utils/get-link-contents');
const createLink = require('./utils/create-link');

module.exports = function (url, options) {
const deferred = q.defer();

options = options || {};

options.headers = options.headers || {};
options.headers['User-Agent'] = options.headers['User-Agent'] || ua;
options.timeout = options.timeout || 5000;
options.gzip = true;

if (typeof url !== 'string' || isBlank(url) || !isUrl(url)) {
throw new TypeError('get-css expected a url as a string')
throw new TypeError('get-css expected a url as a string');
}

url = normalizeUrl(url, { stripWWW: false });
Expand All @@ -34,15 +34,15 @@ module.exports = function(url, options){
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
}

var status = {
const status = {
parsed: 0,
total: 0
total: 0,
};

var result = {
const result = {
links: [],
styles: [],
css: ''
css: '',
};

function handleResolve() {
Expand All @@ -52,19 +52,19 @@ module.exports = function(url, options){
}

function parseHtml(html) {
var $ = cheerio.load(html);
const $ = cheerio.load(html);
result.pageTitle = $('head > title').text();

$('[rel=stylesheet]').each(function() {
var link = $(this).attr('href');
if(isPresent(link)) {
result.links.push(createLink(link, url));
}else{
result.styles.push(stripHtmlComments($(this).text()));
}
$('[rel=stylesheet]').each(function () {
const link = $(this).attr('href');
if (isPresent(link)) {
result.links.push(createLink(link, url));
} else {
result.styles.push(stripHtmlComments($(this).text()));
}
});

$('style').each(function() {
$('style').each(function () {
result.styles.push(stripHtmlComments($(this).text()));
});

Expand All @@ -73,19 +73,19 @@ module.exports = function(url, options){
deferred.resolve(false);
}

result.links.forEach(function(link) {
result.links.forEach((link) => {
getLinkContents(link.url, options)
.then(function(css) {
.then((css) => {
handleCssFromLink(link, css);
})
.catch(function(error) {
.catch((error) => {
link.error = error;
status.parsed++;
handleResolve();
});
});

result.styles.forEach(function(css) {
result.styles.forEach((css) => {
result.css += css;
status.parsed++;
handleResolve();
Expand All @@ -107,37 +107,45 @@ module.exports = function(url, options){
status.total += link.imports.length;
result.css += css;

link.imports.forEach(function(importUrl) {
var importLink = createLink(importUrl, importUrl);
link.imports.forEach((importUrl) => {
const importLink = createLink(importUrl, importUrl);
result.links.push(importLink);

getLinkContents(importLink.url, options)
.then(function(css) {
.then((css) => {
handleCssFromLink(importLink, css);
})
.catch(function(error) {
.catch((error) => {
link.error = error;
status.parsed++;
handleResolve();
});
});
}

request(options, function(error, response, body) {
request(options, (error, response, body) => {
if (error) {
if (options.verbose) console.log('Error from ' + url + ' ' + error);
if (options.verbose) {
console.log(`Error from ${url} ${error}`);
}

deferred.reject(error);

return;
}

if (response && response.statusCode != 200) {
if (options.verbose) console.log('Received a ' + response.statusCode + ' from: ' + url);
deferred.reject({ url: url, statusCode: response.code });
if (response && response.statusCode !== 200) {
if (options.verbose) {
console.log(`Received a ${response.statusCode} from: ${url}`);
}

deferred.reject({ url, statusCode: response.code });

return;
}

if (isCss(url)) {
var link = createLink(url, url);
const link = createLink(url, url);
result.links.push(link);
handleCssFromLink(link, body);
} else {
Expand Down
133 changes: 97 additions & 36 deletions test/results.json

Large diffs are not rendered by default.

11 changes: 5 additions & 6 deletions test/utils/create-link-test.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
var assert = require('assert');
var createLink = require('../../utils/create-link');
const assert = require('assert');
const createLink = require('../../utils/create-link');

describe('create-link', function() {

it('should create the correct link object', function() {
describe('create-link', () => {
it('should create the correct link object', () => {
assert.deepEqual(
createLink('../bar.css', 'http://foo.com/css/my-css.css'),
{ link: '../bar.css', url: 'http://foo.com/bar.css', css: '' });
});

it('should correctly resolve full url links', function() {
it('should correctly resolve full url links', () => {
assert.deepEqual(
createLink('http://foo.com/bar.css', 'http://foo.com/css/my-css.css'),
{ link: 'http://foo.com/bar.css', url: 'http://foo.com/bar.css', css: '' });
Expand Down
21 changes: 10 additions & 11 deletions test/utils/resolve-url-test.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
var assert = require('assert');
var resolveUrl = require('../../utils/resolve-url');
const assert = require('assert');
const resolveUrl = require('../../utils/resolve-url');

describe('resolve-url', function() {

it('should correctly resolve a .. relative link', function() {
describe('resolve-url', () => {
it('should correctly resolve a .. relative link', () => {
assert.equal(resolveUrl('http://foo.com/some/path', '../bar.css'), 'http://foo.com/some/bar.css');
});

it('should correctly resolve a .. relative link when the url has a trailing /', function() {
it('should correctly resolve a .. relative link when the url has a trailing /', () => {
assert.equal(resolveUrl('http://foo.com/some/path/', '../bar.css'), 'http://foo.com/some/bar.css');
});

it('should correctly resolve a relative link', function() {
it('should correctly resolve a relative link', () => {
assert.equal(resolveUrl('http://foo.com/some/path', 'bar.css'), 'http://foo.com/some/path/bar.css');
});

it('should correctly return a full link', function() {
it('should correctly return a full link', () => {
assert.equal(
resolveUrl('http://foo.com', 'http://foo.com/some/path/bar.css'),
'http://foo.com/some/path/bar.css');
});

it('should correctly resolve an absolute link', function() {
it('should correctly resolve an absolute link', () => {
assert.equal(resolveUrl('http://foo.com/some/path', '/bar.css'), 'http://foo.com/bar.css');
});

it('should correctly resolve a relative url from an html file', function() {
it('should correctly resolve a relative url from an html file', () => {
assert.equal(resolveUrl('http://foo.bar/awesome/baz.html', 'baz.css'), 'http://foo.bar/awesome/baz.css');
});

it('should correctly resolve an absolute url from an html file', function() {
it('should correctly resolve an absolute url from an html file', () => {
assert.equal(resolveUrl('http://foo.bar/awesome/baz.html', '/baz.css'), 'http://foo.bar/baz.css');
});
});
6 changes: 3 additions & 3 deletions utils/create-link.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
var resolveUrl = require('./resolve-url');
const resolveUrl = require('./resolve-url');

module.exports = function createLink(link, url) {
return {
link: link,
link,
url: resolveUrl(url, link),
css: ''
css: '',
};
};
8 changes: 4 additions & 4 deletions utils/get-link-contents.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
var q = require('q');
var request = require('request');
const q = require('q');
const request = require('request');

module.exports = function getLinkContents(linkUrl, options) {
var d = q.defer();
const d = q.defer();

request({ url: linkUrl, timeout: options.timeout, gzip: true }, function(error, response, body) {
request({ url: linkUrl, timeout: options.timeout, gzip: true }, (error, response, body) => {
if (error || response.statusCode !== 200) {
d.reject(error);
}
Expand Down
41 changes: 21 additions & 20 deletions utils/resolve-url.js
Original file line number Diff line number Diff line change
@@ -1,33 +1,34 @@
var urlResolver = require('url').resolve;

module.exports = function resolveUrl(url, link) {
if(link.match(/^(http|https)/g)) {
return link;
} else {
if (isCssFile(url)) {
removeExtension(url);
} else if(!endsInForwardSlash(url)) {
if (!isHtmlUrl(url)) {
url += '/';
}
}

return urlResolver(url, link);
}
};
const urlResolver = require('url').resolve;

function endsInForwardSlash(url) {
return url.indexOf('/', url.length - 1) != -1;
return url.indexOf('/', url.length - 1) !== -1;
}

function isCssFile(url) {
return url.indexOf('.css', url.length - 4) != -1;
return url.indexOf('.css', url.length - 4) !== -1;
}

function isHtmlUrl(url) {
return url.indexOf('.html', url.length - 5) != -1;
return url.indexOf('.html', url.length - 5) !== -1;
}

function removeExtension(url) {
url.replace(/\.[^/.]+$/, '');
}


module.exports = function resolveUrl(url, link) {
if (link.match(/^(http|https)/g)) {
return link;
}

if (isCssFile(url)) {
removeExtension(url);
} else if (!endsInForwardSlash(url)) {
if (!isHtmlUrl(url)) {
url += '/';
}
}

return urlResolver(url, link);
};