Skip to content

Commit 7dffa84

Browse files
authored
Add files via upload
1 parent a0628e2 commit 7dffa84

Some content is hidden

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

44 files changed

+39363
-0
lines changed

gulpfile.js

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
/// <binding Clean='clean' />
2+
'use strict';
3+
4+
// process.env.BROWSERIFYSHIM_DIAGNOSTICS=1
5+
6+
var gulp = require("gulp"),
7+
argv = require('yargs').argv,
8+
rimraf = require("rimraf"),
9+
concat = require("gulp-concat"),
10+
cssmin = require("gulp-cssmin"),
11+
gulpif = require("gulp-if"),
12+
rename = require("gulp-rename"),
13+
uglify = require("gulp-uglify"),
14+
less = require("gulp-less"),
15+
sourcemaps = require('gulp-sourcemaps'),
16+
browserify = require('browserify'),
17+
browserifyShim = require('browserify-shim'),
18+
eventStream = require('event-stream'),
19+
typescript = require("gulp-typescript"),
20+
runSequence = require('run-sequence'),
21+
buffer = require('vinyl-buffer'),
22+
source = require('vinyl-source-stream'),
23+
transform = require('vinyl-transform');
24+
25+
//
26+
// Configuration
27+
//
28+
29+
var paths = {
30+
source: "./src/",
31+
output: "./www/"
32+
};
33+
34+
var build = {
35+
input: {
36+
files: {
37+
// Source to compile
38+
ts: [
39+
paths.source + '**/*.ts',
40+
paths.source + '**/*.tsx'
41+
],
42+
43+
// Styles
44+
styles: paths.source + "styles/**/*.css",
45+
stylesMin: paths.source + "styles/**/*.min.css",
46+
less: [paths.source + "styles/**/*.less"],
47+
app_less: [paths.source + "styles/**.less"],
48+
49+
// Images
50+
images: paths.source + "images/*.png",
51+
52+
// Scripts
53+
scripts: paths.source + "scripts/**/*.js",
54+
scriptsMin: paths.source + "scripts/**/*.min.js",
55+
vendor_js: [
56+
// 'history',
57+
'react',
58+
'react-dom',
59+
'react-router',
60+
'react-router-dom'
61+
],
62+
extern_js: [
63+
'node_modules/q/q.js',
64+
],
65+
polyfill_js: [
66+
paths.source + 'polyfills/Object.assign.js'
67+
],
68+
69+
// Miscellaneous files to copy
70+
public: [paths.source + 'public/**/*'],
71+
}
72+
},
73+
output: {
74+
files: {
75+
styles: paths.output + "styles/main.css",
76+
scripts: paths.output + "scripts/main.js",
77+
},
78+
dirs: {
79+
ts: paths.output,
80+
images: paths.output + 'images',
81+
root: paths.output,
82+
styles: paths.output + 'styles',
83+
scripts: paths.output + 'scripts',
84+
polyfills: paths.output + 'polyfills',
85+
views: paths.output + 'views'
86+
}
87+
},
88+
other: {
89+
clean: ['output/*', 'build/*'],
90+
output_typings: 'output/typings',
91+
// An intermediate file; output from tsx, input to bundle.
92+
client_js: [paths.output + 'client.js']
93+
}
94+
};
95+
96+
//
97+
// Setup
98+
//
99+
100+
var typescriptProject = typescript.createProject("tsconfig.json");
101+
102+
var minify = argv.production || argv.staging;
103+
104+
//
105+
// Basic tasks
106+
//
107+
108+
gulp.task("clean", function (cb) {
109+
rimraf(paths.output, cb);
110+
});
111+
112+
gulp.task("scripts", function () {
113+
gulp.src([build.input.files.scripts, "!" + build.input.files.scriptsMin], { base: "." })
114+
.pipe(concat(build.output.files.scripts))
115+
.pipe(gulpif(minify, uglify()))
116+
.pipe(gulpif(minify, rename({ suffix: '.min' })))
117+
.pipe(gulp.dest("."));
118+
});
119+
120+
gulp.task("styles", function () {
121+
gulp.src([build.input.files.styles, "!" + build.input.files.stylesMin])
122+
.pipe(concat(build.output.files.styles))
123+
.pipe(gulpif(minify, cssmin()))
124+
.pipe(gulp.dest("."));
125+
});
126+
127+
gulp.task('less', function () {
128+
return gulp.src(build.input.files.app_less)
129+
.pipe(gulpif(!minify, sourcemaps.init()))
130+
.pipe(less()).on('error', function (err) {
131+
console.error(err);
132+
this.emit('end'); // emit the end event, to properly end the task.
133+
})
134+
.pipe(gulpif(!minify, sourcemaps.write()))
135+
.pipe(gulpif(minify, cssmin()))
136+
.pipe(gulpif(minify, rename({ suffix: '.min' })))
137+
.pipe(gulp.dest(build.output.dirs.styles));
138+
});
139+
140+
//
141+
// Compilation and packaging
142+
//
143+
144+
gulp.task('typescript', function () {
145+
return gulp
146+
.src(build.input.files.ts)
147+
.pipe(typescriptProject())
148+
.pipe(gulp.dest(build.output.dirs.ts));
149+
});
150+
151+
gulp.task('vendor', function() {
152+
return browserify({
153+
insertGlobals: true,
154+
})
155+
.transform(browserifyShim)
156+
.require(build.input.files.vendor_js)
157+
.bundle()
158+
.on('error', console.error.bind(console))
159+
.pipe(source('vendor.js'))
160+
// http://stackoverflow.com/questions/24992980/how-to-uglify-output-with-browserify-in-gulp
161+
// Convert from streaming to buffered vinyl file object for uglify
162+
.pipe(gulpif(minify, buffer()))
163+
.pipe(gulpif(minify, uglify()))
164+
.pipe(gulpif(minify, rename({ suffix: '.min' })))
165+
.pipe(gulp.dest(build.output.dirs.scripts));
166+
});
167+
168+
gulp.task('app', function() {
169+
return browserify({
170+
insertGlobals: true,
171+
entries: build.other.client_js
172+
})
173+
.transform(browserifyShim)
174+
.external(build.input.files.vendor_js)
175+
// .add(build.input.files.polyfill_js)
176+
.bundle()
177+
.on('error', console.error.bind(console))
178+
.pipe(source('app.js'))
179+
// http://stackoverflow.com/questions/24992980/how-to-uglify-output-with-browserify-in-gulp
180+
// Convert from streaming to buffered vinyl file object for uglify
181+
.pipe(gulpif(minify, buffer()))
182+
.pipe(gulpif(minify, uglify()))
183+
.pipe(gulpif(minify, rename({ suffix: '.min' })))
184+
.pipe(gulp.dest(build.output.dirs.scripts));
185+
});
186+
187+
//
188+
// Copy tasks
189+
//
190+
191+
gulp.task('public', function() {
192+
return gulp.src(build.input.files.public)
193+
.pipe(gulp.dest(build.output.dirs.root));
194+
});
195+
196+
gulp.task('images', function() {
197+
return gulp.src(build.input.files.images)
198+
.pipe(gulp.dest(build.output.dirs.root));
199+
});
200+
201+
gulp.task('extern', function () {
202+
return gulp.src(build.input.files.extern_js)
203+
.pipe(gulp.dest(build.output.dirs.scripts));
204+
});
205+
206+
gulp.task('polyfills', function() {
207+
return gulp.src(build.input.files.polyfill_js)
208+
.pipe(gulp.dest(build.output.dirs.polyfills));
209+
});
210+
211+
gulp.task('copy', ['public', 'scripts', 'styles','images' /* 'extern', 'polyfills' */], function(){});
212+
213+
gulp.task('compile', function(callback) {
214+
runSequence(['typescript', 'less'], ['vendor', 'app'], callback);
215+
});
216+
217+
gulp.task('recompile', function(callback) {
218+
runSequence('typescript', 'app', callback);
219+
});
220+
221+
gulp.task('watch', function() {
222+
gulp.watch(build.input.files.ts, ['recompile']);
223+
gulp.watch(build.input.files.views, ['views']);
224+
gulp.watch(build.input.files.styles, ['styles']);
225+
gulp.watch(build.input.files.less, ['less']);
226+
});
227+
228+
// The default task (called when running 'gulp' from the command line).
229+
gulp.task('default', ['copy', 'compile'], function(){});

jest.config.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"moduleFileExtensions": [
3+
"ts",
4+
"tsx",
5+
"js"
6+
],
7+
"moduleNameMapper": {
8+
"HomeView": "<rootDir>/src/app/views/HomeView.tsx",
9+
"LoginComponent": "<rootDir>/src/app/components/LoginComponent.tsx",
10+
"DashboardComponent": "<rootDir>/src/app/components/DashboardComponent.tsx"
11+
},
12+
"transform": {
13+
"\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
14+
},
15+
"testRegex": "/__tests__/.*\\.(ts|tsx|js)$",
16+
"setupFiles":["<rootDir>/src/mock/browserMocks.js"]
17+
}

package.json

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{
2+
"name": "fed-challange",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "gulpfile.js",
6+
"author": {
7+
"name": "Or Elkabets",
8+
"email": "[email protected]"
9+
},
10+
"scripts": {
11+
"start": "node server.js",
12+
"dev": "node ./www/server.js",
13+
"dev:linux": "NODE_ENV=development node ./www/server.js",
14+
"dev:windows": "SET NODE_ENV=development&& node www\\server.js",
15+
"build": "gulp",
16+
"test": "jest --config jest.config.json"
17+
},
18+
"browserify-shim": {},
19+
"dependencies": {
20+
"@types/immutability-helper": "^2.0.15",
21+
"@types/jest": "^20.0.8",
22+
"@types/react-test-renderer": "^15.5.4",
23+
"errorhandler": "^1.5.0",
24+
"express": "^4.13.4",
25+
"flexbox-react": "^4.4.0",
26+
"gulp-sass": "^3.1.0",
27+
"immutability-helper": "^2.3.1",
28+
"react": "^15.6.1",
29+
"react-dom": "^15.6.1",
30+
"react-draggable": "^3.0.3",
31+
"react-router": "^4.1.1",
32+
"react-router-dom": "^4.1.1"
33+
},
34+
"devDependencies": {
35+
"@types/errorhandler": "0.0.30",
36+
"@types/express": "^4.0.36",
37+
"@types/jest": "^20.0.8",
38+
"@types/node": "^8.0.12",
39+
"@types/react": "^15.0.38",
40+
"@types/react-dom": "^15.5.1",
41+
"@types/react-router": "^4.0.14",
42+
"@types/react-router-dom": "^4.0.7",
43+
"babel-jest": "^21.0.0",
44+
"babel-preset-es2015": "^6.24.1",
45+
"babel-preset-react": "^6.24.1",
46+
"browserify": "^14.4.0",
47+
"browserify-shim": "^3.8.12",
48+
"enzyme": "^2.9.1",
49+
"event-stream": "^3.3.1",
50+
"gulp": "^3.9.1",
51+
"gulp-concat": "^2.6.0",
52+
"gulp-cssmin": "^0.2.0",
53+
"gulp-if": "^2.0.0",
54+
"gulp-less": "^3.0.5",
55+
"gulp-rename": "^1.2.2",
56+
"gulp-sourcemaps": "^2.6.0",
57+
"gulp-typescript": "^3.2.0",
58+
"gulp-uglify": "^3.0.0",
59+
"jest": "^21.0.1",
60+
"node-sass": "^4.5.3",
61+
"react-test-render": "^1.0.3",
62+
"react-test-renderer": "^15.6.1",
63+
"rimraf": "^2.5.2",
64+
"run-sequence": "^2.0.0",
65+
"sass-loader": "^6.0.6",
66+
"stream-browserify": "^2.0.1",
67+
"ts-jest": "^21.0.0",
68+
"typescript": "^2.4.1",
69+
"vinyl-buffer": "^1.0.0",
70+
"vinyl-source-stream": "^1.1.0",
71+
"vinyl-transform": "^1.0.0",
72+
"yargs": "^8.0.2"
73+
}
74+
}

src/app/__tests__/app.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
describe('App', () => {
3+
it('should be able to run tests', () => {
4+
expect(1 + 2).toEqual(3);
5+
});
6+
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import * as React from 'react';
2+
import { create } from 'react-test-renderer';
3+
import {shallow} from 'enzyme';
4+
import LoginComponent from 'LoginComponent';
5+
import {UserModel} from "../../model/user.model";
6+
7+
8+
describe('LoginComponent', () => {
9+
const fakeUser:UserModel = {
10+
userName: 'FOO',
11+
password: 'BAZ',
12+
userImage: './userImage.png',
13+
active: false,
14+
userNameCords:{x:0, y:0},
15+
userImageCords:{x:0, y:0}
16+
};
17+
const invalidUser:UserModel = {
18+
userName: 'FOO',
19+
password: '',
20+
userImage: './userImage.png',
21+
active: false,
22+
userNameCords:{x:0, y:0},
23+
userImageCords:{x:0, y:0}
24+
};
25+
26+
it('renders without crashing', () => {
27+
const tree = create(<LoginComponent/>).toJSON();
28+
expect(tree).toMatchSnapshot();
29+
});
30+
31+
it('Successful Login', ()=> {
32+
const component = shallow(
33+
<LoginComponent/>
34+
);
35+
component.setState({user: fakeUser});
36+
component.find('#submit').simulate('click');
37+
let storedUser:UserModel = JSON.parse(localStorage.getItem(fakeUser.userName+fakeUser.password));
38+
expect(storedUser.userName).toEqual(fakeUser.userName);
39+
});
40+
41+
it('Login Failure', ()=> {
42+
const component = shallow(
43+
<LoginComponent/>
44+
);
45+
component.setState({user: invalidUser});
46+
component.find('#submit').simulate('click');
47+
expect(localStorage.getItem(invalidUser.userName+invalidUser.password)).toBe(null);
48+
});
49+
});

0 commit comments

Comments
 (0)