1 | "use strict";
|
2 |
|
3 | var docblock = require('jstransform/src/docblock');
|
4 | var transform = require('jstransform').transform;
|
5 | var reactTransform = require('react-tools').transform;
|
6 | var visitors = require('react-tools/vendor/fbtransform/visitors');
|
7 | var through = require('through');
|
8 |
|
9 | var isJSXExtensionRe = /^.+\.jsx$/;
|
10 |
|
11 | function parsePragma(data) {
|
12 | return docblock.parseAsObject(docblock.extract(data));
|
13 | }
|
14 |
|
15 | function 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 |
|
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 |
|
46 | }
|
47 |
|
48 | return through(write, compile);
|
49 | }
|
50 |
|
51 | function getExtensionsMatcher(extensions) {
|
52 | return new RegExp('\\.(' + extensions.join('|') + ')$');
|
53 | }
|
54 |
|
55 | module.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 | };
|
91 | module.exports.process = process;
|
92 | module.exports.isJSXExtensionRe = isJSXExtensionRe;
|