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;