initial setup
This commit is contained in:
parent
dbfe019e26
commit
4bb729e962
14
.babelrc
Normal file
14
.babelrc
Normal file
@ -0,0 +1,14 @@
|
||||
{
|
||||
"presets": [
|
||||
"es2015",
|
||||
"react"
|
||||
],
|
||||
"plugins": [
|
||||
"transform-flow-strip-types",
|
||||
"transform-class-properties",
|
||||
"transform-object-rest-spread",
|
||||
["transform-builtin-extend", {
|
||||
"globals": ["Error", "Array"]
|
||||
}]
|
||||
]
|
||||
}
|
||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
dist
|
||||
yarn-error.log
|
||||
9
.stylelintrc
Normal file
9
.stylelintrc
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "stylelint-config-standard",
|
||||
"rules": {
|
||||
"selector-pseudo-class-no-unknown": true,
|
||||
"selector-pseudo-element-no-unknown": true,
|
||||
"selector-type-no-unknown": true,
|
||||
"media-feature-name-no-unknown": true
|
||||
}
|
||||
}
|
||||
94
cssConcatenator.js
Normal file
94
cssConcatenator.js
Normal file
@ -0,0 +1,94 @@
|
||||
// inspired by https://github.com/lydell/source-map-concat
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var concat = require('source-map-concat');
|
||||
var glob = require('glob');
|
||||
|
||||
var resolveSourceMapSync = require('source-map-resolve').resolveSourceMapSync;
|
||||
var createDummySourceMap = require('source-map-dummy');
|
||||
|
||||
// console.log(process.argv);
|
||||
|
||||
var sourceWorkingDirectory = null;
|
||||
var sourceFiles = null;
|
||||
var output = null;
|
||||
var sourceMaps = false;
|
||||
|
||||
if (process.argv.length < 4 || process.argv.length > 6) {
|
||||
throw new Error('invalid arguments');
|
||||
}
|
||||
|
||||
process.argv.forEach(function (argument, index) {
|
||||
if (index > 1) {
|
||||
if (index === 2) {
|
||||
sourceWorkingDirectory = argument;
|
||||
} else if (index === 3) {
|
||||
sourceFiles = sourceWorkingDirectory + '/' + argument;
|
||||
} else if (index === 4) {
|
||||
output = sourceWorkingDirectory + '/' + argument;
|
||||
} else if (index === 5) {
|
||||
sourceMaps = argument == 'true'; // intentionally loose ==
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// console.log(sourceWorkingDirectory, sourceFiles, output, sourceMaps);
|
||||
|
||||
glob(sourceFiles, {
|
||||
nodir: true,
|
||||
nosort: true
|
||||
}, function (error, files) {
|
||||
// console.log(error, files);
|
||||
// files is an array of filenames.
|
||||
// If the `nonull` option is set, and nothing
|
||||
// was found, then files is ["**/*.js"]
|
||||
// er is an error object or null.
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
sourceFiles = files.map(function(file) {
|
||||
return {
|
||||
source: file,
|
||||
code: '/** Source: ' + file + ' */\n' + fs.readFileSync(file).toString()
|
||||
}
|
||||
});
|
||||
|
||||
if (sourceMaps) {
|
||||
sourceFiles.forEach(function (file) {
|
||||
var previousMap = resolveSourceMapSync(file.code, file.source, fs.readFileSync);
|
||||
if (previousMap) {
|
||||
file.map = previousMap.map;
|
||||
file.sourcesRelativeTo = previousMap.sourcesRelativeTo;
|
||||
} else {
|
||||
file.map = createDummySourceMap(file.code, {
|
||||
source: file.source,
|
||||
type: 'css'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var concatenated = concat(sourceFiles, {
|
||||
delimiter: '\n',
|
||||
mapPath: sourceMaps ? output + '.map' : null
|
||||
});
|
||||
|
||||
var outputFile = path.basename(output);
|
||||
|
||||
concatenated.prepend('/* Generated by cssConcatenator.js */\n');
|
||||
|
||||
if (sourceMaps) {
|
||||
concatenated.add('\n/*# sourceMappingURL=' + outputFile + '.map*/');
|
||||
}
|
||||
|
||||
var result = concatenated.toStringWithSourceMap({
|
||||
file: outputFile
|
||||
});
|
||||
|
||||
fs.writeFileSync(output, result.code);
|
||||
|
||||
if (sourceMaps) {
|
||||
fs.writeFileSync(output + '.map', result.map.toString());
|
||||
}
|
||||
});
|
||||
3
generatePokemonData.ts
Normal file
3
generatePokemonData.ts
Normal file
@ -0,0 +1,3 @@
|
||||
const gameMaster = require('pokemongo-game-master');
|
||||
|
||||
gameMaster.getVersion('latest', 'json').then(console.log);
|
||||
45
package.json
Normal file
45
package.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"scripts": {
|
||||
"#": "DO NOT ADD '-d' OPTION TO WEBPACK OR ALL SOURCEMAPS WILL BREAK: https://webpack.js.org/api/cli/#shortcuts",
|
||||
"package": "yarn webpack -- --config webpack.config.prod.js --bail --display-used-exports -p",
|
||||
"package-for-test": "yarn webpack -- --config webpack.config.test.js --bail --display-used-exports",
|
||||
"watch": "yarn webpack -- --config webpack.config.js --colors --debug --output-pathinfo --progress --watch",
|
||||
"webpack": "node ./node_modules/webpack/bin/webpack.js --cache=true --display-error-details --profile"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^16.7.18",
|
||||
"@types/react-dom": "^16.0.11",
|
||||
"babel-loader": "^8.0.4",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"css-loader": "^2.1.0",
|
||||
"fs": "^0.0.1-security",
|
||||
"glob": "^7.1.3",
|
||||
"mini-css-extract-plugin": "^0.5.0",
|
||||
"node-sass": "^4.11.0",
|
||||
"path": "^0.12.7",
|
||||
"pokemongo-game-master": "^1.0.4",
|
||||
"sass-loader": "^7.1.0",
|
||||
"source-map-concat": "^1.0.1",
|
||||
"source-map-dummy": "^1.0.0",
|
||||
"source-map-loader": "^0.2.4",
|
||||
"source-map-resolve": "^0.5.2",
|
||||
"style-loader": "^0.23.1",
|
||||
"stylelint": "^9.9.0",
|
||||
"stylelint-config-standard": "^18.2.0",
|
||||
"stylelint-webpack-plugin": "^0.10.5",
|
||||
"ts-loader": "^5.3.2",
|
||||
"tslint": "^5.12.0",
|
||||
"tslint-eslint-rules": "^5.4.0",
|
||||
"tslint-loader": "^3.5.4",
|
||||
"tslint-misc-rules": "^3.5.1",
|
||||
"tslint-react": "^3.6.0",
|
||||
"typescript": "^3.2.2",
|
||||
"webpack": "^4.28.3",
|
||||
"webpack-cli": "^3.1.2",
|
||||
"webpack-shell-plugin": "^0.5.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "^16.7.0",
|
||||
"react-dom": "^16.7.0"
|
||||
}
|
||||
}
|
||||
3
src/scss/index.scss
Normal file
3
src/scss/index.scss
Normal file
@ -0,0 +1,3 @@
|
||||
body {
|
||||
background: red;
|
||||
}
|
||||
9
src/ts/index.tsx
Normal file
9
src/ts/index.tsx
Normal file
@ -0,0 +1,9 @@
|
||||
import * as React from 'react';
|
||||
import * as ReactDOM from 'react-dom';
|
||||
|
||||
import 'styles/index.scss';
|
||||
|
||||
ReactDOM.render(
|
||||
<h1>Hello Mons</h1>,
|
||||
document.body
|
||||
);
|
||||
26
tsconfig.json
Normal file
26
tsconfig.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"noUnusedLocals": false,
|
||||
"allowJs": true,
|
||||
"outDir": "./dist",
|
||||
"sourceMap": true,
|
||||
"module": "commonjs",
|
||||
"target": "es6",
|
||||
"jsx": "react",
|
||||
"baseUrl": ".",
|
||||
"traceResolution": false,
|
||||
"paths": {},
|
||||
"plugins": [{
|
||||
"name": "tslint-language-service",
|
||||
"disableNoUnusedVariableRule": false
|
||||
}]
|
||||
},
|
||||
"include": [
|
||||
"./src"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
]
|
||||
}
|
||||
53
tslint.json
Normal file
53
tslint.json
Normal file
@ -0,0 +1,53 @@
|
||||
{
|
||||
"extends": ["tslint:latest", "tslint-react", "tslint-eslint-rules"],
|
||||
"rules": {
|
||||
"no-default-export": true,
|
||||
"no-unused-expression": true,
|
||||
"no-unused-variable": [true, "react"],
|
||||
"no-submodule-imports": false,
|
||||
"space-before-function-paren": [true, {"anonymous": "always"}],
|
||||
"trailing-comma": false,
|
||||
"max-line-length": [true, 240],
|
||||
"no-namespace": false,
|
||||
"no-empty-interface": false,
|
||||
"jsx-curly-spacing": [true, "always"],
|
||||
"jsx-no-multiline-js": false,
|
||||
"quotemark": [true, "single", "jsx-double"],
|
||||
"object-literal-key-quotes": [true, "as-needed"],
|
||||
"object-literal-sort-keys" : false,
|
||||
"array-type": [true, "generic"],
|
||||
"prefer-for-of": false,
|
||||
"typedef-whitespace": [
|
||||
true, {
|
||||
"call-signature": "onespace",
|
||||
"index-signature": "onespace",
|
||||
"parameter": "onespace",
|
||||
"property-declaration": "onespace",
|
||||
"variable-declaration": "onespace"
|
||||
}, {
|
||||
"call-signature": "onespace",
|
||||
"index-signature": "onespace",
|
||||
"parameter": "onespace",
|
||||
"property-declaration": "onespace",
|
||||
"variable-declaration": "onespace"
|
||||
}
|
||||
],
|
||||
"prefer-conditional-expression": false,
|
||||
|
||||
"jsx-attribute-spacing": true,
|
||||
"jsx-expression-spacing": true,
|
||||
"jsx-no-braces-for-string-attributes": true,
|
||||
"no-braces-for-single-line-arrow-functions": true,
|
||||
|
||||
"object-curly-spacing": [true, "always"]
|
||||
},
|
||||
"defaultSeverity": "warning",
|
||||
"rulesDirectory": [
|
||||
"./node_modules/tslint-misc-rules/rules"
|
||||
],
|
||||
"linterOptions": {
|
||||
"exclude": [
|
||||
"./src/**/*.spec.*"
|
||||
]
|
||||
}
|
||||
}
|
||||
148
webpack.config.js
Normal file
148
webpack.config.js
Normal file
@ -0,0 +1,148 @@
|
||||
const path = require('path');
|
||||
const options = require('./webpack.config.options');
|
||||
const StyleLintPlugin = require('stylelint-webpack-plugin');
|
||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||
|
||||
const typescriptResolve = {
|
||||
alias: {
|
||||
'moment$': path.resolve('./node_modules/moment/min/moment-with-locales.min.js'),
|
||||
'moment-timezone$': path.resolve('./node_modules/moment-timezone/builds/moment-timezone-with-data-2012-2022.min.js'),
|
||||
|
||||
'styles': path.resolve('./src/scss'),
|
||||
},
|
||||
extensions: ['.ts', '.tsx', '.js'],
|
||||
};
|
||||
|
||||
module.exports = function (env, tsLoaderHappyPackMode) {
|
||||
env = env || {};
|
||||
tsLoaderHappyPackMode = (typeof tsLoaderHappyPackMode === 'undefined') ? true : tsLoaderHappyPackMode;
|
||||
|
||||
console.log('Webpack Environment:', env, 'tsLoaderHappyPackMode:', !!tsLoaderHappyPackMode);
|
||||
|
||||
const plugins = [
|
||||
new StyleLintPlugin({
|
||||
configFile: '.stylelintrc',
|
||||
context: 'src',
|
||||
emitErrors: true,
|
||||
failOnError: false,
|
||||
quiet: false,
|
||||
}),
|
||||
].concat(options.getPlugins(env));
|
||||
|
||||
return {
|
||||
entry: {
|
||||
'dist/global': [
|
||||
'babel-polyfill', // this is intended to be on every single page, legacy or new!
|
||||
'./src/scss/index.scss' // these are the global styles that should never be imported by a component
|
||||
],
|
||||
|
||||
'dist/main': './src/ts/index.tsx',
|
||||
},
|
||||
optimization: options.getOptimizations(),
|
||||
output: {
|
||||
path: path.resolve(options.outputDirectory),
|
||||
filename: '[name]-bundle.js',
|
||||
// filename: '[name]-bundle.[chunkhash].js',
|
||||
sourceMapFilename: '[file].map'
|
||||
},
|
||||
resolve: typescriptResolve,
|
||||
devtool: 'source-map',
|
||||
plugins: plugins,
|
||||
module: {
|
||||
rules: [
|
||||
// All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
|
||||
{
|
||||
test: /\.js$/,
|
||||
enforce: 'pre',
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{ loader: 'source-map-loader' }
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
enforce: 'pre',
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{ loader: 'source-map-loader' },
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
enforce: 'pre',
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{
|
||||
loader: 'tslint-loader',
|
||||
options: {
|
||||
emitErrors: !env.WARN_ON_LINT,
|
||||
failOnHint: !env.WARN_ON_LINT,
|
||||
typeCheck: false,
|
||||
}
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.jsx?$/,
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{ loader: 'babel-loader' }
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{ loader: 'babel-loader' },
|
||||
{
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
silent: true,
|
||||
happyPackMode: tsLoaderHappyPackMode, // setting as true also implies transpileOnly: true,
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.scss$/,
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{
|
||||
loader: MiniCssExtractPlugin.loader,
|
||||
options: {
|
||||
// you can specify a publicPath here
|
||||
// by default it use publicPath in webpackOptions.output
|
||||
// publicPath: '../'
|
||||
}
|
||||
},
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
sourceMap: !!env.CSS_SOURCEMAPS
|
||||
}
|
||||
},
|
||||
{
|
||||
loader: 'sass-loader',
|
||||
options: {
|
||||
sourceMap: !!env.CSS_SOURCEMAPS
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
exclude: /node_modules/,
|
||||
use: [
|
||||
{ loader: 'style-loader' },
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
sourceMap: !!env.CSS_SOURCEMAPS
|
||||
}
|
||||
}
|
||||
],
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
69
webpack.config.options.js
Normal file
69
webpack.config.options.js
Normal file
@ -0,0 +1,69 @@
|
||||
const webpack = require('webpack');
|
||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||
const WebpackShellPlugin = require('webpack-shell-plugin');
|
||||
|
||||
const outputDirectory = './dist';
|
||||
module.exports.outputDirectory = outputDirectory;
|
||||
|
||||
module.exports.getOptimizations = function () {
|
||||
return {
|
||||
splitChunks: {
|
||||
cacheGroups: {
|
||||
commons: {
|
||||
name: 'commons',
|
||||
filename: 'js/commons-bundle.js',
|
||||
chunks: 'initial',
|
||||
// (the filename of the commons chunk)
|
||||
minChunks: 2,
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
// new webpack.optimize.CommonsChunkPlugin({
|
||||
// name: 'vendor',
|
||||
// filename: 'vendor-bundle.js',
|
||||
// minChunks: function (module) {
|
||||
// return (module.context || '').indexOf('node_modules') !== -1;
|
||||
// }
|
||||
// }),
|
||||
// new webpack.optimize.CommonsChunkPlugin({
|
||||
// // (the commons chunk name)
|
||||
// name: 'commons',
|
||||
// // (the filename of the commons chunk)
|
||||
// filename: 'js/commons-bundle.js',
|
||||
// minChunks: function(module, count) {
|
||||
// // (Modules must be shared between 2 entries or be included by the globally-exposed-dependencies-bundle)
|
||||
// return /*(module.context || '').indexOf('node_modules') === -1 && */count >= 2;
|
||||
// },
|
||||
// }),
|
||||
};
|
||||
|
||||
module.exports.getPlugins = function (env) {
|
||||
env = env || {};
|
||||
return [
|
||||
new webpack.IgnorePlugin(/^\.\/locale$/, /moment\/min$/),
|
||||
new webpack.optimize.ModuleConcatenationPlugin(), // --display-optimization-bailout
|
||||
new MiniCssExtractPlugin({
|
||||
// Options similar to the same options in webpackOptions.output
|
||||
// both options are optional
|
||||
filename: '[name].css',
|
||||
// filename: (getPath) => {
|
||||
// // output the css into the css directory instead of the js directory (where the bundles are)
|
||||
// return 'css/' + getPath('[name].tmp.css').replace(/^js\//, '');
|
||||
// },
|
||||
// chunkFilename: "[id].css"
|
||||
}),
|
||||
new WebpackShellPlugin({
|
||||
dev: false,
|
||||
onBuildEnd:[
|
||||
'echo "Starting CSS Merging"',
|
||||
'node cssConcatenator.js ' + outputDirectory + '/css global.tmp.css global.css ' + !!env.CSS_SOURCEMAPS,
|
||||
'node cssConcatenator.js ' + outputDirectory + '/css !(global).tmp.css app.css ' + !!env.CSS_SOURCEMAPS,
|
||||
'node cssConcatenator.js ' + outputDirectory + '/css {commons,public/public-site}.tmp.css public/public.css ' + !!env.CSS_SOURCEMAPS,
|
||||
'node cssConcatenator.js ' + outputDirectory + '/css {global,commons,public/drink-price-tool}.tmp.css public/drink-price-tool.css ' + !!env.CSS_SOURCEMAPS,
|
||||
'node cssConcatenator.js ' + outputDirectory + '/css {global,public/bar-profit-tool}.tmp.css public/bar-profit-tool.css ' + !!env.CSS_SOURCEMAPS,
|
||||
'node cssConcatenator.js ' + outputDirectory + '/css public/start-free-trial.tmp.css public/start-free-trial.css ' + !!env.CSS_SOURCEMAPS
|
||||
]
|
||||
})
|
||||
];
|
||||
};
|
||||
44
webpack.config.prod.js
Normal file
44
webpack.config.prod.js
Normal file
@ -0,0 +1,44 @@
|
||||
const webpack = require('webpack');
|
||||
const config = require('./webpack.config');
|
||||
const options = require('./webpack.config.options');
|
||||
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
|
||||
const StyleLintPlugin = require('stylelint-webpack-plugin');
|
||||
|
||||
module.exports = function(env) {
|
||||
var generatedConfig = config(env, false);
|
||||
|
||||
generatedConfig.plugins = [
|
||||
new webpack.LoaderOptionsPlugin({
|
||||
minimize: true
|
||||
}),
|
||||
new StyleLintPlugin({
|
||||
configFile: '.stylelintrc',
|
||||
context: 'src',
|
||||
emitErrors: true,
|
||||
failOnError: true,
|
||||
quiet: false,
|
||||
}),
|
||||
|
||||
// Lesman 10/03/2017
|
||||
// This plugin enforces case sensitive paths in order
|
||||
// to give build consistency across systems (OsX is not case sensitive)
|
||||
// however the plugin is relatively slow (adds ~20 seconds to the build)
|
||||
// and our jenkins system is already case-sensitive so it's not critical
|
||||
// The plugin does provide better error message though, so we may want to
|
||||
// re-enable it if case-sensitivity build problems are an issue
|
||||
|
||||
// new CaseSensitivePathsPlugin({debug: true}),
|
||||
|
||||
new webpack.optimize.UglifyJsPlugin({
|
||||
// compress: {
|
||||
// warnings: true
|
||||
// },
|
||||
sourceMap: true
|
||||
}),
|
||||
new webpack.DefinePlugin({
|
||||
'process.env.NODE_ENV' : JSON.stringify('production')
|
||||
}),
|
||||
].concat(options.getPlugins(env || {}));
|
||||
|
||||
return generatedConfig;
|
||||
}
|
||||
42
webpack.config.test.js
Normal file
42
webpack.config.test.js
Normal file
@ -0,0 +1,42 @@
|
||||
const config = require('./webpack.config');
|
||||
const options = require('./webpack.config.options');
|
||||
const StyleLintPlugin = require('stylelint-webpack-plugin');
|
||||
|
||||
module.exports = function(env) {
|
||||
const generatedConfig = config(env, false);
|
||||
delete generatedConfig.devtool;
|
||||
|
||||
generatedConfig.plugins = [
|
||||
new StyleLintPlugin({
|
||||
configFile: '.stylelintrc',
|
||||
context: 'src',
|
||||
emitErrors: true,
|
||||
failOnError: true,
|
||||
quiet: false,
|
||||
}),
|
||||
].concat(options.getPlugins(env || {}));
|
||||
|
||||
return generatedConfig;
|
||||
|
||||
// Lesman 9/29/2017
|
||||
// I thought this might make stuff faster?
|
||||
// but it doesn't seem to
|
||||
|
||||
// var rules = generatedConfig.module.rules;
|
||||
// for (var i = 0; i < rules.length; i++) {
|
||||
// var use = rules[i].use;
|
||||
// for (var j = 0; j < use.length; j++) {
|
||||
// var loader = use[j];
|
||||
// if (loader === 'source-map-loader') {
|
||||
// use.splice(j);
|
||||
// j--;
|
||||
// continue;
|
||||
// }
|
||||
// if (loader.options !== undefined) {
|
||||
// if (loader.options.sourceMap !== undefined) {
|
||||
// loader.options.sourcemap = false;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user