diff --git a/README.md b/README.md index 3c5d4b1..c17f9f9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Node SASS Asset functions [![Build Status](https://travis-ci.org/fetch/node-sass-asset-functions.svg?branch=master)](https://travis-ci.org/fetch/node-sass-asset-functions) [![npmjs](https://badge.fury.io/js/node-sass-asset-functions.svg)](https://www.npmjs.com/package/node-sass-asset-functions) -To ease the transitioning from Compass to Libsass, this module provides some of Compass' asset functions for [node-sass](https://github.com/sass/node-sass) +To ease the transitioning from Compass to Libsass, this module provides some of Compass' asset functions for [node-sass](https://github.com/sass/node-sass) or [sass](https://github.com/sass/sass) _**NB** Please note that the `functions` option of node-sass is still experimental (>= v3.0.0)._ @@ -86,6 +86,24 @@ sass.render({ }, function(err, result) { /*...*/ }); ``` +#### `implementation`: a function to switch sass implementation + +If you like to use other sass implementation (like `sass`), you can use `implementation` option to pass the module. + +When you omit `implementation` option, `node-sass` ( version `^4.9.3` ) is implicitly used. ( See `devDependencies` of [package.json](https://github.com/fetch/node-sass-asset-functions/blob/master/package.json) ) + +```js +var sass = require('sass') + +sass.render({ + functions: assetFunctions({ + implementation: sass, + }), + file: scss_filename, + [, options..] +}, function(err, result) { /*...*/ }); +``` + ##### A more advanced example: Here we include the file's hexdigest in the path, using the [`hexdigest`](https://github.com/koenpunt/node-hexdigest) module. diff --git a/__tests__/test.js b/__tests__/test.js index 49f43d2..246b9bc 100644 --- a/__tests__/test.js +++ b/__tests__/test.js @@ -1,21 +1,21 @@ var fs = require('fs') var path = require('path') -var sass = require('node-sass') var assetFunctions = require('../') -var renderAsync = function(file, options, done) { +var renderAsync = function(sass, file, options, done) { options = options || {} options.images_path = __dirname + '/images' options.fonts_path = __dirname + '/fonts' + options.implemantation = sass return sass.render({ functions: assetFunctions(options), - file: __dirname + '/scss/' + file + file: __dirname + '/scss/' + file, }, done) } -var equalsFileAsync = function(file, suite, options, done) { - renderAsync(file, options, function(err, result) { +var equalsFileAsync = function(sass, file, suite, options, done) { + renderAsync(sass, file, options, function(err, result) { expect(err).toBeNull() var cssPath = path.join(cssDir, suite, file.replace(/\.scss$/, '.css')) fs.readFile(cssPath, function(err, expected) { @@ -44,42 +44,46 @@ var path_asset_cache_buster = function(http_path, real_path, done) { var extname = path.extname(http_path) , basename = path.basename(http_path, extname) , dirname = path.dirname(http_path) - + done({path: path.join(dirname, basename + '-v123') + extname, query: null}) }, 10) } var files = fs.readdirSync(sassDir) -describe('basic', function() { - files.forEach(function(file) { - test(file, function(done) { - equalsFileAsync(file, 'basic', {}, done) - }) - }) -}) +describe.each(['node-sass', 'sass'])('with require("%s")', function(impl) { + var sass = require(impl) -describe('asset_host', function() { - files.forEach(function(file) { - test(file, function(done) { - equalsFileAsync(file, 'asset_host', { asset_host: asset_host }, done) + describe('basic', function() { + files.forEach(function(file) { + test(file, function(done) { + equalsFileAsync(sass, file, 'basic', {}, done) + }) }) }) -}) -describe('asset_cache_buster', function() { - describe('using query', function() { + describe('asset_host', function() { files.forEach(function(file) { test(file, function(done) { - equalsFileAsync(file, 'asset_cache_buster/query', { asset_cache_buster: query_asset_cache_buster }, done) + equalsFileAsync(sass, file, 'asset_host', { asset_host: asset_host }, done) }) }) }) - describe('using path', function() { - files.forEach(function(file) { - test(file, function(done) { - equalsFileAsync(file, 'asset_cache_buster/path', { asset_cache_buster: path_asset_cache_buster }, done) + describe('asset_cache_buster', function() { + describe('using query', function() { + files.forEach(function(file) { + test(file, function(done) { + equalsFileAsync(sass, file, 'asset_cache_buster/query', { asset_cache_buster: query_asset_cache_buster }, done) + }) + }) + }) + + describe('using path', function() { + files.forEach(function(file) { + test(file, function(done) { + equalsFileAsync(sass, file, 'asset_cache_buster/path', { asset_cache_buster: path_asset_cache_buster }, done) + }) }) }) }) diff --git a/index.js b/index.js index a9035dc..189e343 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,18 @@ -var sass = require('node-sass'); var Processor = require('./lib/processor'); +function omit(original, omitted) { + return Object.keys(original).reduce(function (result, key) { + if (key !== omitted) { + result[key] = original[key]; + } + return result; + }, {}); +} + module.exports = function(options) { var opts = options || {}; - var processor = new Processor(opts); + var processor = new Processor(omit(opts, 'implementation')); + var sass = opts.implementation || require('node-sass') return { 'image-url($filename, $only_path: false)': function(filename, only_path, done) { diff --git a/package.json b/package.json index 6b96d76..3c0eb36 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,11 @@ "homepage": "https://github.com/fetch/node-sass-asset-functions", "dependencies": { "image-size": "^0.3.5", - "mime": "^1.3.4", - "node-sass": ">= 3.2 < 5" + "mime": "^1.3.4" }, "devDependencies": { - "jest": "^16.0.2" + "jest": "^23.6.0", + "node-sass": "^4.9.3", + "sass": "^1.13.4" } }