aboutsummaryrefslogtreecommitdiff
path: root/node_modules/ts-loader/examples
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/ts-loader/examples
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/ts-loader/examples')
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/.npmignore201
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/LICENSE22
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/README.md15
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/.eslintrc73
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/clean.js29
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/inject.js55
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/staticFiles.js31
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/tests.js45
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/webpack.js98
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulpFile.js66
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/karma.conf.js66
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/package.json83
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/App.tsx45
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/Greeting.tsx37
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx53
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/index.html19
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/main.tsx7
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/App.tests.tsx32
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx45
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx68
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/main.js5
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/tsconfig.json22
-rw-r--r--node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/webpack.config.js43
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/.npmignore201
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/LICENSE22
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/README.md16
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/.eslintrc73
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/clean.js29
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/inject.js55
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/staticFiles.js31
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/tests.js45
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/webpack.js100
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulpFile.js66
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/karma.conf.js49
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/package.json82
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/App.tsx45
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/Greeting.tsx37
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx53
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/index.html19
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/main.tsx7
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/App.tests.tsx32
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx45
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx68
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/main.js5
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/tsconfig.json22
-rw-r--r--node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/webpack.config.js64
-rw-r--r--node_modules/ts-loader/examples/webpack2-react-cdn-simple/index.html13
-rw-r--r--node_modules/ts-loader/examples/webpack2-react-cdn-simple/package.json16
-rw-r--r--node_modules/ts-loader/examples/webpack2-react-cdn-simple/tsconfig.json5
-rw-r--r--node_modules/ts-loader/examples/webpack2-react-cdn-simple/webpack.config.js24
50 files changed, 2384 insertions, 0 deletions
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/.npmignore b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/.npmignore
new file mode 100644
index 000000000..c8c6a02b7
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/.npmignore
@@ -0,0 +1,201 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+build/
+bld/
+[Bb]in/
+[Oo]bj/
+dist/
+
+# Visual Studo 2015 cache/options directory
+.vs/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# JUnit test results
+test-results
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding addin-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# TODO: Comment the next line if you want to checkin your web deploy settings
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/packages/*
+# except build/, which is used as an MSBuild target.
+!**/packages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/packages/repositories.config
+
+# Windows Azure Build Output
+csx/
+*.build.csdef
+
+# Windows Store app package directory
+AppPackages/
+
+# Others
+*.[Cc]ache
+ClientBin/
+[Ss]tyle[Cc]op.*
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.pfx
+*.publishsettings
+node_modules/
+bower_components/
+typings/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+*.mdf
+*.ldf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/LICENSE b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/LICENSE
new file mode 100644
index 000000000..d5a917f49
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 John Reilly
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/README.md b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/README.md
new file mode 100644
index 000000000..5d52ccbb8
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/README.md
@@ -0,0 +1,15 @@
+# TypeScript, Babel, React, and Karma Sample
+
+## Getting started
+
+You'll need [node / npm](https://nodejs.org/) installed. To get up and running just enter:
+
+```
+npm install
+npm run serve
+```
+
+This will:
+
+1. Download the npm packages you need (including the type definitions from DefinitelyTyped)
+2. Compile the code and serve it up at [http://localhost:8080](http://localhost:8080)
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/.eslintrc b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/.eslintrc
new file mode 100644
index 000000000..f7aa388ad
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/.eslintrc
@@ -0,0 +1,73 @@
+{
+ "root": true,
+ "env": {
+ "commonjs": true,
+ },
+ "rules": {
+ "camelcase": 2,
+ "comma-spacing": 1,
+ "consistent-return": 2,
+ "curly": [ 2, "all" ],
+ "dot-notation": [
+ 2,
+ { "allowKeywords": true }
+ ],
+ "eol-last": 2,
+ "eqeqeq": 2,
+ "keyword-spacing": 2,
+ "new-cap": 2,
+ "new-parens": 2,
+ "no-alert": 2,
+ "no-array-constructor": 2,
+ "no-caller": 2,
+ "no-catch-shadow": 2,
+ "no-eval": 2,
+ "no-extend-native": 2,
+ "no-extra-bind": 2,
+ "no-extra-parens": [ 2, "functions" ],
+ "no-implied-eval": 2,
+ "no-iterator": 2,
+ "no-labels": 2,
+ "no-label-var": 2,
+ "no-lone-blocks": 2,
+ "no-loop-func": 2,
+ "no-multi-str": 2,
+ "no-native-reassign": 2,
+ "no-new": 2,
+ "no-new-func": 2,
+ "no-new-object": 2,
+ "no-new-wrappers": 2,
+ "no-octal-escape": 2,
+ "no-proto": 2,
+ "no-return-assign": 2,
+ "no-script-url": 2,
+ "no-sequences": 2,
+ "no-shadow": 2,
+ "no-shadow-restricted-names": 2,
+ "no-spaced-func": 2,
+ "no-trailing-spaces": 1,
+ "no-undef-init": 2,
+ "no-unused-expressions": 2,
+ "no-use-before-define": [ 2, "nofunc" ],
+ "no-with": 2,
+ "quotes": [ 1, "single" ],
+ "semi": 2,
+ "semi-spacing": [
+ 2,
+ {
+ "before": false,
+ "after": true
+ }
+ ],
+ "space-infix-ops": 2,
+ "space-unary-ops": [
+ 2,
+ {
+ "words": true,
+ "nonwords": false
+ }
+ ],
+ "strict": [ 2, "global" ],
+ "yoda": [ 2, "never" ]
+ }
+}
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/clean.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/clean.js
new file mode 100644
index 000000000..c51b4e416
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/clean.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var del = require('del');
+var gutil = require('gulp-util');
+var fs = require('fs');
+
+function run(done) {
+ fs.stat('./dist', function(err){
+ if (err) {
+ // Never existed
+ done();
+ }
+ else {
+ del(['./dist'], { force: true })
+ .then(function(paths) {
+ gutil.log('Deleted files/folders:\n', paths.join('\n'));
+ done();
+ })
+ .catch(function(error) {
+ gutil.log('Problem deleting:\n', error);
+ done();
+ });
+ }
+ });
+}
+
+module.exports = {
+ run: function(done) { return run(done); }
+};
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/inject.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/inject.js
new file mode 100644
index 000000000..e4133e565
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/inject.js
@@ -0,0 +1,55 @@
+'use strict';
+
+var gulp = require('gulp');
+var inject = require('gulp-inject');
+var glob = require('glob');
+
+function injectIndex(options) {
+ function run() {
+ var target = gulp.src('./src/index.html');
+ var sources = gulp.src([
+ //'./dist/styles/main*.css',
+ './dist/scripts/vendor*.js',
+ './dist/scripts/main*.js'
+ ], { read: false });
+
+ return target
+ .pipe(inject(sources, { ignorePath: '/dist/', addRootSlash: false, removeTags: true }))
+ .pipe(gulp.dest('./dist'));
+ }
+
+ var jsCssGlob = 'dist/**/*.{js,css}';
+
+ function checkForInitialFilesThenRun() {
+ glob(jsCssGlob, function (er, files) {
+ var filesWeNeed = ['dist/scripts/main', 'dist/scripts/vendor'/*, 'dist/styles/main'*/];
+
+ function fileIsPresent(fileWeNeed) {
+ return files.some(function(file) {
+ return file.indexOf(fileWeNeed) !== -1;
+ });
+ }
+
+ if (filesWeNeed.every(fileIsPresent)) {
+ run('initial build');
+ } else {
+ checkForInitialFilesThenRun();
+ }
+ });
+ }
+
+ checkForInitialFilesThenRun();
+
+ if (options.shouldWatch) {
+ gulp.watch(jsCssGlob, function(evt) {
+ if (evt.path && evt.type === 'changed') {
+ run(evt.path);
+ }
+ });
+ }
+}
+
+module.exports = {
+ build: function() { return injectIndex({ shouldWatch: false }); },
+ watch: function() { return injectIndex({ shouldWatch: true }); }
+};
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/staticFiles.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/staticFiles.js
new file mode 100644
index 000000000..20327f272
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/staticFiles.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var gulp = require('gulp');
+var cache = require('gulp-cached');
+
+var targets = [
+ { description: 'INDEX', src: './src/index.html', dest: './dist' }
+];
+
+function copy(options) {
+ function run(target) {
+ gulp.src(target.src)
+ .pipe(cache(target.description))
+ .pipe(gulp.dest(target.dest));
+ }
+
+ function watch(target) {
+ gulp.watch(target.src, function() { run(target); });
+ }
+
+ targets.forEach(run);
+
+ if (options.shouldWatch) {
+ targets.forEach(watch);
+ }
+}
+
+module.exports = {
+ build: function() { return copy({ shouldWatch: false }); },
+ watch: function() { return copy({ shouldWatch: true }); }
+};
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/tests.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/tests.js
new file mode 100644
index 000000000..05af0a551
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/tests.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var Server = require('karma').Server;
+var path = require('path');
+var gutil = require('gulp-util');
+
+function runTests(options) {
+ // Documentation: https://karma-runner.github.io/0.13/dev/public-api.html
+ var karmaConfig = {
+ configFile: path.join(__dirname, '../karma.conf.js'),
+ singleRun: !options.shouldWatch,
+
+ plugins: ['karma-webpack', 'karma-jasmine', 'karma-mocha-reporter', 'karma-sourcemap-loader', 'karma-phantomjs-launcher'],
+ reporters: ['mocha']
+ };
+
+ if (options.done) {
+ karmaConfig.plugins.push('karma-junit-reporter');
+ karmaConfig.reporters.push('junit');
+ } else {
+ karmaConfig.plugins.push('karma-notify-reporter');
+ karmaConfig.reporters.push('notify');
+ }
+
+ new Server(karmaConfig, karmaCompleted).start();
+
+ function karmaCompleted(exitCode) {
+ if (options.done) {
+ if (exitCode === 1) {
+ gutil.log('Karma: tests failed with code ' + exitCode);
+ } else {
+ gutil.log('Karma completed!');
+ }
+ options.done();
+ }
+ else {
+ process.exit(exitCode);
+ }
+ }
+}
+
+module.exports = {
+ run: function(done) { return runTests({ shouldWatch: false, done: done }); },
+ watch: function() { return runTests({ shouldWatch: true }); }
+};
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/webpack.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/webpack.js
new file mode 100644
index 000000000..b0de5c558
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulp/webpack.js
@@ -0,0 +1,98 @@
+'use strict';
+
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var webpack = require('webpack');
+var WebpackNotifierPlugin = require('webpack-notifier');
+var failPlugin = require('webpack-fail-plugin');
+var webpackConfig = require('../webpack.config.js');
+var packageJson = require('../package.json');
+
+function buildProduction(done) {
+ // modify some webpack config options
+ var myProdConfig = Object.create(webpackConfig);
+ myProdConfig.output.filename = '[name].[hash].js';
+
+ myProdConfig.plugins = myProdConfig.plugins.concat(
+ new webpack.DefinePlugin({
+ 'process.env': {
+ 'NODE_ENV': JSON.stringify('production')
+ }
+ }),
+ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.[hash].js' }),
+ new webpack.optimize.DedupePlugin(),
+ new webpack.optimize.UglifyJsPlugin(),
+ failPlugin
+ );
+
+ // run webpack
+ webpack(myProdConfig, function (err, stats) {
+ if (err) { throw new gutil.PluginError('webpack:build', err); }
+ gutil.log('[webpack:build]', stats.toString({
+ colors: true
+ }));
+
+ if (done) { done(); }
+ });
+}
+
+function createDevCompiler() {
+ // modify some webpack config options
+ var myDevConfig = Object.create(webpackConfig);
+ myDevConfig.devtool = 'inline-source-map';
+ myDevConfig.debug = true;
+
+ myDevConfig.plugins = myDevConfig.plugins.concat(
+ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.js' }),
+ new WebpackNotifierPlugin({ title: 'Webpack build', excludeWarnings: true })
+ );
+
+ // create a single instance of the compiler to allow caching
+ return webpack(myDevConfig);
+}
+
+function build() {
+ return new Promise(function (resolve, reject) {
+ buildProduction(function (err) {
+ if (err) {
+ reject(err);
+ } else {
+ resolve('webpack built');
+ }
+ });
+ });
+}
+
+function watch() {
+ var firstBuildDone = false;
+
+ return new Promise(function (resolve, reject) {
+ var devCompiler = createDevCompiler();
+ devCompiler.watch({ // watch options:
+ aggregateTimeout: 300 // wait so long for more changes
+ }, function (err, stats) {
+ if (err) {
+ if (!firstBuildDone) {
+ firstBuildDone = true;
+ reject(err);
+ }
+ throw new gutil.PluginError('webpack:build-dev', err);
+ } else {
+ if (!firstBuildDone) {
+ firstBuildDone = true;
+ resolve('webpack built');
+ }
+ }
+
+ gutil.log('[webpack:build-dev]', stats.toString({
+ chunks: false,
+ colors: true
+ }));
+ });
+ });
+}
+
+module.exports = {
+ build: function () { return build(); },
+ watch: function () { return watch(); }
+};
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulpFile.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulpFile.js
new file mode 100644
index 000000000..b7b3abe73
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/gulpFile.js
@@ -0,0 +1,66 @@
+/* eslint-disable no-var, strict, prefer-arrow-callback */
+'use strict';
+
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var eslint = require('gulp-eslint');
+var webpack = require('./gulp/webpack');
+var staticFiles = require('./gulp/staticFiles');
+var tests = require('./gulp/tests');
+var clean = require('./gulp/clean');
+var inject = require('./gulp/inject');
+
+var lintSrcs = ['./gulp/**/*.js'];
+
+gulp.task('delete-dist', function (done) {
+ clean.run(done);
+});
+
+gulp.task('build-process.env.NODE_ENV', function () {
+ process.env.NODE_ENV = 'production';
+});
+
+gulp.task('build-js', ['delete-dist', 'build-process.env.NODE_ENV'], function(done) {
+ webpack.build().then(function() { done(); });
+});
+
+gulp.task('build-other', ['delete-dist', 'build-process.env.NODE_ENV'], function() {
+ staticFiles.build();
+});
+
+gulp.task('build', ['build-js', 'build-other', 'lint'], function () {
+ inject.build();
+});
+
+gulp.task('lint', function () {
+ return gulp.src(lintSrcs)
+ .pipe(eslint())
+ .pipe(eslint.format());
+});
+
+gulp.task('watch', ['delete-dist'], function(done) {
+ process.env.NODE_ENV = 'development';
+ Promise.all([
+ webpack.watch()//,
+ //less.watch()
+ ]).then(function() {
+ gutil.log('Now that initial assets (js and css) are generated inject will start...');
+ inject.watch();
+ done();
+ }).catch(function(error) {
+ gutil.log('Problem generating initial assets (js and css)', error);
+ });
+
+ gulp.watch(lintSrcs, ['lint']);
+ staticFiles.watch();
+ tests.watch();
+});
+
+gulp.task('watch-and-serve', ['watch'], function() {
+ // local as not required for build
+ var express = require('express')
+ var app = express()
+
+ app.use(express.static('dist', {'index': 'index.html'}))
+ app.listen(8080);
+});
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/karma.conf.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/karma.conf.js
new file mode 100644
index 000000000..72579927f
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/karma.conf.js
@@ -0,0 +1,66 @@
+/* eslint-disable no-var, strict */
+'use strict';
+
+var webpackConfig = require('./webpack.config.js');
+
+module.exports = function(config) {
+ // Documentation: https://karma-runner.github.io/0.13/config/configuration-file.html
+ config.set({
+ browsers: [ 'PhantomJS' ],
+
+ files: [
+ // This ensures we have the es6 shims in place from babel and that angular and angular-mocks are loaded
+ // and then loads all the tests
+ 'test/main.js'
+ ],
+
+ port: 9876,
+
+ frameworks: [ 'jasmine' ],
+
+ logLevel: config.LOG_INFO, //config.LOG_DEBUG
+
+ preprocessors: {
+ 'test/main.js': [ 'webpack', 'sourcemap' ]
+ },
+
+ webpack: {
+ devtool: 'inline-source-map',
+ debug: true,
+ module: webpackConfig.module,
+ resolve: webpackConfig.resolve
+ },
+
+ webpackMiddleware: {
+ quiet: true,
+ stats: {
+ colors: true
+ }
+ },
+
+ // reporter options
+ mochaReporter: {
+ colors: {
+ success: 'bgGreen',
+ info: 'cyan',
+ warning: 'bgBlue',
+ error: 'bgRed'
+ }
+ },
+
+ // the default configuration
+ junitReporter: {
+ outputDir: 'test-results', // results will be saved as $outputDir/$browserName.xml
+ outputFile: undefined, // if included, results will be saved as $outputDir/$browserName/$outputFile
+ suite: ''
+ },
+
+ coverageReporter: {
+ reporters:[
+ //{type: 'html', dir:'coverage/'}, // https://github.com/karma-runner/karma-coverage/issues/123
+ {type: 'text'},
+ {type: 'text-summary'}
+ ],
+ }
+ });
+};
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/package.json b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/package.json
new file mode 100644
index 000000000..131bb2911
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/package.json
@@ -0,0 +1,83 @@
+{
+ "name": "es6-babel-react-flux-karma",
+ "version": "1.0.0",
+ "description": "ES6 + TypeScript + Babel + React + Karma: The Secret Recipe",
+ "main": "index.js",
+ "scripts": {
+ "test": "karma start --reporters mocha,junit --single-run --browsers PhantomJS",
+ "serve": "gulp watch-and-serve",
+ "watch": "gulp watch",
+ "build": "gulp build"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/microsoft/typescriptsamples.git"
+ },
+ "keywords": [
+ "React",
+ "Flux",
+ "ES2016",
+ "typescript"
+ ],
+ "author": "John Reilly",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/microsoft/typescriptsamples/issues"
+ },
+ "homepage": "https://github.com/Microsoft/TypeScriptSamples/tree/master/es6-babel-react-flux-karma#readme",
+ "devDependencies": {
+ "@types/fbemitter": "^2.0.32",
+ "@types/flux": "0.0.32",
+ "@types/jasmine": "^2.5.35",
+ "@types/react": "^0.14.41",
+ "@types/react-addons-test-utils": "^0.14.15",
+ "@types/react-bootstrap": "0.0.33",
+ "@types/react-dom": "^0.14.18",
+ "babel": "^6.0.0",
+ "babel-core": "^6.0.0",
+ "babel-loader": "^6.0.0",
+ "babel-preset-es2015": "^6.0.0",
+ "babel-preset-es2016": "^6.16.0",
+ "babel-preset-react": "^6.0.0",
+ "del": "^2.0.2",
+ "eslint": "^2.0.0",
+ "express": "^4.13.3",
+ "glob": "^7.0.0",
+ "gulp": "^3.9.0",
+ "gulp-autoprefixer": "^3.1.0",
+ "gulp-cached": "^1.1.0",
+ "gulp-cssmin": "^0.1.7",
+ "gulp-eslint": "^2.0.0",
+ "gulp-if": "^2.0.0",
+ "gulp-inject": "^3.0.0",
+ "gulp-notify": "^2.2.0",
+ "gulp-sourcemaps": "^1.5.2",
+ "gulp-streamify": "1.0.2",
+ "gulp-uglify": "^1.2.0",
+ "gulp-util": "^3.0.6",
+ "jasmine-core": "^2.3.4",
+ "karma": "^1.2.0",
+ "karma-coverage": "^1.0.0",
+ "karma-jasmine": "^1.0.0",
+ "karma-junit-reporter": "^1.0.0",
+ "karma-mocha-reporter": "^2.0.0",
+ "karma-notify-reporter": "^1.0.0",
+ "karma-phantomjs-launcher": "^1.0.0",
+ "karma-sourcemap-loader": "^0.3.6",
+ "karma-webpack": "^1.7.0",
+ "phantomjs-prebuilt": "^2.1.4",
+ "ts-loader": "^1.3.3",
+ "typescript": "^2.1.4",
+ "webpack": "^1.12.2",
+ "webpack-fail-plugin": "^1.0.4",
+ "webpack-notifier": "^1.2.1"
+ },
+ "dependencies": {
+ "babel-polyfill": "^6.0.0",
+ "flux": "^2.0.3",
+ "fbemitter": "^2.0.2",
+ "react": "^15.4.1",
+ "react-addons-test-utils": "^15.4.1",
+ "react-dom": "^15.4.1"
+ }
+}
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/App.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/App.tsx
new file mode 100644
index 000000000..e74cc9538
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/App.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import FBEmitter from "fbemitter";
+
+import GreetingStore from '../stores/GreetingStore';
+import GreetingState from '../types/GreetingState';
+import WhoToGreet from './WhoToGreet';
+import Greeting from './Greeting';
+
+class App extends React.Component<{}, GreetingState> {
+ eventSubscription: FBEmitter.EventSubscription;
+ constructor(props: {}) {
+ super(props);
+ this.state = this.getStateFromStores();
+ }
+ private onChange = () => {
+ this.setState(this.getStateFromStores());
+ }
+
+ public componentWillMount() {
+ this.eventSubscription = GreetingStore.addChangeListener(this.onChange);
+ }
+
+ public componentWillUnmount() {
+ this.eventSubscription.remove();
+ }
+
+ render() {
+ const { greetings, newGreeting } = this.state;
+ return (
+ <div className="container-fluid">
+ <h1>Hello People!</h1>
+
+ <WhoToGreet newGreeting={ newGreeting } />
+
+ { greetings.map((g, index) => <Greeting key={ index } targetOfGreeting={ g } />) }
+ </div>
+ );
+ }
+
+ private getStateFromStores() {
+ return GreetingStore.getState();
+ }
+}
+
+export default App;
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/Greeting.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/Greeting.tsx
new file mode 100644
index 000000000..7150537c7
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/Greeting.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+
+import * as GreetingActions from '../actions/GreetingActions';
+
+interface Props {
+ key: number;
+ targetOfGreeting: string;
+}
+
+class Greeting extends React.Component<Props, any> {
+ constructor(props: Props) {
+ super(props);
+ }
+
+ static propTypes: React.ValidationMap<Props> = {
+ targetOfGreeting: React.PropTypes.string.isRequired
+ }
+
+ render() {
+ return (
+ <p>
+ Hello { this.props.targetOfGreeting }!
+
+ <button className="btn btn-default btn-danger"
+ onClick={ this._onClick }>
+ Remove
+ </button>
+ </p>
+ );
+ }
+
+ _onClick = (_event: React.MouseEvent<HTMLButtonElement>) => {
+ GreetingActions.removeGreeting(this.props.targetOfGreeting);
+ }
+}
+
+export default Greeting;
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx
new file mode 100644
index 000000000..9f3deda94
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+
+import * as GreetingActions from '../actions/GreetingActions';
+
+interface Props {
+ newGreeting: string;
+}
+
+class WhoToGreet extends React.Component<Props, any> {
+ constructor(props: Props) {
+ super(props);
+ }
+
+ static propTypes: React.ValidationMap<Props> = {
+ newGreeting: React.PropTypes.string.isRequired
+ }
+
+ render() {
+ return (
+ <form role="form">
+ <div className="form-group">
+ <input type="text" className="form-control" placeholder="Who would you like to greet?"
+ value={ this.props.newGreeting }
+ onChange={ this._handleNewGreetingChange } />
+ <button type="submit" className="btn btn-default btn-primary"
+ onClick={ this._onSubmit }
+ disabled={ this._preventSubmission }>
+ Add greeting
+ </button>
+ </div>
+ </form>
+ );
+ }
+
+ get _preventSubmission() {
+ return !this.props.newGreeting;
+ }
+
+ _handleNewGreetingChange = (event: React.FormEvent<HTMLInputElement>) => {
+ const newGreeting = (event.target as HTMLInputElement).value;
+ GreetingActions.newGreetingChanged(newGreeting);
+ }
+
+ _onSubmit = (event: React.FormEvent<HTMLButtonElement>) => {
+ event.preventDefault();
+
+ if (!this._preventSubmission) {
+ GreetingActions.addGreeting(this.props.newGreeting);
+ }
+ }
+}
+
+export default WhoToGreet;
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/index.html b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/index.html
new file mode 100644
index 000000000..a3f53185a
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/index.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title>TypeScript, Babel, React, Flux, and Karma</title>
+
+ <!-- inject:css -->
+ <!-- endinject -->
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
+ </head>
+ <body>
+ <div id="content"></div>
+ <!-- inject:js -->
+ <!-- endinject -->
+ </body>
+</html>
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/main.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/main.tsx
new file mode 100644
index 000000000..7e957bd47
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/src/main.tsx
@@ -0,0 +1,7 @@
+import 'babel-polyfill';
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+import App from './components/App';
+
+ReactDOM.render(<App />, document.getElementById('content'));
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/App.tests.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/App.tests.tsx
new file mode 100644
index 000000000..aa9612416
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/App.tests.tsx
@@ -0,0 +1,32 @@
+import React from 'react';
+import TestUtils from 'react-addons-test-utils';
+
+import App from '../../src/components/App';
+import WhoToGreet from '../../src/components/WhoToGreet';
+import Greeting from '../../src/components/Greeting';
+import GreetingStore from '../../src/stores/GreetingStore';
+
+describe('App', () => {
+ it('renders expected HTML', () => {
+ const app = render({ greetings: ['James'], newGreeting: 'Benjamin' });
+ expect(app).toEqual(
+ <div className="container-fluid">
+ <h1>Hello People!</h1>
+
+ <WhoToGreet newGreeting={ 'Benjamin' } />
+
+ { [
+ <Greeting key={ 0 } targetOfGreeting="James" />
+ ] }
+ </div>
+ );
+ });
+
+ function render(state: any) {
+ const shallowRenderer = TestUtils.createRenderer();
+ spyOn(GreetingStore, 'getState').and.returnValue(state);
+
+ shallowRenderer.render(<App />);
+ return shallowRenderer.getRenderOutput();
+ }
+});
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx
new file mode 100644
index 000000000..911a6cba2
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import TestUtils from 'react-addons-test-utils';
+
+import Greeting from '../../src/components/Greeting';
+import * as GreetingActions from '../../src/actions/GreetingActions';
+
+describe('Greeting', () => {
+ let handleSelectionChangeSpy: jasmine.Spy;
+ beforeEach(() => {
+ handleSelectionChangeSpy = jasmine.createSpy('handleSelectionChange');
+ });
+
+ it('given a targetOfGreeting of \'James\' it renders a p containing a greeting and a remove button', () => {
+ const targetOfGreeting = 'James';
+
+ const p = render({ targetOfGreeting });
+ expect(p.type).toBe('p');
+ expect(p.props.children[0]).toBe('Hello ');
+ expect(p.props.children[1]).toBe('James');
+ expect(p.props.children[2]).toBe('!');
+
+ const [ , , , button ] = p.props.children;
+
+ expect(button.type).toBe('button');
+ expect(button.props.className).toBe('btn btn-default btn-danger');
+ expect(button.props.children).toBe('Remove');
+ });
+
+ it('button onClick triggers an removeGreeting action', () => {
+ const targetOfGreeting = 'Benjamin';
+ const p = render({ targetOfGreeting });
+ const [ , , , button ] = p.props.children;
+ spyOn(GreetingActions, 'removeGreeting');
+
+ button.props.onClick();
+
+ expect(GreetingActions.removeGreeting).toHaveBeenCalledWith(targetOfGreeting);
+ });
+
+ function render({ targetOfGreeting }: { targetOfGreeting: string; }) {
+ const shallowRenderer = TestUtils.createRenderer();
+ shallowRenderer.render(<Greeting key={ 0 } targetOfGreeting={ targetOfGreeting } />);
+ return shallowRenderer.getRenderOutput();
+ }
+});
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx
new file mode 100644
index 000000000..01398952e
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import TestUtils from 'react-addons-test-utils';
+
+import WhoToGreet from '../../src/components/WhoToGreet';
+import * as GreetingActions from '../../src/actions/GreetingActions';
+
+describe('WhoToGreet', () => {
+ let handleSelectionChangeSpy: jasmine.Spy;
+ beforeEach(() => {
+ handleSelectionChangeSpy = jasmine.createSpy('handleSelectionChange');
+ });
+
+ it('given a newGreeting then it renders a form containing an input containing that text and an add button', () => {
+ const newGreeting = 'James';
+
+ const form = render({ newGreeting });
+ expect(form.type).toBe('form');
+ expect(form.props.role).toBe('form');
+
+ const formGroup = form.props.children;
+ expect(formGroup.type).toBe('div');
+ expect(formGroup.props.className).toBe('form-group');
+
+ const [ input, button ] = formGroup.props.children;
+
+ expect(input.type).toBe('input');
+ expect(input.props.type).toBe('text');
+ expect(input.props.className).toBe('form-control');
+ expect(input.props.placeholder).toBe('Who would you like to greet?');
+ expect(input.props.value).toBe(newGreeting);
+
+ expect(button.type).toBe('button');
+ expect(button.props.type).toBe('submit');
+ expect(button.props.className).toBe('btn btn-default btn-primary');
+ expect(button.props.disabled).toBe(false);
+ expect(button.props.children).toBe('Add greeting');
+ });
+
+ it('input onChange triggers a newGreetingChanged action', () => {
+ const newGreeting = 'Benjamin';
+ const form = render({ newGreeting });
+ const formGroup = form.props.children;
+ const [ input ] = formGroup.props.children;
+ spyOn(GreetingActions, 'newGreetingChanged');
+
+ input.props.onChange({ target: { value: newGreeting }});
+
+ expect(GreetingActions.newGreetingChanged).toHaveBeenCalledWith(newGreeting);
+ });
+
+ it('button onClick triggers an addGreeting action', () => {
+ const newGreeting = 'Benjamin';
+ const form = render({ newGreeting });
+ const formGroup = form.props.children;
+ const [ , button ] = formGroup.props.children;
+ spyOn(GreetingActions, 'addGreeting');
+
+ button.props.onClick({ preventDefault: () => {} });
+
+ expect(GreetingActions.addGreeting).toHaveBeenCalledWith(newGreeting);
+ });
+
+ function render({ newGreeting }: { newGreeting: string }) {
+ const shallowRenderer = TestUtils.createRenderer();
+ shallowRenderer.render(<WhoToGreet newGreeting={ newGreeting } />);
+ return shallowRenderer.getRenderOutput();
+ }
+});
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/main.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/main.js
new file mode 100644
index 000000000..1b332a7c0
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/test/main.js
@@ -0,0 +1,5 @@
+/* eslint-disable */
+import 'babel-polyfill';
+
+const testsContext = require.context('./', true, /\.tests\.ts(x?)$/);
+testsContext.keys().forEach(testsContext); \ No newline at end of file
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/tsconfig.json b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/tsconfig.json
new file mode 100644
index 000000000..c3a732c12
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "lib": [
+ "dom",
+ "es2015",
+ "es2016"
+ ],
+ "jsx": "preserve",
+ "target": "es2016",
+ "module": "es2015",
+ "moduleResolution": "node",
+ "noImplicitAny": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "removeComments": false,
+ "preserveConstEnums": true,
+ "sourceMap": true,
+ "skipLibCheck": true
+ }
+} \ No newline at end of file
diff --git a/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/webpack.config.js b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/webpack.config.js
new file mode 100644
index 000000000..cc26b27b7
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack1-gulp-react-flux-babel-karma/webpack.config.js
@@ -0,0 +1,43 @@
+/* eslint-disable no-var, strict, prefer-arrow-callback */
+'use strict';
+
+var path = require('path');
+
+module.exports = {
+ cache: true,
+ entry: {
+ main: './src/main.tsx',
+ vendor: [
+ 'babel-polyfill',
+ 'fbemitter',
+ 'flux',
+ 'react',
+ 'react-dom'
+ ]
+ },
+ output: {
+ path: path.resolve(__dirname, './dist/scripts'),
+ filename: '[name].js',
+ chunkFilename: '[chunkhash].js'
+ },
+ module: {
+ loaders: [{
+ test: /\.ts(x?)$/,
+ exclude: /node_modules/,
+ loader: 'babel-loader?presets[]=es2016&presets[]=es2015&presets[]=react!ts-loader'
+ }, {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: 'babel',
+ query: {
+ presets: ['es2016', 'es2015', 'react']
+ }
+ }]
+ },
+ plugins: [
+ ],
+ resolve: {
+ // Add `.ts` and `.tsx` as a resolvable extension.
+ extensions: ['.webpack.js', '.web.js', '.ts', '.tsx', '.js']
+ },
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/.npmignore b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/.npmignore
new file mode 100644
index 000000000..c8c6a02b7
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/.npmignore
@@ -0,0 +1,201 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+build/
+bld/
+[Bb]in/
+[Oo]bj/
+dist/
+
+# Visual Studo 2015 cache/options directory
+.vs/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# JUnit test results
+test-results
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding addin-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# TODO: Comment the next line if you want to checkin your web deploy settings
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/packages/*
+# except build/, which is used as an MSBuild target.
+!**/packages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/packages/repositories.config
+
+# Windows Azure Build Output
+csx/
+*.build.csdef
+
+# Windows Store app package directory
+AppPackages/
+
+# Others
+*.[Cc]ache
+ClientBin/
+[Ss]tyle[Cc]op.*
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.pfx
+*.publishsettings
+node_modules/
+bower_components/
+typings/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+*.mdf
+*.ldf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/LICENSE b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/LICENSE
new file mode 100644
index 000000000..d5a917f49
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 John Reilly
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/README.md b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/README.md
new file mode 100644
index 000000000..e7a0cb064
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/README.md
@@ -0,0 +1,16 @@
+# TypeScript, Babel, React, and Karma Sample
+
+## Getting started
+
+You'll need [node / npm](https://nodejs.org/) installed. To get up and running just enter:
+
+```
+npm install
+npm run serve
+```
+
+This will:
+
+1. Download the npm packages you need (including the type definitions from DefinitelyTyped)
+2. Compile the code and serve it up at [http://localhost:8080](http://localhost:8080)
+
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/.eslintrc b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/.eslintrc
new file mode 100644
index 000000000..f7aa388ad
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/.eslintrc
@@ -0,0 +1,73 @@
+{
+ "root": true,
+ "env": {
+ "commonjs": true,
+ },
+ "rules": {
+ "camelcase": 2,
+ "comma-spacing": 1,
+ "consistent-return": 2,
+ "curly": [ 2, "all" ],
+ "dot-notation": [
+ 2,
+ { "allowKeywords": true }
+ ],
+ "eol-last": 2,
+ "eqeqeq": 2,
+ "keyword-spacing": 2,
+ "new-cap": 2,
+ "new-parens": 2,
+ "no-alert": 2,
+ "no-array-constructor": 2,
+ "no-caller": 2,
+ "no-catch-shadow": 2,
+ "no-eval": 2,
+ "no-extend-native": 2,
+ "no-extra-bind": 2,
+ "no-extra-parens": [ 2, "functions" ],
+ "no-implied-eval": 2,
+ "no-iterator": 2,
+ "no-labels": 2,
+ "no-label-var": 2,
+ "no-lone-blocks": 2,
+ "no-loop-func": 2,
+ "no-multi-str": 2,
+ "no-native-reassign": 2,
+ "no-new": 2,
+ "no-new-func": 2,
+ "no-new-object": 2,
+ "no-new-wrappers": 2,
+ "no-octal-escape": 2,
+ "no-proto": 2,
+ "no-return-assign": 2,
+ "no-script-url": 2,
+ "no-sequences": 2,
+ "no-shadow": 2,
+ "no-shadow-restricted-names": 2,
+ "no-spaced-func": 2,
+ "no-trailing-spaces": 1,
+ "no-undef-init": 2,
+ "no-unused-expressions": 2,
+ "no-use-before-define": [ 2, "nofunc" ],
+ "no-with": 2,
+ "quotes": [ 1, "single" ],
+ "semi": 2,
+ "semi-spacing": [
+ 2,
+ {
+ "before": false,
+ "after": true
+ }
+ ],
+ "space-infix-ops": 2,
+ "space-unary-ops": [
+ 2,
+ {
+ "words": true,
+ "nonwords": false
+ }
+ ],
+ "strict": [ 2, "global" ],
+ "yoda": [ 2, "never" ]
+ }
+}
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/clean.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/clean.js
new file mode 100644
index 000000000..c51b4e416
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/clean.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var del = require('del');
+var gutil = require('gulp-util');
+var fs = require('fs');
+
+function run(done) {
+ fs.stat('./dist', function(err){
+ if (err) {
+ // Never existed
+ done();
+ }
+ else {
+ del(['./dist'], { force: true })
+ .then(function(paths) {
+ gutil.log('Deleted files/folders:\n', paths.join('\n'));
+ done();
+ })
+ .catch(function(error) {
+ gutil.log('Problem deleting:\n', error);
+ done();
+ });
+ }
+ });
+}
+
+module.exports = {
+ run: function(done) { return run(done); }
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/inject.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/inject.js
new file mode 100644
index 000000000..e4133e565
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/inject.js
@@ -0,0 +1,55 @@
+'use strict';
+
+var gulp = require('gulp');
+var inject = require('gulp-inject');
+var glob = require('glob');
+
+function injectIndex(options) {
+ function run() {
+ var target = gulp.src('./src/index.html');
+ var sources = gulp.src([
+ //'./dist/styles/main*.css',
+ './dist/scripts/vendor*.js',
+ './dist/scripts/main*.js'
+ ], { read: false });
+
+ return target
+ .pipe(inject(sources, { ignorePath: '/dist/', addRootSlash: false, removeTags: true }))
+ .pipe(gulp.dest('./dist'));
+ }
+
+ var jsCssGlob = 'dist/**/*.{js,css}';
+
+ function checkForInitialFilesThenRun() {
+ glob(jsCssGlob, function (er, files) {
+ var filesWeNeed = ['dist/scripts/main', 'dist/scripts/vendor'/*, 'dist/styles/main'*/];
+
+ function fileIsPresent(fileWeNeed) {
+ return files.some(function(file) {
+ return file.indexOf(fileWeNeed) !== -1;
+ });
+ }
+
+ if (filesWeNeed.every(fileIsPresent)) {
+ run('initial build');
+ } else {
+ checkForInitialFilesThenRun();
+ }
+ });
+ }
+
+ checkForInitialFilesThenRun();
+
+ if (options.shouldWatch) {
+ gulp.watch(jsCssGlob, function(evt) {
+ if (evt.path && evt.type === 'changed') {
+ run(evt.path);
+ }
+ });
+ }
+}
+
+module.exports = {
+ build: function() { return injectIndex({ shouldWatch: false }); },
+ watch: function() { return injectIndex({ shouldWatch: true }); }
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/staticFiles.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/staticFiles.js
new file mode 100644
index 000000000..20327f272
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/staticFiles.js
@@ -0,0 +1,31 @@
+'use strict';
+
+var gulp = require('gulp');
+var cache = require('gulp-cached');
+
+var targets = [
+ { description: 'INDEX', src: './src/index.html', dest: './dist' }
+];
+
+function copy(options) {
+ function run(target) {
+ gulp.src(target.src)
+ .pipe(cache(target.description))
+ .pipe(gulp.dest(target.dest));
+ }
+
+ function watch(target) {
+ gulp.watch(target.src, function() { run(target); });
+ }
+
+ targets.forEach(run);
+
+ if (options.shouldWatch) {
+ targets.forEach(watch);
+ }
+}
+
+module.exports = {
+ build: function() { return copy({ shouldWatch: false }); },
+ watch: function() { return copy({ shouldWatch: true }); }
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/tests.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/tests.js
new file mode 100644
index 000000000..05af0a551
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/tests.js
@@ -0,0 +1,45 @@
+'use strict';
+
+var Server = require('karma').Server;
+var path = require('path');
+var gutil = require('gulp-util');
+
+function runTests(options) {
+ // Documentation: https://karma-runner.github.io/0.13/dev/public-api.html
+ var karmaConfig = {
+ configFile: path.join(__dirname, '../karma.conf.js'),
+ singleRun: !options.shouldWatch,
+
+ plugins: ['karma-webpack', 'karma-jasmine', 'karma-mocha-reporter', 'karma-sourcemap-loader', 'karma-phantomjs-launcher'],
+ reporters: ['mocha']
+ };
+
+ if (options.done) {
+ karmaConfig.plugins.push('karma-junit-reporter');
+ karmaConfig.reporters.push('junit');
+ } else {
+ karmaConfig.plugins.push('karma-notify-reporter');
+ karmaConfig.reporters.push('notify');
+ }
+
+ new Server(karmaConfig, karmaCompleted).start();
+
+ function karmaCompleted(exitCode) {
+ if (options.done) {
+ if (exitCode === 1) {
+ gutil.log('Karma: tests failed with code ' + exitCode);
+ } else {
+ gutil.log('Karma completed!');
+ }
+ options.done();
+ }
+ else {
+ process.exit(exitCode);
+ }
+ }
+}
+
+module.exports = {
+ run: function(done) { return runTests({ shouldWatch: false, done: done }); },
+ watch: function() { return runTests({ shouldWatch: true }); }
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/webpack.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/webpack.js
new file mode 100644
index 000000000..2ecbf42ea
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulp/webpack.js
@@ -0,0 +1,100 @@
+'use strict';
+
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var webpack = require('webpack');
+var WebpackNotifierPlugin = require('webpack-notifier');
+var failPlugin = require('webpack-fail-plugin');
+var webpackConfig = require('../webpack.config.js');
+var packageJson = require('../package.json');
+
+function buildProduction(done) {
+ // modify some webpack config options
+ var myProdConfig = webpackConfig;
+ myProdConfig.output.filename = '[name].[hash].js';
+
+ myProdConfig.plugins = myProdConfig.plugins.concat(
+ new webpack.DefinePlugin({
+ 'process.env': {
+ 'NODE_ENV': JSON.stringify('production')
+ }
+ }),
+ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.[hash].js' }),
+ new webpack.optimize.UglifyJsPlugin({
+ compress: {
+ warnings: true
+ }
+ }),
+ failPlugin
+ );
+
+ // run webpack
+ webpack(myProdConfig, function (err, stats) {
+ if (err) { throw new gutil.PluginError('webpack:build', err); }
+ gutil.log('[webpack:build]', stats.toString({
+ colors: true
+ }));
+
+ if (done) { done(); }
+ });
+}
+
+function createDevCompiler() {
+ // modify some webpack config options
+ var myDevConfig = webpackConfig;
+ myDevConfig.devtool = 'inline-source-map';
+
+ myDevConfig.plugins = myDevConfig.plugins.concat(
+ new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.js' }),
+ new WebpackNotifierPlugin({ title: 'Webpack build', excludeWarnings: true })
+ );
+
+ // create a single instance of the compiler to allow caching
+ return webpack(myDevConfig);
+}
+
+function build() {
+ return new Promise(function (resolve, reject) {
+ buildProduction(function (err) {
+ if (err) {
+ reject(err);
+ } else {
+ resolve('webpack built');
+ }
+ });
+ });
+}
+
+function watch() {
+ var firstBuildDone = false;
+
+ return new Promise(function (resolve, reject) {
+ var devCompiler = createDevCompiler();
+ devCompiler.watch({ // watch options:
+ aggregateTimeout: 300 // wait so long for more changes
+ }, function (err, stats) {
+ if (err) {
+ if (!firstBuildDone) {
+ firstBuildDone = true;
+ reject(err);
+ }
+ throw new gutil.PluginError('webpack:build-dev', err);
+ } else {
+ if (!firstBuildDone) {
+ firstBuildDone = true;
+ resolve('webpack built');
+ }
+ }
+
+ gutil.log('[webpack:build-dev]', stats.toString({
+ chunks: false,
+ colors: true
+ }));
+ });
+ });
+}
+
+module.exports = {
+ build: function () { return build(); },
+ watch: function () { return watch(); }
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulpFile.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulpFile.js
new file mode 100644
index 000000000..b7b3abe73
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/gulpFile.js
@@ -0,0 +1,66 @@
+/* eslint-disable no-var, strict, prefer-arrow-callback */
+'use strict';
+
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var eslint = require('gulp-eslint');
+var webpack = require('./gulp/webpack');
+var staticFiles = require('./gulp/staticFiles');
+var tests = require('./gulp/tests');
+var clean = require('./gulp/clean');
+var inject = require('./gulp/inject');
+
+var lintSrcs = ['./gulp/**/*.js'];
+
+gulp.task('delete-dist', function (done) {
+ clean.run(done);
+});
+
+gulp.task('build-process.env.NODE_ENV', function () {
+ process.env.NODE_ENV = 'production';
+});
+
+gulp.task('build-js', ['delete-dist', 'build-process.env.NODE_ENV'], function(done) {
+ webpack.build().then(function() { done(); });
+});
+
+gulp.task('build-other', ['delete-dist', 'build-process.env.NODE_ENV'], function() {
+ staticFiles.build();
+});
+
+gulp.task('build', ['build-js', 'build-other', 'lint'], function () {
+ inject.build();
+});
+
+gulp.task('lint', function () {
+ return gulp.src(lintSrcs)
+ .pipe(eslint())
+ .pipe(eslint.format());
+});
+
+gulp.task('watch', ['delete-dist'], function(done) {
+ process.env.NODE_ENV = 'development';
+ Promise.all([
+ webpack.watch()//,
+ //less.watch()
+ ]).then(function() {
+ gutil.log('Now that initial assets (js and css) are generated inject will start...');
+ inject.watch();
+ done();
+ }).catch(function(error) {
+ gutil.log('Problem generating initial assets (js and css)', error);
+ });
+
+ gulp.watch(lintSrcs, ['lint']);
+ staticFiles.watch();
+ tests.watch();
+});
+
+gulp.task('watch-and-serve', ['watch'], function() {
+ // local as not required for build
+ var express = require('express')
+ var app = express()
+
+ app.use(express.static('dist', {'index': 'index.html'}))
+ app.listen(8080);
+});
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/karma.conf.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/karma.conf.js
new file mode 100644
index 000000000..f07fbc179
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/karma.conf.js
@@ -0,0 +1,49 @@
+/* eslint-disable no-var, strict */
+'use strict';
+
+var webpackConfig = require('./webpack.config.js');
+
+module.exports = function(config) {
+ // Documentation: https://karma-runner.github.io/0.13/config/configuration-file.html
+ config.set({
+ browsers: [ 'PhantomJS' ],
+
+ files: [
+ // This ensures we have the es6 shims in place and then loads all the tests
+ 'test/main.js'
+ ],
+
+ port: 9876,
+
+ frameworks: [ 'jasmine' ],
+
+ logLevel: config.LOG_INFO, //config.LOG_DEBUG
+
+ preprocessors: {
+ 'test/main.js': [ 'webpack', 'sourcemap' ]
+ },
+
+ webpack: {
+ devtool: 'inline-source-map',
+ module: webpackConfig.module,
+ resolve: webpackConfig.resolve
+ },
+
+ webpackMiddleware: {
+ quiet: true,
+ stats: {
+ colors: true
+ }
+ },
+
+ // reporter options
+ mochaReporter: {
+ colors: {
+ success: 'bgGreen',
+ info: 'cyan',
+ warning: 'bgBlue',
+ error: 'bgRed'
+ }
+ }
+ });
+};
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/package.json b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/package.json
new file mode 100644
index 000000000..f90bfb4df
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/package.json
@@ -0,0 +1,82 @@
+{
+ "name": "es6-babel-react-flux-karma",
+ "version": "1.0.0",
+ "description": "ES6 + TypeScript + Babel + React + Karma: The Secret Recipe",
+ "main": "index.js",
+ "scripts": {
+ "test": "karma start --reporters mocha,junit --single-run --browsers PhantomJS",
+ "serve": "gulp watch-and-serve",
+ "watch": "gulp watch",
+ "build": "gulp build"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/microsoft/typescriptsamples.git"
+ },
+ "keywords": [
+ "React",
+ "Flux",
+ "ES2016",
+ "typescript"
+ ],
+ "author": "John Reilly",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/microsoft/typescriptsamples/issues"
+ },
+ "homepage": "https://github.com/Microsoft/TypeScriptSamples/tree/master/es6-babel-react-flux-karma#readme",
+ "devDependencies": {
+ "@types/fbemitter": "^2.0.32",
+ "@types/flux": "0.0.32",
+ "@types/jasmine": "^2.5.35",
+ "@types/react": "^0.14.41",
+ "@types/react-addons-test-utils": "^0.14.15",
+ "@types/react-bootstrap": "0.0.33",
+ "@types/react-dom": "^0.14.18",
+ "babel": "^6.0.0",
+ "babel-core": "^6.0.0",
+ "babel-loader": "^6.0.0",
+ "babel-preset-es2015": "^6.0.0",
+ "babel-preset-es2016": "^6.16.0",
+ "babel-preset-react": "^6.0.0",
+ "del": "^2.0.2",
+ "eslint": "^2.0.0",
+ "express": "^4.13.3",
+ "glob": "^7.0.0",
+ "gulp": "^3.9.0",
+ "gulp-autoprefixer": "^3.1.0",
+ "gulp-cached": "^1.1.0",
+ "gulp-cssmin": "^0.1.7",
+ "gulp-eslint": "^2.0.0",
+ "gulp-if": "^2.0.0",
+ "gulp-inject": "^3.0.0",
+ "gulp-notify": "^2.2.0",
+ "gulp-sourcemaps": "^1.5.2",
+ "gulp-streamify": "1.0.2",
+ "gulp-uglify": "^1.2.0",
+ "gulp-util": "^3.0.6",
+ "jasmine-core": "^2.3.4",
+ "karma": "^1.2.0",
+ "karma-jasmine": "^1.0.0",
+ "karma-junit-reporter": "^1.0.0",
+ "karma-mocha-reporter": "^2.0.0",
+ "karma-notify-reporter": "^1.0.0",
+ "karma-phantomjs-launcher": "^1.0.0",
+ "karma-sourcemap-loader": "^0.3.6",
+ "karma-webpack": "^2.0.1",
+ "phantomjs-prebuilt": "^2.1.4",
+ "ts-loader": "^2.0.0",
+ "typescript": "^2.1.4",
+ "webpack": "^2.2.0",
+ "webpack-fail-plugin": "^1.0.4",
+ "webpack-notifier": "^1.2.1"
+ },
+ "dependencies": {
+ "babel-polyfill": "^6.0.0",
+ "flux": "^2.0.3",
+ "fbemitter": "^2.0.2",
+ "react": "^15.4.1",
+ "react-addons-test-utils": "^15.4.1",
+ "react-dom": "^15.4.1"
+ }
+}
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/App.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/App.tsx
new file mode 100644
index 000000000..e74cc9538
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/App.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import FBEmitter from "fbemitter";
+
+import GreetingStore from '../stores/GreetingStore';
+import GreetingState from '../types/GreetingState';
+import WhoToGreet from './WhoToGreet';
+import Greeting from './Greeting';
+
+class App extends React.Component<{}, GreetingState> {
+ eventSubscription: FBEmitter.EventSubscription;
+ constructor(props: {}) {
+ super(props);
+ this.state = this.getStateFromStores();
+ }
+ private onChange = () => {
+ this.setState(this.getStateFromStores());
+ }
+
+ public componentWillMount() {
+ this.eventSubscription = GreetingStore.addChangeListener(this.onChange);
+ }
+
+ public componentWillUnmount() {
+ this.eventSubscription.remove();
+ }
+
+ render() {
+ const { greetings, newGreeting } = this.state;
+ return (
+ <div className="container-fluid">
+ <h1>Hello People!</h1>
+
+ <WhoToGreet newGreeting={ newGreeting } />
+
+ { greetings.map((g, index) => <Greeting key={ index } targetOfGreeting={ g } />) }
+ </div>
+ );
+ }
+
+ private getStateFromStores() {
+ return GreetingStore.getState();
+ }
+}
+
+export default App;
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/Greeting.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/Greeting.tsx
new file mode 100644
index 000000000..7150537c7
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/Greeting.tsx
@@ -0,0 +1,37 @@
+import React from 'react';
+
+import * as GreetingActions from '../actions/GreetingActions';
+
+interface Props {
+ key: number;
+ targetOfGreeting: string;
+}
+
+class Greeting extends React.Component<Props, any> {
+ constructor(props: Props) {
+ super(props);
+ }
+
+ static propTypes: React.ValidationMap<Props> = {
+ targetOfGreeting: React.PropTypes.string.isRequired
+ }
+
+ render() {
+ return (
+ <p>
+ Hello { this.props.targetOfGreeting }!
+
+ <button className="btn btn-default btn-danger"
+ onClick={ this._onClick }>
+ Remove
+ </button>
+ </p>
+ );
+ }
+
+ _onClick = (_event: React.MouseEvent<HTMLButtonElement>) => {
+ GreetingActions.removeGreeting(this.props.targetOfGreeting);
+ }
+}
+
+export default Greeting;
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx
new file mode 100644
index 000000000..9f3deda94
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/components/WhoToGreet.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+
+import * as GreetingActions from '../actions/GreetingActions';
+
+interface Props {
+ newGreeting: string;
+}
+
+class WhoToGreet extends React.Component<Props, any> {
+ constructor(props: Props) {
+ super(props);
+ }
+
+ static propTypes: React.ValidationMap<Props> = {
+ newGreeting: React.PropTypes.string.isRequired
+ }
+
+ render() {
+ return (
+ <form role="form">
+ <div className="form-group">
+ <input type="text" className="form-control" placeholder="Who would you like to greet?"
+ value={ this.props.newGreeting }
+ onChange={ this._handleNewGreetingChange } />
+ <button type="submit" className="btn btn-default btn-primary"
+ onClick={ this._onSubmit }
+ disabled={ this._preventSubmission }>
+ Add greeting
+ </button>
+ </div>
+ </form>
+ );
+ }
+
+ get _preventSubmission() {
+ return !this.props.newGreeting;
+ }
+
+ _handleNewGreetingChange = (event: React.FormEvent<HTMLInputElement>) => {
+ const newGreeting = (event.target as HTMLInputElement).value;
+ GreetingActions.newGreetingChanged(newGreeting);
+ }
+
+ _onSubmit = (event: React.FormEvent<HTMLButtonElement>) => {
+ event.preventDefault();
+
+ if (!this._preventSubmission) {
+ GreetingActions.addGreeting(this.props.newGreeting);
+ }
+ }
+}
+
+export default WhoToGreet;
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/index.html b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/index.html
new file mode 100644
index 000000000..a3f53185a
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/index.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <title>TypeScript, Babel, React, Flux, and Karma</title>
+
+ <!-- inject:css -->
+ <!-- endinject -->
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
+ </head>
+ <body>
+ <div id="content"></div>
+ <!-- inject:js -->
+ <!-- endinject -->
+ </body>
+</html>
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/main.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/main.tsx
new file mode 100644
index 000000000..7e957bd47
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/src/main.tsx
@@ -0,0 +1,7 @@
+import 'babel-polyfill';
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+import App from './components/App';
+
+ReactDOM.render(<App />, document.getElementById('content'));
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/App.tests.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/App.tests.tsx
new file mode 100644
index 000000000..aa9612416
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/App.tests.tsx
@@ -0,0 +1,32 @@
+import React from 'react';
+import TestUtils from 'react-addons-test-utils';
+
+import App from '../../src/components/App';
+import WhoToGreet from '../../src/components/WhoToGreet';
+import Greeting from '../../src/components/Greeting';
+import GreetingStore from '../../src/stores/GreetingStore';
+
+describe('App', () => {
+ it('renders expected HTML', () => {
+ const app = render({ greetings: ['James'], newGreeting: 'Benjamin' });
+ expect(app).toEqual(
+ <div className="container-fluid">
+ <h1>Hello People!</h1>
+
+ <WhoToGreet newGreeting={ 'Benjamin' } />
+
+ { [
+ <Greeting key={ 0 } targetOfGreeting="James" />
+ ] }
+ </div>
+ );
+ });
+
+ function render(state: any) {
+ const shallowRenderer = TestUtils.createRenderer();
+ spyOn(GreetingStore, 'getState').and.returnValue(state);
+
+ shallowRenderer.render(<App />);
+ return shallowRenderer.getRenderOutput();
+ }
+});
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx
new file mode 100644
index 000000000..911a6cba2
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/Greeting.tests.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import TestUtils from 'react-addons-test-utils';
+
+import Greeting from '../../src/components/Greeting';
+import * as GreetingActions from '../../src/actions/GreetingActions';
+
+describe('Greeting', () => {
+ let handleSelectionChangeSpy: jasmine.Spy;
+ beforeEach(() => {
+ handleSelectionChangeSpy = jasmine.createSpy('handleSelectionChange');
+ });
+
+ it('given a targetOfGreeting of \'James\' it renders a p containing a greeting and a remove button', () => {
+ const targetOfGreeting = 'James';
+
+ const p = render({ targetOfGreeting });
+ expect(p.type).toBe('p');
+ expect(p.props.children[0]).toBe('Hello ');
+ expect(p.props.children[1]).toBe('James');
+ expect(p.props.children[2]).toBe('!');
+
+ const [ , , , button ] = p.props.children;
+
+ expect(button.type).toBe('button');
+ expect(button.props.className).toBe('btn btn-default btn-danger');
+ expect(button.props.children).toBe('Remove');
+ });
+
+ it('button onClick triggers an removeGreeting action', () => {
+ const targetOfGreeting = 'Benjamin';
+ const p = render({ targetOfGreeting });
+ const [ , , , button ] = p.props.children;
+ spyOn(GreetingActions, 'removeGreeting');
+
+ button.props.onClick();
+
+ expect(GreetingActions.removeGreeting).toHaveBeenCalledWith(targetOfGreeting);
+ });
+
+ function render({ targetOfGreeting }: { targetOfGreeting: string; }) {
+ const shallowRenderer = TestUtils.createRenderer();
+ shallowRenderer.render(<Greeting key={ 0 } targetOfGreeting={ targetOfGreeting } />);
+ return shallowRenderer.getRenderOutput();
+ }
+});
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx
new file mode 100644
index 000000000..01398952e
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/components/WhoToGreet.tests.tsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import TestUtils from 'react-addons-test-utils';
+
+import WhoToGreet from '../../src/components/WhoToGreet';
+import * as GreetingActions from '../../src/actions/GreetingActions';
+
+describe('WhoToGreet', () => {
+ let handleSelectionChangeSpy: jasmine.Spy;
+ beforeEach(() => {
+ handleSelectionChangeSpy = jasmine.createSpy('handleSelectionChange');
+ });
+
+ it('given a newGreeting then it renders a form containing an input containing that text and an add button', () => {
+ const newGreeting = 'James';
+
+ const form = render({ newGreeting });
+ expect(form.type).toBe('form');
+ expect(form.props.role).toBe('form');
+
+ const formGroup = form.props.children;
+ expect(formGroup.type).toBe('div');
+ expect(formGroup.props.className).toBe('form-group');
+
+ const [ input, button ] = formGroup.props.children;
+
+ expect(input.type).toBe('input');
+ expect(input.props.type).toBe('text');
+ expect(input.props.className).toBe('form-control');
+ expect(input.props.placeholder).toBe('Who would you like to greet?');
+ expect(input.props.value).toBe(newGreeting);
+
+ expect(button.type).toBe('button');
+ expect(button.props.type).toBe('submit');
+ expect(button.props.className).toBe('btn btn-default btn-primary');
+ expect(button.props.disabled).toBe(false);
+ expect(button.props.children).toBe('Add greeting');
+ });
+
+ it('input onChange triggers a newGreetingChanged action', () => {
+ const newGreeting = 'Benjamin';
+ const form = render({ newGreeting });
+ const formGroup = form.props.children;
+ const [ input ] = formGroup.props.children;
+ spyOn(GreetingActions, 'newGreetingChanged');
+
+ input.props.onChange({ target: { value: newGreeting }});
+
+ expect(GreetingActions.newGreetingChanged).toHaveBeenCalledWith(newGreeting);
+ });
+
+ it('button onClick triggers an addGreeting action', () => {
+ const newGreeting = 'Benjamin';
+ const form = render({ newGreeting });
+ const formGroup = form.props.children;
+ const [ , button ] = formGroup.props.children;
+ spyOn(GreetingActions, 'addGreeting');
+
+ button.props.onClick({ preventDefault: () => {} });
+
+ expect(GreetingActions.addGreeting).toHaveBeenCalledWith(newGreeting);
+ });
+
+ function render({ newGreeting }: { newGreeting: string }) {
+ const shallowRenderer = TestUtils.createRenderer();
+ shallowRenderer.render(<WhoToGreet newGreeting={ newGreeting } />);
+ return shallowRenderer.getRenderOutput();
+ }
+});
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/main.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/main.js
new file mode 100644
index 000000000..1b332a7c0
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/test/main.js
@@ -0,0 +1,5 @@
+/* eslint-disable */
+import 'babel-polyfill';
+
+const testsContext = require.context('./', true, /\.tests\.ts(x?)$/);
+testsContext.keys().forEach(testsContext); \ No newline at end of file
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/tsconfig.json b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/tsconfig.json
new file mode 100644
index 000000000..c3a732c12
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "allowSyntheticDefaultImports": true,
+ "lib": [
+ "dom",
+ "es2015",
+ "es2016"
+ ],
+ "jsx": "preserve",
+ "target": "es2016",
+ "module": "es2015",
+ "moduleResolution": "node",
+ "noImplicitAny": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "removeComments": false,
+ "preserveConstEnums": true,
+ "sourceMap": true,
+ "skipLibCheck": true
+ }
+} \ No newline at end of file
diff --git a/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/webpack.config.js b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/webpack.config.js
new file mode 100644
index 000000000..60620a83f
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-gulp-react-flux-babel-karma/webpack.config.js
@@ -0,0 +1,64 @@
+'use strict';
+
+var path = require('path');
+
+var babelOptions = {
+ "presets": [
+ "react",
+ [
+ "es2015",
+ {
+ "modules": false
+ }
+ ],
+ "es2016"
+ ]
+};
+
+module.exports = {
+ cache: true,
+ entry: {
+ main: './src/main.tsx',
+ vendor: [
+ 'babel-polyfill',
+ 'fbemitter',
+ 'flux',
+ 'react',
+ 'react-dom'
+ ]
+ },
+ output: {
+ path: path.resolve(__dirname, './dist/scripts'),
+ filename: '[name].js',
+ chunkFilename: '[chunkhash].js'
+ },
+ module: {
+ rules: [{
+ test: /\.ts(x?)$/,
+ exclude: /node_modules/,
+ use: [
+ {
+ loader: 'babel-loader',
+ options: babelOptions
+ },
+ {
+ loader: 'ts-loader'
+ }
+ ]
+ }, {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ use: [
+ {
+ loader: 'babel-loader',
+ options: babelOptions
+ }
+ ]
+ }]
+ },
+ plugins: [
+ ],
+ resolve: {
+ extensions: ['.ts', '.tsx', '.js']
+ },
+};
diff --git a/node_modules/ts-loader/examples/webpack2-react-cdn-simple/index.html b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/index.html
new file mode 100644
index 000000000..09651107e
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/index.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ </head>
+ <body>
+ <div id="wrapper"></div>
+
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.js"></script>
+ <script src="index.js"></script>
+ </body>
+</html>
diff --git a/node_modules/ts-loader/examples/webpack2-react-cdn-simple/package.json b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/package.json
new file mode 100644
index 000000000..33b29639d
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "webpack2-react-cdn-simple",
+ "main": "index.js",
+ "version": "1.0.0",
+ "scripts": {
+ "build": "webpack"
+ },
+ "devDependencies": {
+ "ts-loader": "^2.0.0",
+ "webpack": "^2.2.0"
+ },
+ "dependencies": {
+ "@types/react": "^15.0.4",
+ "@types/react-dom": "^0.14.21"
+ }
+}
diff --git a/node_modules/ts-loader/examples/webpack2-react-cdn-simple/tsconfig.json b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/tsconfig.json
new file mode 100644
index 000000000..b48ecdfb6
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "jsx": "react"
+ }
+}
diff --git a/node_modules/ts-loader/examples/webpack2-react-cdn-simple/webpack.config.js b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/webpack.config.js
new file mode 100644
index 000000000..7abb3171d
--- /dev/null
+++ b/node_modules/ts-loader/examples/webpack2-react-cdn-simple/webpack.config.js
@@ -0,0 +1,24 @@
+'use strict';
+
+module.exports = {
+ entry: './src/index.tsx',
+ output: { filename: 'index.js' },
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ loader: 'ts-loader',
+ options: {
+ transpileOnly: true
+ }
+ }
+ ]
+ },
+ resolve: {
+ extensions: [ '.ts', '.tsx' ]
+ },
+ externals: {
+ 'react': 'React',
+ 'react-dom': 'ReactDOM'
+ }
+};