UNPKG

2.29 kBJavaScriptView Raw
1"use strict";
2
3var docblock = require('jstransform/src/docblock');
4var transform = require('jstransform').transform;
5var reactTransform = require('react-tools').transform;
6var visitors = require('react-tools/vendor/fbtransform/visitors');
7var through = require('through');
8
9var isJSXExtensionRe = /^.+\.jsx$/;
10
11function parsePragma(data) {
12 return docblock.parseAsObject(docblock.extract(data));
13}
14
15function process(file, isJSXFile, transformer) {
16 transformer = transformer || reactTransform;
17
18 var data = '';
19 function write(chunk) {
20 return data += chunk;
21 }
22
23 function compile() {
24 // jshint -W040
25 var isJSXPragma = parsePragma(data).jsx !== undefined;
26
27 if (isJSXFile || isJSXPragma) {
28 if (!isJSXPragma) {
29 data = '/** @jsx React.DOM */' + data;
30 }
31 try {
32 var transformed = transformer(data);
33 this.queue(transformed);
34 } catch (error) {
35 error.name = 'ReactifyError';
36 error.message = file + ': ' + error.message;
37 error.fileName = file;
38
39 this.emit('error', error);
40 }
41 } else {
42 this.queue(data);
43 }
44 return this.queue(null);
45 // jshint +W040
46 }
47
48 return through(write, compile);
49}
50
51function getExtensionsMatcher(extensions) {
52 return new RegExp('\\.(' + extensions.join('|') + ')$');
53}
54
55module.exports = function(file, options) {
56 options = options || {};
57
58 var isJSXFile;
59
60 if (options.everything) {
61
62 isJSXFile = true;
63 } else {
64
65 var extensions = ['jsx']
66 .concat(options.extension)
67 .concat(options.x)
68 .filter(Boolean)
69 .map(function(ext) { return ext[0] === '.' ? ext.slice(1) : ext });
70
71 isJSXFile = getExtensionsMatcher(extensions).exec(file);
72 }
73
74 var transformVisitors = [].concat(
75 options.harmony || options.es6 ?
76 visitors.getAllVisitors() :
77 visitors.transformVisitors.react);
78
79 if (options.visitors) {
80 [].concat(options.visitors).forEach(function(id) {
81 transformVisitors = require(id).visitorList.concat(transformVisitors);
82 });
83 }
84
85 function transformer(source) {
86 return transform(transformVisitors, source).code;
87 }
88
89 return process(file, isJSXFile, transformer);
90};
91module.exports.process = process;
92module.exports.isJSXExtensionRe = isJSXExtensionRe;