@samitouri / QOS-React-2 / commits / ff60e81fa9

Remove whitespace_transformer package

This was a one-time use thing, let's get rid of it. If we ever need to push an update, we'll do it from the 0.9-stable branch.

Paul O’Shannessy committed Apr 23, 2014 at 15:35 UTC ff60e81fa9ddeb5984f7aa414209947be0a4d547
6 files changed -475
npm-jsx_whitespace_transformer/.gitignore deleted
-1
@@ -1 +0,0 @@
1 -node_modules
npm-jsx_whitespace_transformer/README.md deleted
-40
@@ -1,40 +0,0 @@
1 -# JSX Whitespace Transformer
2 -
3 -React 0.9 changes the way whitespace is parsed from JSX.
4 -
5 -Take this example block:
6 -
7 -```js
8 -<div>
9 - Monkeys:
10 - <input type="text" /> <button />
11 -</div>
12 -```
13 -
14 -In 0.8 and below, this would be transformed to the following:
15 -
16 -```js
17 -React.DOM.div(null,
18 - " Monkeys: ",
19 - React.DOM.input( {type:"text"} ), React.DOM.button(null )
20 -)
21 -```
22 -
23 -In 0.9, this will instead be transformed the following:
24 -
25 -```js
26 -React.DOM.div(null,
27 - "Monkeys:",
28 - React.DOM.input( {type:"text"} ), " ", React.DOM.button(null )
29 -)
30 -```
31 -
32 -
33 -## Usage
34 -
35 -The `jsx_whitespace_transformer` module ships an executable which transforms a file or directory of files. It looks for the `@jsx React.DOM` trigger, the same as the `jsx` transformer works. Files will be modified in place, so be sure you are prepared for that.
36 -
37 -```sh
38 -$ npm -g install jsx_whitespace_transformer
39 -$ jsx_whitespace_tranformer <path_to_file_or_files>
40 -```
npm-jsx_whitespace_transformer/package.json deleted
-18
@@ -1,18 +0,0 @@
1 -{
2 - "name": "jsx_whitespace_transformer",
3 - "description": "A utility to update your JSX to behave identically in React 0.8 and React 0.9.",
4 - "version": "1.0.1",
5 - "main": "run.js",
6 - "dependencies": {
7 - "esprima-fb": "~2001.1001.0-dev-harmony-fb",
8 - "graceful-fs": "~2.0.0",
9 - "jstransform": "~2.0.1",
10 - "node-find-files": "0.0.2",
11 - "optimist": "~0.6.0"
12 - },
13 - "bin": {
14 - "jsx_whitespace_transformer": "./run.js"
15 - },
16 - "license": "Apache-2.0",
17 - "preferGlobal": true
18 -}
npm-jsx_whitespace_transformer/run.js deleted
-170
@@ -1,170 +0,0 @@
1 -#!/usr/bin/env node
2 -
3 -var esprima = require('esprima-fb');
4 -var FileFinder = require('node-find-files');
5 -var fs = require('graceful-fs');
6 -var jstransform = require('jstransform');
7 -var path = require('path');
8 -var visitReactTag = require('./transforms/react').visitReactTag;
9 -
10 -var S = esprima.Syntax;
11 -
12 -var USAGE =
13 - 'Read a file (or directory of files) from disk, transform it so that ' +
14 - 'React 0.9 will render it the same way as React 0.8 (whitespace-wise), and ' +
15 - 'write the result back to disk.';
16 -
17 -function _visitFbt(node, path, state) {
18 - return false;
19 -}
20 -_visitFbt.test = function(node, path, state) {
21 - return node.type === S.XJSElement
22 - && node.openingElement.name.name === 'fbt';
23 -};
24 -
25 -var VISITORS_LIST = [
26 - _visitFbt,
27 - visitReactTag
28 -];
29 -
30 -function _transformSource(source) {
31 - return jstransform.transform(VISITORS_LIST, source).code;
32 -}
33 -
34 -function transformDir(dirPath, exclude) {
35 - var finder = new FileFinder({
36 - rootFolder: dirPath,
37 - filterFunction: function(path, stat) {
38 - return /\.jsx?$/.test(path) && (!exclude || !exclude.test(path));
39 - }
40 - });
41 -
42 - var numTransforms = 0;
43 - var completeTransforms = 0;
44 - var findingComplete = false;
45 - function _printProgress() {
46 - process.stdout.clearLine();
47 - process.stdout.cursorTo(0);
48 - process.stdout.write(
49 - completeTransforms + '/' + numTransforms + ' transforms complete'
50 - );
51 -
52 - if (findingComplete && completeTransforms === numTransforms) {
53 - console.log('\ndone!');
54 - }
55 - }
56 -
57 - finder.on('match', function(pathStr, stat) {
58 - fs.readFile(pathStr, 'utf8', function(err, data) {
59 - if (err) {
60 - err.message = err.message + ' (' + pathStr + ')';
61 - throw err;
62 - }
63 -
64 - if (/@jsx React\.DOM/.test(data)) {
65 - numTransforms++;
66 - _printProgress();
67 -
68 - var transformedData;
69 - try {
70 - transformedData = _transformSource(data);
71 - } catch (e) {
72 - e.message = e.message + ' (' + pathStr + ')';
73 - throw e;
74 - }
75 -
76 - if (transformedData !== data) {
77 - fs.writeFile(pathStr, transformedData, function(err) {
78 - if (err) {
79 - err.message = err.message + ' (' + pathStr + ')';
80 - throw err;
81 - }
82 - completeTransforms++;
83 - _printProgress();
84 - });
85 - } else {
86 - completeTransforms++;
87 - _printProgress();
88 - }
89 - }
90 - });
91 - });
92 -
93 - finder.on('error', function(err) {
94 - console.log('\nError: ', err.stack);
95 - throw err;
96 - });
97 -
98 - finder.on('complete', function() {
99 - findingComplete = true;
100 - });
101 -
102 - finder.startSearch();
103 -}
104 -
105 -function transformFile(pathStr) {
106 - fs.readFile(pathStr, 'utf8', function(err, data) {
107 - if (err) {
108 - err.message = err.message + ' (' + pathStr + ')';
109 - throw err;
110 - }
111 -
112 - if (/@jsx React\.DOM/.test(data)) {
113 - var transformedData;
114 - try {
115 - transformedData = _transformSource(data);
116 - } catch (e) {
117 - e.message = e.message + ' (' + pathStr + ')';
118 - throw e;
119 - }
120 -
121 - if (transformedData !== data) {
122 - fs.writeFile(pathStr, transformedData, function(err) {
123 - if (err) {
124 - err.message = err.message + ' (' + pathStr + ')';
125 - throw err;
126 - }
127 - console.log('done!');
128 - });
129 - } else {
130 - console.log('done!');
131 - }
132 - } else {
133 - console.error(pathStr + ' is not a JSX file!');
134 - }
135 - });
136 -}
137 -
138 -if (require.main === module) {
139 - var argv = require('optimist')
140 - .usage(USAGE)
141 - .argv;
142 -
143 - if (argv._.length === 0) {
144 - throw new Error(
145 - 'Please specify a file or directory path as the first arg!'
146 - );
147 - }
148 -
149 - argv._.forEach(function(arg) {
150 - var absPath = path.resolve(arg);
151 -
152 - fs.stat(absPath, function(err, stat) {
153 - if (err) throw err;
154 -
155 - if (stat.isFile()) {
156 - transformFile(absPath);
157 - } else if (stat.isDirectory()) {
158 - var exclude = null;
159 - if (argv.exclude) {
160 - exclude = new RegExp(argv.exclude);
161 - }
162 - transformDir(absPath, exclude);
163 - } else {
164 - throw new Error('Unknown filesystem node type: ' + absPath);
165 - }
166 - });
167 - });
168 -}
169 -
170 -exports.transformDir = transformDir;
npm-jsx_whitespace_transformer/transforms/react.js deleted
-143
@@ -1,143 +0,0 @@
1 -/**
2 - * Copyright 2013-2014 Facebook, Inc.
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -/*global exports:true*/
17 -"use strict";
18 -var Syntax = require('esprima-fb').Syntax;
19 -var utils = require('jstransform/src/utils');
20 -
21 -function visitReactTag(traverse, object, path, state) {
22 - object.attributes.forEach(function(attr, index) {
23 - if (attr.value) {
24 - traverse(attr.value, path, state);
25 - }
26 - });
27 -
28 - object.children.forEach(function(child, index) {
29 - if (child.type === Syntax.Literal) {
30 - codemodXJSLiteral(child, state);
31 - } else if (child.type === Syntax.XJSExpressionContainer) {
32 - var isNotAfterLiteral =
33 - index == 0 ||
34 - object.children[index - 1].type !== Syntax.Literal;
35 -
36 - var isNotBeforeLiteral =
37 - index == object.children.length - 1 ||
38 - object.children[index + 1].type !== Syntax.Literal;
39 -
40 - codemodXJSExpressionContainer(
41 - traverse,
42 - child,
43 - isNotAfterLiteral,
44 - isNotBeforeLiteral,
45 - path,
46 - state
47 - );
48 - } else {
49 - traverse(child, path, state);
50 - }
51 - });
52 -
53 - return false;
54 -}
55 -
56 -visitReactTag.test = function(object, path, state) {
57 - // only run react when react @jsx namespace is specified in docblock
58 - var jsx = utils.getDocblock(state).jsx;
59 - return object.type === Syntax.XJSElement && jsx && jsx.length;
60 -};
61 -
62 -function codemodXJSLiteral(object, state) {
63 - var value = object.raw;
64 -
65 - utils.catchup(object.range[0], state);
66 -
67 - /*
68 - This can be used to "annotate spaces" inserted by this transformation,
69 - so that they can be more easily recognized as such in the final code
70 -
71 - {' '}
72 - {'\\x20'}
73 - {(' ')}
74 - {' '||0}
75 - {' '||AnyTextYouLike}
76 - {' '||'AnyTextYouLike'}
77 - {GlobalVariableWithASpace}
78 - */
79 -
80 - var space = "{' '}";
81 -
82 - /*
83 - · space
84 - ¬ newline
85 - {expr} = <tag>
86 -
87 - Old whitespace rules:
88 - {1}··Aaa··Bbb··{2}··{3} → {1}·Aaa··Bbb·{2}{3}
89 - {1}¬¬Aaa¬¬Bbb¬¬{2}¬¬{3} → {1}·Aaa·Bbb·{2}{3}
90 -
91 - New whitespace rules:
92 - {1}··Aaa··Bbb··{2}··{3} → {1}··Aaa··Bbb··{2}··{3}
93 - {1}¬¬Aaa¬¬Bbb¬¬{2}¬¬{3} → {1}Aaa·Bbb{2}{3}
94 -
95 - Required transformation:
96 - {1}··{2} = {1}··{2} → {1}{2}
97 - {1}··Aaa··{2} = {1}··Aaa··{2} → {1}·Aaa·{2}
98 - {1}¬¬Aaa¬¬{2} = {1}Aaa{2} → {1}·Aaa·{2}
99 - */
100 -
101 - // {1}··{2} = {1}··{2} → {1}{2}
102 - value = value.replace(/^[ \t]+$/, '');
103 -
104 - // {1}··Aaa··{2} = {1}··Aaa··{2} → {1}·Aaa·{2}
105 - value = value.replace(/^[ \t]+([^ \t\r\n])/, " $1");
106 - value = value.replace(/([^ \t\r\n])[ \t]+$/, "$1 ");
107 -
108 - // {1}¬¬Aaa¬¬{2} = {1}Aaa{2} → {1}·Aaa·{2}
109 - value = value.replace(/^([ \t]*[\r\n][ \t\r\n]*)([^ \t\r\n].*)/, "$1" + space + "$2");
110 - value = value.replace(/([^ \t\r\n])([ \t]*[\r\n][ \t\r\n]*)$/, "$1" + space + "$2");
111 -
112 - // Rendered whitespace tabs are replaced with spaces
113 - value = value.replace(/[^ \t\r\n][ ]*[\t][ \t]*[^ \t\r\n]/, function(match) {
114 - return match.replace(/\t/g, ' ');
115 - });
116 -
117 - utils.append(value, state);
118 - utils.move(object.range[1], state);
119 -}
120 -
121 -function codemodXJSExpressionContainer(
122 - traverse,
123 - object,
124 - isNotAfterLiteral,
125 - isNotBeforeLiteral,
126 - path,
127 - state) {
128 - utils.catchup(object.range[0], state);
129 - traverse(object.expression, path, state);
130 -
131 - // Unbox the previously required {' '}-workaround
132 - var raw = object.expression.raw;
133 - var isSpace = raw === "' '" || raw === '" "';
134 -
135 - if (isNotAfterLiteral && isNotBeforeLiteral && isSpace) {
136 - utils.append(' ', state);
137 - utils.move(object.range[1], state);
138 - } else {
139 - utils.catchup(object.range[1], state);
140 - }
141 -}
142 -
143 -exports.visitReactTag = visitReactTag;
npm-jsx_whitespace_transformer/transforms/xjs.js deleted
-103
@@ -1,103 +0,0 @@
1 -/**
2 - * Copyright 2013-2014 Facebook, Inc.
3 - *
4 - * Licensed under the Apache License, Version 2.0 (the "License");
5 - * you may not use this file except in compliance with the License.
6 - * You may obtain a copy of the License at
7 - *
8 - * http://www.apache.org/licenses/LICENSE-2.0
9 - *
10 - * Unless required by applicable law or agreed to in writing, software
11 - * distributed under the License is distributed on an "AS IS" BASIS,
12 - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 - * See the License for the specific language governing permissions and
14 - * limitations under the License.
15 - */
16 -/*global exports:true*/
17 -"use strict";
18 -var Syntax = require('esprima-fb').Syntax;
19 -var utils = require('jstransform/src/utils');
20 -
21 -function renderXJSLiteral(object, state) {
22 - var value = object.raw;
23 -
24 - utils.catchup(object.range[0], state);
25 -
26 - /*
27 - This can be used to "annotate spaces" inserted by this transformation,
28 - so that they can be more easily recognized as such in the final code
29 -
30 - {' '}
31 - {'\\x20'}
32 - {(' ')}
33 - {' '||0}
34 - {' '||AnyTextYouLike}
35 - {' '||'AnyTextYouLike'}
36 - {GlobalVariableWithASpace}
37 - */
38 -
39 - var space = "{' '}";
40 -
41 - /*
42 - · space
43 - ¬ newline
44 - {expr} = <tag>
45 -
46 - Old whitespace rules:
47 - {1}··Aaa··Bbb··{2}··{3} → {1}·Aaa··Bbb·{2}{3}
48 - {1}¬¬Aaa¬¬Bbb¬¬{2}¬¬{3} → {1}·Aaa·Bbb·{2}{3}
49 -
50 - New whitespace rules:
51 - {1}··Aaa··Bbb··{2}··{3} → {1}··Aaa··Bbb··{2}··{3}
52 - {1}¬¬Aaa¬¬Bbb¬¬{2}¬¬{3} → {1}Aaa·Bbb{2}{3}
53 -
54 - Required transformation:
55 - {1}··{2} = {1}··{2} → {1}{2}
56 - {1}··Aaa··{2} = {1}··Aaa··{2} → {1}·Aaa·{2}
57 - {1}¬¬Aaa¬¬{2} = {1}Aaa{2} → {1}·Aaa·{2}
58 - */
59 -
60 - // {1}··{2} = {1}··{2} → {1}{2}
61 - value = value.replace(/^[ \t]+$/, '');
62 -
63 - // {1}··Aaa··{2} = {1}··Aaa··{2} → {1}·Aaa·{2}
64 - value = value.replace(/^[ \t]+([^ \t\r\n])/, " $1");
65 - value = value.replace(/([^ \t\r\n])[ \t]+$/, "$1 ");
66 -
67 - // {1}¬¬Aaa¬¬{2} = {1}Aaa{2} → {1}·Aaa·{2}
68 - value = value.replace(/^([ \t]*[\r\n][ \t\r\n]*)([^ \t\r\n].*)/, "$1" + space + "$2");
69 - value = value.replace(/([^ \t\r\n])([ \t]*[\r\n][ \t\r\n]*)$/, "$1" + space + "$2");
70 -
71 - // Rendered whitespace tabs are replaced with spaces
72 - value = value.replace(/[^ \t\r\n][ ]*[\t][ \t]*[^ \t\r\n]/, function(match) {
73 - return match.replace(/\t/g, ' ');
74 - });
75 -
76 - utils.append(value, state);
77 - utils.move(object.range[1], state);
78 -}
79 -
80 -function renderXJSExpressionContainer(
81 - traverse, object,
82 - isNotAfterLiteral,
83 - isNotBeforeLiteral,
84 - path, state)
85 -{
86 - utils.catchup(object.range[0], state);
87 -
88 - // Unbox the previously required {' '}-workaround
89 - var raw = object.expression.raw;
90 - var isSpace = (raw === "' '" || raw === '" "');
91 -
92 - if (isNotAfterLiteral && isNotBeforeLiteral && isSpace) {
93 - utils.append(' ', state);
94 - utils.move(object.range[1], state);
95 - } else {
96 - utils.catchup(object.range[1], state);
97 - }
98 -
99 - return false;
100 -}
101 -
102 -exports.renderXJSExpressionContainer = renderXJSExpressionContainer;
103 -exports.renderXJSLiteral = renderXJSLiteral;