diff --git a/.gitignore b/.gitignore index a72b52e..49db3e8 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ results npm-debug.log node_modules + +build/ diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..83ea727 --- /dev/null +++ b/lib/index.js @@ -0,0 +1,52 @@ +(function() { + 'use strict'; + + var sass = require('node-sass'), + each = require('async').each, + join = require('path').join, + + isSassFile = function isSassFile(filename) { + return (/.*\.scss/).test(filename); + }, + + compile = function(basePath, files, filename, done) { + var file = files[filename], + includes = this.includePaths || [], + outputStyle = this.outputStyle || 'compressed', + imagePath = this.imagePath || '/'; + + if (isSassFile(filename) === true) { + sass.render({ + file: join(basePath, filename), + includePaths: includes, + imagePath: imagePath, + outputStyle: outputStyle, + success: function(css) { + // replace contents + file.contents = new Buffer(css); + // rename file extension + files[filename.replace('.scss', '.css')] = file; + delete files[filename]; + done(); + }, + error: function(err) { + throw err; + } + }); + } else { + done(); + } + }, + + compileSass = function compileSass(files, metalsmith, done) { + var basePath = join(metalsmith.dir, metalsmith._src); + each(Object.keys(files), compile.bind(this, basePath, files), done); + }, + + plugin = function plugin(options) { + var config = options || {}; + return compileSass.bind(config); + }; + + module.exports = plugin; +}()); diff --git a/package.json b/package.json new file mode 100644 index 0000000..a8e39b4 --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "metalsmith-sass", + "version": "0.1.0", + "description": "Sass plugin for Metalsmith.", + "main": "lib/index.js", + "scripts": { + "test": "mocha --reporter spec test/test.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/stevenschobert/metalsmith-sass.git" + }, + "keywords": [ + "metalsmith", + "sass" + ], + "author": "Steven Schobert ", + "license": "MIT", + "bugs": { + "url": "https://github.com/stevenschobert/metalsmith-sass/issues" + }, + "homepage": "https://github.com/stevenschobert/metalsmith-sass", + "devDependencies": { + "metalsmith": "^0.3.0", + "mocha": "^1.17.1", + "rimraf": "^2.2.6", + "assert-dir-equal": "^1.0.1" + }, + "dependencies": { + "async": "^0.2.10", + "node-sass": "^0.8.1" + } +} diff --git a/test/fixtures/basic/expected/main.css b/test/fixtures/basic/expected/main.css new file mode 100644 index 0000000..365045c --- /dev/null +++ b/test/fixtures/basic/expected/main.css @@ -0,0 +1,2 @@ +.myclass { + background: #eee; } diff --git a/test/fixtures/basic/expected/oldfile.css b/test/fixtures/basic/expected/oldfile.css new file mode 100644 index 0000000..94d2888 --- /dev/null +++ b/test/fixtures/basic/expected/oldfile.css @@ -0,0 +1,4 @@ +.shouldnotchange { + width: 50%; + color: red; +} diff --git a/test/fixtures/basic/src/main.scss b/test/fixtures/basic/src/main.scss new file mode 100644 index 0000000..cbffefe --- /dev/null +++ b/test/fixtures/basic/src/main.scss @@ -0,0 +1,5 @@ +$color: #eee; + +.myclass { + background: $color; +} diff --git a/test/fixtures/basic/src/oldfile.css b/test/fixtures/basic/src/oldfile.css new file mode 100644 index 0000000..94d2888 --- /dev/null +++ b/test/fixtures/basic/src/oldfile.css @@ -0,0 +1,4 @@ +.shouldnotchange { + width: 50%; + color: red; +} diff --git a/test/test.js b/test/test.js new file mode 100644 index 0000000..4c0afc1 --- /dev/null +++ b/test/test.js @@ -0,0 +1,37 @@ +(function () { + "use strict"; + + var each = require("async").each, + join = require("path").join, + metalsmith = require("metalsmith"), + rm = require("rimraf"), + sass = require(".."), + equal = require("assert-dir-equal"); + + describe("the plugin", function () { + beforeEach(function (done) { + var dirsToClean = [ + join(__dirname, "fixtures/basic/build") + ]; + each(dirsToClean, rm, done); + }); + + describe("core", function () { + it("should compile sass files", function (done) { + metalsmith(__dirname) + .source("fixtures/basic/src") + .destination("fixtures/basic/build") + .use(sass({ + outputStyle: 'expanded' + })) + .build(function (err) { + if (err) { + throw err; + } + equal(join(__dirname, "fixtures/basic/build"), join(__dirname, "fixtures/basic/expected")); + done(); + }); + }); + }); + }); +}());