1 | 'use strict';
|
2 | var path = require('path');
|
3 | var arrify = require('arrify');
|
4 | var gutil = require('gulp-util');
|
5 | var through = require('through2');
|
6 | var Jasmine = require('jasmine');
|
7 | var Reporter = require('jasmine-terminal-reporter');
|
8 | var SilentReporter = require('./silent-reporter');
|
9 |
|
10 | function 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 |
|
26 | module.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 |
|
67 |
|
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 | };
|