UNPKG

2.29 kBJavaScriptView Raw
1'use strict';
2var path = require('path');
3var arrify = require('arrify');
4var gutil = require('gulp-util');
5var through = require('through2');
6var Jasmine = require('jasmine');
7var Reporter = require('jasmine-terminal-reporter');
8var SilentReporter = require('./silent-reporter');
9
10function deleteRequireCache(id) {
11 if (!id || id.indexOf('node_modules') !== -1) {
12 return;
13 }
14
15 var files = require.cache[id];
16
17 if (files !== undefined) {
18 Object.keys(files.children).forEach(function (file) {
19 deleteRequireCache(files.children[file].id);
20 });
21
22 delete require.cache[id];
23 }
24}
25
26module.exports = function (opts) {
27 opts = opts || {};
28
29 var jasmine = new Jasmine();
30
31 if (opts.timeout) {
32 jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = opts.timeout;
33 }
34
35 if (opts.config) {
36 jasmine.loadConfig(opts.config);
37 }
38
39 var errorOnFail = opts.errorOnFail === undefined ? true : opts.errorOnFail;
40 var color = process.argv.indexOf('--no-color') === -1;
41 var reporter = opts.reporter;
42
43 if (reporter) {
44 arrify(reporter).forEach(function (el) {
45 jasmine.addReporter(el);
46 });
47 } else {
48 jasmine.addReporter(new Reporter({
49 isVerbose: opts.verbose,
50 showColors: color,
51 includeStackTrace: opts.includeStackTrace
52 }));
53 }
54
55 return through.obj(function (file, enc, cb) {
56 if (file.isNull()) {
57 cb(null, file);
58 return;
59 }
60
61 if (file.isStream()) {
62 cb(new gutil.PluginError('gulp-jasmine', 'Streaming not supported'));
63 return;
64 }
65
66 // get the cache object of the specs.js file,
67 // delete it and its children recursively from cache
68 var resolvedPath = path.resolve(file.path);
69 var modId = require.resolve(resolvedPath);
70 deleteRequireCache(modId);
71
72 jasmine.addSpecFile(resolvedPath);
73
74 cb(null, file);
75 }, function (cb) {
76 var self = this;
77
78 try {
79 if (jasmine.helperFiles) {
80 jasmine.helperFiles.forEach(function (helper) {
81 var resolvedPath = path.resolve(helper);
82 var modId = require.resolve(resolvedPath);
83 deleteRequireCache(modId);
84 });
85 }
86 jasmine.addReporter(new SilentReporter(function (error) {
87 if (error) {
88 cb(error);
89 } else {
90 self.emit('jasmineDone');
91 cb();
92 }
93 }, errorOnFail));
94 jasmine.execute();
95 } catch (err) {
96 cb(new gutil.PluginError('gulp-jasmine', err, {showStack: true}));
97 }
98 });
99};