Skip to content

Commit 81e938c

Browse files
committed
Move pages source into main branch
This is an incremental step to move the gh-pages documentation into the master branch, and ideally make things one step simpler for updating and deploying documentation. Tested building pages after a clean npm install. Next steps include automatically deploying to the gh-pages branch on pushing the master branch.
1 parent 67afd39 commit 81e938c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+91891
-3
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ npm-debug.log
77
*.swp
88
TODO
99
build
10+
immutable.d.json
11+
readme.json
12+
/pages/out

gulpfile.js

Lines changed: 351 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,351 @@
1+
require("harmonize")();
2+
3+
var browserify = require('browserify');
4+
var browserSync = require('browser-sync');
5+
var buffer = require('vinyl-buffer');
6+
var child_process = require('child_process');
7+
var concat = require('gulp-concat');
8+
var del = require('del');
9+
var filter = require('gulp-filter');
10+
var fs = require('fs');
11+
var gulp = require('gulp');
12+
var gutil = require('gulp-util');
13+
var header = require('gulp-header');
14+
var Immutable = require('./');
15+
var jest = require('gulp-jest');
16+
var jshint = require('gulp-jshint');
17+
var less = require('gulp-less');
18+
var path = require('path');
19+
var React = require('react/addons');
20+
var reactTools = require('react-tools');
21+
var sequence = require('run-sequence');
22+
var size = require('gulp-size');
23+
var source = require('vinyl-source-stream');
24+
var sourcemaps = require('gulp-sourcemaps');
25+
var stylish = require('jshint-stylish');
26+
var through = require('through2');
27+
var uglify = require('gulp-uglify');
28+
var vm = require('vm');
29+
30+
var genTypeDefData = require('./pages/lib/genTypeDefData');
31+
var genMarkdownDoc = require('./pages/lib/genMarkdownDoc');
32+
33+
var SRC_DIR = './pages/src/';
34+
var BUILD_DIR = './pages/out/';
35+
36+
gulp.task('clean', function (done) {
37+
del([
38+
BUILD_DIR,
39+
], {force: true}, done);
40+
});
41+
42+
gulp.task('readme', function() {
43+
var readmePath = 'README.md';
44+
return gulp.src(readmePath)
45+
.pipe(through.obj(function(file, enc, cb) {
46+
var fileSource = file.contents.toString(enc);
47+
file.path = path.join(path.dirname(file.path), 'readme.json');
48+
file.contents = new Buffer(JSON.stringify(
49+
genMarkdownDoc(fileSource)
50+
));
51+
this.push(file);
52+
cb();
53+
}))
54+
.pipe(gulp.dest('./resources/'));
55+
});
56+
57+
gulp.task('typedefs', function() {
58+
var typeDefPath = 'type-definitions/immutable.d.ts';
59+
return gulp.src(typeDefPath)
60+
.pipe(through.obj(function(file, enc, cb) {
61+
var fileSource = file.contents.toString(enc).replace(
62+
'module \'immutable\'',
63+
'module Immutable'
64+
);
65+
file.path = path.join(path.dirname(file.path), 'immutable.d.json');
66+
file.contents = new Buffer(JSON.stringify(
67+
genTypeDefData(file.relative, fileSource)
68+
));
69+
this.push(file);
70+
cb();
71+
}))
72+
.pipe(gulp.dest('./resources/'));
73+
});
74+
75+
gulp.task('lint', function() {
76+
return gulp.src('./app/**/*.js')
77+
.pipe(reactTransform())
78+
.on('error', handleError)
79+
.pipe(jshint({
80+
asi: true,
81+
browser: true,
82+
curly: false,
83+
eqeqeq: true,
84+
eqnull: true,
85+
esnext: true,
86+
expr: true,
87+
forin: true,
88+
freeze: true,
89+
immed: true,
90+
indent: 2,
91+
iterator: true,
92+
newcap: false,
93+
noarg: true,
94+
node: true,
95+
noempty: true,
96+
nonstandard: true,
97+
trailing: true,
98+
undef: true,
99+
unused: 'vars',
100+
}))
101+
.pipe(jshint.reporter(stylish))
102+
.pipe(jshint.reporter('fail'))
103+
.on('error', handleError);
104+
});
105+
106+
gulp.task('test', function () {
107+
return gulp.src('./')
108+
.pipe(jest({
109+
scriptPreprocessor: './resources/jest-preprocessor.js',
110+
unmockedModulePathPatterns: ['./node_modules/react'],
111+
}))
112+
.on('error', handleError);
113+
});
114+
115+
gulp.task('js', gulpJS(''));
116+
gulp.task('js-docs', gulpJS('docs/'));
117+
118+
function gulpJS(subDir) {
119+
var reactGlobalModulePath = path.relative(
120+
path.resolve(SRC_DIR+subDir),
121+
path.resolve('./resources/react-global.js')
122+
);
123+
var immutableGlobalModulePath = path.relative(
124+
path.resolve(SRC_DIR+subDir),
125+
path.resolve('./resources/immutable-global.js')
126+
);
127+
return function() {
128+
return browserify({
129+
debug: true,
130+
basedir: SRC_DIR+subDir,
131+
})
132+
.add('./src/index.js')
133+
.require('./src/index.js')
134+
.require(reactGlobalModulePath, { expose: 'react' })
135+
.require(immutableGlobalModulePath, { expose: 'immutable' })
136+
// Helpful when developing with no wifi
137+
// .require('react', { expose: 'react' })
138+
// .require('immutable', { expose: 'immutable' })
139+
.transform(reactTransformify)
140+
.bundle()
141+
.on('error', handleError)
142+
.pipe(source('bundle.js'))
143+
.pipe(buffer())
144+
.pipe(sourcemaps.init({
145+
loadMaps: true,
146+
}))
147+
.pipe(uglify())
148+
.pipe(sourcemaps.write('./maps'))
149+
.pipe(gulp.dest(BUILD_DIR+subDir))
150+
.pipe(filter('**/*.js'))
151+
.pipe(size({ showFiles: true }))
152+
.on('error', handleError);
153+
}
154+
}
155+
156+
gulp.task('pre-render', gulpPreRender(''));
157+
gulp.task('pre-render-docs', gulpPreRender('docs/'));
158+
159+
function gulpPreRender(subDir) {
160+
return function () {
161+
return gulp.src(SRC_DIR+subDir+'index.html')
162+
.pipe(preRender(subDir))
163+
.pipe(size({ showFiles: true }))
164+
.pipe(gulp.dest(BUILD_DIR+subDir))
165+
.on('error', handleError);
166+
}
167+
}
168+
169+
gulp.task('less', gulpLess(''));
170+
gulp.task('less-docs', gulpLess('docs/'));
171+
172+
function gulpLess(subDir) {
173+
return function () {
174+
return gulp.src(SRC_DIR+subDir+'src/*.less')
175+
.pipe(sourcemaps.init())
176+
.pipe(less({
177+
compress: true
178+
}))
179+
.on('error', handleError)
180+
.pipe(concat('bundle.css'))
181+
.pipe(sourcemaps.write('./maps'))
182+
.pipe(gulp.dest(BUILD_DIR+subDir))
183+
.pipe(filter('**/*.css'))
184+
.pipe(size({ showFiles: true }))
185+
.pipe(browserSync.reload({ stream:true }))
186+
.on('error', handleError);
187+
}
188+
}
189+
190+
gulp.task('statics', gulpStatics(''));
191+
gulp.task('statics-docs', gulpStatics('docs/'));
192+
193+
function gulpStatics(subDir) {
194+
return function() {
195+
return gulp.src(SRC_DIR+subDir+'static/**/*')
196+
.pipe(gulp.dest(BUILD_DIR+subDir+'static'))
197+
.on('error', handleError)
198+
.pipe(browserSync.reload({ stream:true }))
199+
.on('error', handleError);
200+
}
201+
}
202+
203+
gulp.task('build', function (done) {
204+
sequence(
205+
['readme', 'typedefs', 'js', 'js-docs', 'less', 'less-docs', 'statics', 'statics-docs'],
206+
['pre-render', 'pre-render-docs'],
207+
done
208+
);
209+
});
210+
211+
gulp.task('default', function (done) {
212+
sequence('clean', 'lint', /*'test',*/ 'build', done);
213+
});
214+
215+
// watch files for changes and reload
216+
gulp.task('dev', ['default'], function() {
217+
browserSync({
218+
port: 8040,
219+
server: {
220+
baseDir: BUILD_DIR
221+
}
222+
});
223+
224+
gulp.watch('./app/**/*.less', ['less', 'less-docs']);
225+
gulp.watch('./app/src/**/*.js', ['rebuild-js']);
226+
gulp.watch('./app/docs/src/**/*.js', ['rebuild-js-docs']);
227+
gulp.watch('./app/**/*.html', ['pre-render', 'pre-render-docs']);
228+
gulp.watch('./app/static/**/*', ['statics', 'statics-docs']);
229+
});
230+
231+
gulp.task('rebuild-js', function (done) {
232+
sequence('lint', 'js', /*'test',*/ ['pre-render'], function () {
233+
browserSync.reload();
234+
done();
235+
});
236+
});
237+
238+
gulp.task('rebuild-js-docs', function (done) {
239+
sequence('lint', 'js-docs', /*'test',*/ ['pre-render-docs'], function () {
240+
browserSync.reload();
241+
done();
242+
});
243+
});
244+
245+
function handleError(error) {
246+
gutil.log(error.message);
247+
}
248+
249+
function preRender(subDir) {
250+
return through.obj(function(file, enc, cb) {
251+
var src = file.contents.toString(enc);
252+
var components = [];
253+
src = src.replace(
254+
/<!--\s*React\(\s*(.*)\s*\)\s*-->/g,
255+
function (_, component) {
256+
var id = 'r' + components.length;
257+
components.push(component);
258+
try {
259+
return (
260+
'<div id="' + id + '">'+
261+
vm.runInNewContext(
262+
fs.readFileSync(BUILD_DIR+subDir+'bundle.js') + // ugly
263+
'\nrequire("react").renderToString('+
264+
'require("react").createElement(require(component)))',
265+
{
266+
global: {
267+
React: React,
268+
Immutable: Immutable
269+
},
270+
window: {},
271+
component: component,
272+
console: console,
273+
}
274+
) +
275+
'</div>'
276+
);
277+
} catch (error) {
278+
return '<div id="' + id + '">' + error.message + '</div>';
279+
}
280+
}
281+
);
282+
if (components.length) {
283+
src = src.replace(
284+
/<!--\s*ReactRender\(\)\s*-->/g,
285+
'<script>' + components.map(function (component, index) {
286+
return (
287+
'var React = require("react");'+
288+
'React.render('+
289+
'React.createElement(require("'+component+'")),'+
290+
'document.getElementById("r' + (index) + '")'+
291+
');'
292+
);
293+
}) + '</script>'
294+
);
295+
}
296+
file.contents = new Buffer(src, enc);
297+
this.push(file);
298+
cb();
299+
});
300+
}
301+
302+
function reactTransform() {
303+
var parseError;
304+
return through.obj(function(file, enc, cb) {
305+
if (path.extname(file.path) !== '.js') {
306+
this.push(file);
307+
return cb();
308+
}
309+
try {
310+
file.contents = new Buffer(reactTools.transform(
311+
file.contents.toString(enc),
312+
{harmony: true}
313+
), enc);
314+
this.push(file);
315+
cb();
316+
} catch (error) {
317+
parseError = new gutil.PluginError('transform', {
318+
message: file.relative + ' : ' + error.message,
319+
showStack: false
320+
});
321+
cb();
322+
}
323+
}, function (done) {
324+
parseError && this.emit('error', parseError);
325+
done();
326+
});
327+
}
328+
329+
330+
function reactTransformify(filePath) {
331+
if (path.extname(filePath) !== '.js') {
332+
return through();
333+
}
334+
var code = '';
335+
var parseError;
336+
return through.obj(function(file, enc, cb) {
337+
code += file;
338+
cb();
339+
}, function (done) {
340+
try {
341+
this.push(reactTools.transform(code, {harmony:true}));
342+
} catch (error) {
343+
parseError = new gutil.PluginError('transform', {
344+
message: error.message,
345+
showStack: false
346+
});
347+
}
348+
parseError && this.emit('error', parseError);
349+
done();
350+
});
351+
}

0 commit comments

Comments
 (0)