mirror of
				https://github.com/simon987/simon987.net.git
				synced 2025-10-30 15:06:52 +00:00 
			
		
		
		
	Initial commit
This commit is contained in:
		
						commit
						0f631baeee
					
				
							
								
								
									
										14
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| .DS_Store | ||||
| node_modules/ | ||||
| /dist/ | ||||
| npm-debug.log* | ||||
| yarn-debug.log* | ||||
| yarn-error.log* | ||||
| 
 | ||||
| # Editor directories and files | ||||
| .idea | ||||
| .vscode | ||||
| *.suo | ||||
| *.ntvs* | ||||
| *.njsproj | ||||
| *.sln | ||||
							
								
								
									
										22
									
								
								simon987/.babelrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								simon987/.babelrc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| { | ||||
|     "presets": [ | ||||
|         [ | ||||
|             "env", | ||||
|             { | ||||
|                 "modules": false, | ||||
|                 "targets": { | ||||
|                     "browsers": [ | ||||
|                         "> 1%", | ||||
|                         "last 2 versions", | ||||
|                         "not ie <= 8" | ||||
|                     ] | ||||
|                 } | ||||
|             } | ||||
|         ], | ||||
|         "stage-2" | ||||
|     ], | ||||
|     "plugins": [ | ||||
|         "transform-vue-jsx", | ||||
|         "transform-runtime" | ||||
|     ] | ||||
| } | ||||
							
								
								
									
										9
									
								
								simon987/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								simon987/.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| root = true | ||||
| 
 | ||||
| [*] | ||||
| charset = utf-8 | ||||
| indent_style = space | ||||
| indent_size = 4 | ||||
| end_of_line = lf | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
							
								
								
									
										10
									
								
								simon987/.postcssrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								simon987/.postcssrc.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| // https://github.com/michael-ciniawsky/postcss-load-config
 | ||||
| 
 | ||||
| module.exports = { | ||||
|   "plugins": { | ||||
|     "postcss-import": {}, | ||||
|     "postcss-url": {}, | ||||
|     // to edit target browsers: use "browserslist" field in package.json
 | ||||
|     "autoprefixer": {} | ||||
|   } | ||||
| } | ||||
							
								
								
									
										41
									
								
								simon987/build/build.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								simon987/build/build.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| 'use strict' | ||||
| require('./check-versions')() | ||||
| 
 | ||||
| process.env.NODE_ENV = 'production'; | ||||
| 
 | ||||
| const ora = require('ora'); | ||||
| const rm = require('rimraf'); | ||||
| const path = require('path'); | ||||
| const chalk = require('chalk'); | ||||
| const webpack = require('webpack'); | ||||
| const config = require('../config'); | ||||
| const webpackConfig = require('./webpack.prod.conf'); | ||||
| 
 | ||||
| const spinner = ora('building for production...'); | ||||
| spinner.start(); | ||||
| 
 | ||||
| rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { | ||||
|     if (err) throw err; | ||||
|     webpack(webpackConfig, (err, stats) => { | ||||
|         spinner.stop(); | ||||
|         if (err) throw err; | ||||
|         process.stdout.write(stats.toString({ | ||||
|             colors: true, | ||||
|             modules: false, | ||||
|             children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
 | ||||
|             chunks: false, | ||||
|             chunkModules: false | ||||
|         }) + '\n\n'); | ||||
| 
 | ||||
|         if (stats.hasErrors()) { | ||||
|             console.log(chalk.red('  Build failed with errors.\n')); | ||||
|             process.exit(1) | ||||
|         } | ||||
| 
 | ||||
|         console.log(chalk.cyan('  Build complete.\n')); | ||||
|         console.log(chalk.yellow( | ||||
|             '  Tip: built files are meant to be served over an HTTP server.\n' + | ||||
|             '  Opening index.html over file:// won\'t work.\n' | ||||
|         )) | ||||
|     }) | ||||
| }); | ||||
							
								
								
									
										54
									
								
								simon987/build/check-versions.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								simon987/build/check-versions.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| 'use strict'; | ||||
| const chalk = require('chalk'); | ||||
| const semver = require('semver'); | ||||
| const packageConfig = require('../package.json'); | ||||
| const shell = require('shelljs'); | ||||
| 
 | ||||
| function exec(cmd) { | ||||
|     return require('child_process').execSync(cmd).toString().trim() | ||||
| } | ||||
| 
 | ||||
| const versionRequirements = [ | ||||
|     { | ||||
|         name: 'node', | ||||
|         currentVersion: semver.clean(process.version), | ||||
|         versionRequirement: packageConfig.engines.node | ||||
|     } | ||||
| ]; | ||||
| 
 | ||||
| if (shell.which('npm')) { | ||||
|     versionRequirements.push({ | ||||
|         name: 'npm', | ||||
|         currentVersion: exec('npm --version'), | ||||
|         versionRequirement: packageConfig.engines.npm | ||||
|     }) | ||||
| } | ||||
| 
 | ||||
| module.exports = function () { | ||||
|     const warnings = []; | ||||
| 
 | ||||
|     for (let i = 0; i < versionRequirements.length; i++) { | ||||
|         const mod = versionRequirements[i]; | ||||
| 
 | ||||
|         if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { | ||||
|             warnings.push(mod.name + ': ' + | ||||
|                 chalk.red(mod.currentVersion) + ' should be ' + | ||||
|                 chalk.green(mod.versionRequirement) | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if (warnings.length) { | ||||
|         console.log(''); | ||||
|         console.log(chalk.yellow('To use this template, you must update following to modules:')); | ||||
|         console.log(); | ||||
| 
 | ||||
|         for (let i = 0; i < warnings.length; i++) { | ||||
|             const warning = warnings[i]; | ||||
|             console.log('  ' + warning) | ||||
|         } | ||||
| 
 | ||||
|         console.log(); | ||||
|         process.exit(1) | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										
											BIN
										
									
								
								simon987/build/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								simon987/build/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 6.7 KiB | 
							
								
								
									
										101
									
								
								simon987/build/utils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								simon987/build/utils.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | ||||
| 'use strict'; | ||||
| const path = require('path'); | ||||
| const config = require('../config'); | ||||
| const ExtractTextPlugin = require('extract-text-webpack-plugin'); | ||||
| const packageConfig = require('../package.json'); | ||||
| 
 | ||||
| exports.assetsPath = function (_path) { | ||||
|     const assetsSubDirectory = process.env.NODE_ENV === 'production' | ||||
|         ? config.build.assetsSubDirectory | ||||
|         : config.dev.assetsSubDirectory; | ||||
| 
 | ||||
|     return path.posix.join(assetsSubDirectory, _path) | ||||
| }; | ||||
| 
 | ||||
| exports.cssLoaders = function (options) { | ||||
|     options = options || {}; | ||||
| 
 | ||||
|     const cssLoader = { | ||||
|         loader: 'css-loader', | ||||
|         options: { | ||||
|             sourceMap: options.sourceMap | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     const postcssLoader = { | ||||
|         loader: 'postcss-loader', | ||||
|         options: { | ||||
|             sourceMap: options.sourceMap | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     // generate loader string to be used with extract text plugin
 | ||||
|     function generateLoaders(loader, loaderOptions) { | ||||
|         const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]; | ||||
| 
 | ||||
|         if (loader) { | ||||
|             loaders.push({ | ||||
|                 loader: loader + '-loader', | ||||
|                 options: Object.assign({}, loaderOptions, { | ||||
|                     sourceMap: options.sourceMap | ||||
|                 }) | ||||
|             }) | ||||
|         } | ||||
| 
 | ||||
|         // Extract CSS when that option is specified
 | ||||
|         // (which is the case during production build)
 | ||||
|         if (options.extract) { | ||||
|             return ExtractTextPlugin.extract({ | ||||
|                 use: loaders, | ||||
|                 fallback: 'vue-style-loader' | ||||
|             }) | ||||
|         } else { | ||||
|             return ['vue-style-loader'].concat(loaders) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // https://vue-loader.vuejs.org/en/configurations/extract-css.html
 | ||||
|     return { | ||||
|         css: generateLoaders(), | ||||
|         postcss: generateLoaders(), | ||||
|         less: generateLoaders('less'), | ||||
|         sass: generateLoaders('sass', {indentedSyntax: true}), | ||||
|         scss: generateLoaders('sass'), | ||||
|         stylus: generateLoaders('stylus'), | ||||
|         styl: generateLoaders('stylus') | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| // Generate loaders for standalone style files (outside of .vue)
 | ||||
| exports.styleLoaders = function (options) { | ||||
|     const output = []; | ||||
|     const loaders = exports.cssLoaders(options); | ||||
| 
 | ||||
|     for (const extension in loaders) { | ||||
|         const loader = loaders[extension]; | ||||
|         output.push({ | ||||
|             test: new RegExp('\\.' + extension + '$'), | ||||
|             use: loader | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     return output | ||||
| }; | ||||
| 
 | ||||
| exports.createNotifierCallback = () => { | ||||
|     const notifier = require('node-notifier'); | ||||
| 
 | ||||
|     return (severity, errors) => { | ||||
|         if (severity !== 'error') return; | ||||
| 
 | ||||
|         const error = errors[0]; | ||||
|         const filename = error.file && error.file.split('!').pop() | ||||
| 
 | ||||
|         notifier.notify({ | ||||
|             title: packageConfig.name, | ||||
|             message: severity + ': ' + error.name, | ||||
|             subtitle: filename || '', | ||||
|             icon: path.join(__dirname, 'logo.png') | ||||
|         }) | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										22
									
								
								simon987/build/vue-loader.conf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								simon987/build/vue-loader.conf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| 'use strict'; | ||||
| const utils = require('./utils'); | ||||
| const config = require('../config'); | ||||
| const isProduction = process.env.NODE_ENV === 'production'; | ||||
| const sourceMapEnabled = isProduction | ||||
|     ? config.build.productionSourceMap | ||||
|     : config.dev.cssSourceMap; | ||||
| 
 | ||||
| module.exports = { | ||||
|     loaders: utils.cssLoaders({ | ||||
|         sourceMap: sourceMapEnabled, | ||||
|         extract: isProduction | ||||
|     }), | ||||
|     cssSourceMap: sourceMapEnabled, | ||||
|     cacheBusting: config.dev.cacheBusting, | ||||
|     transformToRequire: { | ||||
|         video: ['src', 'poster'], | ||||
|         source: 'src', | ||||
|         img: 'src', | ||||
|         image: 'xlink:href' | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										80
									
								
								simon987/build/webpack.base.conf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								simon987/build/webpack.base.conf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,80 @@ | ||||
| 'use strict'; | ||||
| const path = require('path'); | ||||
| const utils = require('./utils'); | ||||
| const config = require('../config'); | ||||
| const vueLoaderConfig = require('./vue-loader.conf'); | ||||
| 
 | ||||
| function resolve(dir) { | ||||
|     return path.join(__dirname, '..', dir) | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| module.exports = { | ||||
|     context: path.resolve(__dirname, '../'), | ||||
|     entry: { | ||||
|         app: './src/main.js' | ||||
|     }, | ||||
|     output: { | ||||
|         path: config.build.assetsRoot, | ||||
|         filename: '[name].js', | ||||
|         publicPath: process.env.NODE_ENV === 'production' | ||||
|             ? config.build.assetsPublicPath | ||||
|             : config.dev.assetsPublicPath | ||||
|     }, | ||||
|     resolve: { | ||||
|         extensions: ['.js', '.vue', '.json'], | ||||
|         alias: { | ||||
|             '@': resolve('src'), | ||||
|         } | ||||
|     }, | ||||
|     module: { | ||||
|         rules: [ | ||||
|             { | ||||
|                 test: /\.vue$/, | ||||
|                 loader: 'vue-loader', | ||||
|                 options: vueLoaderConfig | ||||
|             }, | ||||
|             { | ||||
|                 test: /\.js$/, | ||||
|                 loader: 'babel-loader', | ||||
|                 include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] | ||||
|             }, | ||||
|             { | ||||
|                 test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, | ||||
|                 loader: 'url-loader', | ||||
|                 options: { | ||||
|                     limit: 10000, | ||||
|                     name: utils.assetsPath('img/[name].[hash:7].[ext]') | ||||
|                 } | ||||
|             }, | ||||
|             { | ||||
|                 test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, | ||||
|                 loader: 'url-loader', | ||||
|                 options: { | ||||
|                     limit: 10000, | ||||
|                     name: utils.assetsPath('media/[name].[hash:7].[ext]') | ||||
|                 } | ||||
|             }, | ||||
|             { | ||||
|                 test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, | ||||
|                 loader: 'url-loader', | ||||
|                 options: { | ||||
|                     limit: 10000, | ||||
|                     name: utils.assetsPath('fonts/[name].[hash:7].[ext]') | ||||
|                 } | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
|     node: { | ||||
|         // prevent webpack from injecting useless setImmediate polyfill because Vue
 | ||||
|         // source contains it (although only uses it if it's native).
 | ||||
|         setImmediate: false, | ||||
|         // prevent webpack from injecting mocks to Node native modules
 | ||||
|         // that does not make sense for the client
 | ||||
|         dgram: 'empty', | ||||
|         fs: 'empty', | ||||
|         net: 'empty', | ||||
|         tls: 'empty', | ||||
|         child_process: 'empty' | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										95
									
								
								simon987/build/webpack.dev.conf.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										95
									
								
								simon987/build/webpack.dev.conf.js
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,95 @@ | ||||
| 'use strict' | ||||
| const utils = require('./utils') | ||||
| const webpack = require('webpack') | ||||
| const config = require('../config') | ||||
| const merge = require('webpack-merge') | ||||
| const path = require('path') | ||||
| const baseWebpackConfig = require('./webpack.base.conf') | ||||
| const CopyWebpackPlugin = require('copy-webpack-plugin') | ||||
| const HtmlWebpackPlugin = require('html-webpack-plugin') | ||||
| const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') | ||||
| const portfinder = require('portfinder') | ||||
| 
 | ||||
| const HOST = process.env.HOST | ||||
| const PORT = process.env.PORT && Number(process.env.PORT) | ||||
| 
 | ||||
| const devWebpackConfig = merge(baseWebpackConfig, { | ||||
|   module: { | ||||
|     rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) | ||||
|   }, | ||||
|   // cheap-module-eval-source-map is faster for development
 | ||||
|   devtool: config.dev.devtool, | ||||
| 
 | ||||
|   // these devServer options should be customized in /config/index.js
 | ||||
|   devServer: { | ||||
|     clientLogLevel: 'warning', | ||||
|     historyApiFallback: { | ||||
|       rewrites: [ | ||||
|         { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, | ||||
|       ], | ||||
|     }, | ||||
|     hot: true, | ||||
|     contentBase: false, // since we use CopyWebpackPlugin.
 | ||||
|     compress: true, | ||||
|     host: HOST || config.dev.host, | ||||
|     port: PORT || config.dev.port, | ||||
|     open: config.dev.autoOpenBrowser, | ||||
|     overlay: config.dev.errorOverlay | ||||
|       ? { warnings: false, errors: true } | ||||
|       : false, | ||||
|     publicPath: config.dev.assetsPublicPath, | ||||
|     proxy: config.dev.proxyTable, | ||||
|     quiet: true, // necessary for FriendlyErrorsPlugin
 | ||||
|     watchOptions: { | ||||
|       poll: config.dev.poll, | ||||
|     } | ||||
|   }, | ||||
|   plugins: [ | ||||
|     new webpack.DefinePlugin({ | ||||
|       'process.env': require('../config/dev.env') | ||||
|     }), | ||||
|     new webpack.HotModuleReplacementPlugin(), | ||||
|     new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
 | ||||
|     new webpack.NoEmitOnErrorsPlugin(), | ||||
|     // https://github.com/ampedandwired/html-webpack-plugin
 | ||||
|     new HtmlWebpackPlugin({ | ||||
|       filename: 'index.html', | ||||
|       template: 'index.html', | ||||
|       inject: true | ||||
|     }), | ||||
|     // copy custom static assets
 | ||||
|     new CopyWebpackPlugin([ | ||||
|       { | ||||
|         from: path.resolve(__dirname, '../static'), | ||||
|         to: config.dev.assetsSubDirectory, | ||||
|         ignore: ['.*'] | ||||
|       } | ||||
|     ]) | ||||
|   ] | ||||
| }) | ||||
| 
 | ||||
| module.exports = new Promise((resolve, reject) => { | ||||
|   portfinder.basePort = process.env.PORT || config.dev.port | ||||
|   portfinder.getPort((err, port) => { | ||||
|     if (err) { | ||||
|       reject(err) | ||||
|     } else { | ||||
|       // publish the new Port, necessary for e2e tests
 | ||||
|       process.env.PORT = port | ||||
|       // add port to devServer config
 | ||||
|       devWebpackConfig.devServer.port = port | ||||
| 
 | ||||
|       // Add FriendlyErrorsPlugin
 | ||||
|       devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ | ||||
|         compilationSuccessInfo: { | ||||
|           messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], | ||||
|         }, | ||||
|         onErrors: config.dev.notifyOnErrors | ||||
|         ? utils.createNotifierCallback() | ||||
|         : undefined | ||||
|       })) | ||||
| 
 | ||||
|       resolve(devWebpackConfig) | ||||
|     } | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										155
									
								
								simon987/build/webpack.prod.conf.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								simon987/build/webpack.prod.conf.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,155 @@ | ||||
| 'use strict'; | ||||
| const path = require('path'); | ||||
| const utils = require('./utils'); | ||||
| const webpack = require('webpack'); | ||||
| const config = require('../config'); | ||||
| const merge = require('webpack-merge'); | ||||
| const baseWebpackConfig = require('./webpack.base.conf'); | ||||
| const CopyWebpackPlugin = require('copy-webpack-plugin'); | ||||
| const HtmlWebpackPlugin = require('html-webpack-plugin'); | ||||
| const ExtractTextPlugin = require('extract-text-webpack-plugin'); | ||||
| const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin'); | ||||
| const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); | ||||
| 
 | ||||
| const env = require('../config/prod.env'); | ||||
| 
 | ||||
| const webpackConfig = merge(baseWebpackConfig, { | ||||
|     module: { | ||||
|         rules: utils.styleLoaders({ | ||||
|             sourceMap: config.build.productionSourceMap, | ||||
|             extract: true, | ||||
|             usePostCSS: true | ||||
|         }) | ||||
|     }, | ||||
|     devtool: config.build.productionSourceMap ? config.build.devtool : false, | ||||
|     output: { | ||||
|         path: config.build.assetsRoot, | ||||
|         filename: utils.assetsPath('js/[name].[chunkhash].js'), | ||||
|         chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') | ||||
|     }, | ||||
|     plugins: [ | ||||
|         // http://vuejs.github.io/vue-loader/en/workflow/production.html
 | ||||
|         new webpack.DefinePlugin({ | ||||
|             'process.env': env | ||||
|         }), | ||||
|         new UglifyJsPlugin({ | ||||
|             uglifyOptions: { | ||||
|                 comments: false, | ||||
|                 compress: { | ||||
|                     unused: true, | ||||
|                     dead_code: true, | ||||
|                     drop_debugger: true, | ||||
|                     conditionals: true, | ||||
|                     evaluate: true, | ||||
|                     drop_console: true, | ||||
|                     sequences: true, | ||||
|                     booleans: true, | ||||
|                     warnings: false | ||||
|                 }, | ||||
|                 output: {comments: false} | ||||
|             }, | ||||
|             sourceMap: config.build.productionSourceMap, | ||||
|             parallel: true | ||||
|         }), | ||||
|         // extract css into its own file
 | ||||
|         new ExtractTextPlugin({ | ||||
|             filename: utils.assetsPath('css/[name].[contenthash].css'), | ||||
|             // Setting the following option to `false` will not extract CSS from codesplit chunks.
 | ||||
|             // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
 | ||||
|             // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
 | ||||
|             // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
 | ||||
|             allChunks: true, | ||||
|         }), | ||||
|         // Compress extracted CSS. We are using this plugin so that possible
 | ||||
|         // duplicated CSS from different components can be deduped.
 | ||||
|         new OptimizeCSSPlugin({ | ||||
|             cssProcessorOptions: config.build.productionSourceMap | ||||
|                 ? {safe: true, map: {inline: false}} | ||||
|                 : {safe: true} | ||||
|         }), | ||||
|         // generate dist index.html with correct asset hash for caching.
 | ||||
|         // you can customize output by editing /index.html
 | ||||
|         // see https://github.com/ampedandwired/html-webpack-plugin
 | ||||
|         new HtmlWebpackPlugin({ | ||||
|             filename: config.build.index, | ||||
|             template: 'index.html', | ||||
|             inject: true, | ||||
|             minify: { | ||||
|                 removeComments: true, | ||||
|                 collapseWhitespace: true, | ||||
|                 removeAttributeQuotes: true | ||||
|                 // more options:
 | ||||
|                 // https://github.com/kangax/html-minifier#options-quick-reference
 | ||||
|             }, | ||||
|             // necessary to consistently work with multiple chunks via CommonsChunkPlugin
 | ||||
|             chunksSortMode: 'dependency' | ||||
|         }), | ||||
|         // keep module.id stable when vendor modules does not change
 | ||||
|         new webpack.HashedModuleIdsPlugin(), | ||||
|         // enable scope hoisting
 | ||||
|         new webpack.optimize.ModuleConcatenationPlugin(), | ||||
|         // split vendor js into its own file
 | ||||
|         new webpack.optimize.CommonsChunkPlugin({ | ||||
|             name: 'vendor', | ||||
|             minChunks(module) { | ||||
|                 // any required modules inside node_modules are extracted to vendor
 | ||||
|                 return ( | ||||
|                     module.resource && | ||||
|                     /\.js$/.test(module.resource) && | ||||
|                     module.resource.indexOf( | ||||
|                         path.join(__dirname, '../node_modules') | ||||
|                     ) === 0 | ||||
|                 ) | ||||
|             } | ||||
|         }), | ||||
|         // extract webpack runtime and module manifest to its own file in order to
 | ||||
|         // prevent vendor hash from being updated whenever app bundle is updated
 | ||||
|         new webpack.optimize.CommonsChunkPlugin({ | ||||
|             name: 'manifest', | ||||
|             minChunks: Infinity | ||||
|         }), | ||||
|         // This instance extracts shared chunks from code splitted chunks and bundles them
 | ||||
|         // in a separate chunk, similar to the vendor chunk
 | ||||
|         // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
 | ||||
|         new webpack.optimize.CommonsChunkPlugin({ | ||||
|             name: 'app', | ||||
|             async: 'vendor-async', | ||||
|             children: true, | ||||
|             minChunks: 3 | ||||
|         }), | ||||
| 
 | ||||
|         // copy custom static assets
 | ||||
|         new CopyWebpackPlugin([ | ||||
|             { | ||||
|                 from: path.resolve(__dirname, '../static'), | ||||
|                 to: config.build.assetsSubDirectory, | ||||
|                 ignore: ['.*'] | ||||
|             } | ||||
|         ]) | ||||
|     ] | ||||
| }); | ||||
| 
 | ||||
| if (config.build.productionGzip) { | ||||
|     const CompressionWebpackPlugin = require('compression-webpack-plugin'); | ||||
| 
 | ||||
|     webpackConfig.plugins.push( | ||||
|         new CompressionWebpackPlugin({ | ||||
|             asset: '[path].gz[query]', | ||||
|             algorithm: 'gzip', | ||||
|             test: new RegExp( | ||||
|                 '\\.(' + | ||||
|                 config.build.productionGzipExtensions.join('|') + | ||||
|                 ')$' | ||||
|             ), | ||||
|             threshold: 10240, | ||||
|             minRatio: 0.8 | ||||
|         }) | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| if (config.build.bundleAnalyzerReport) { | ||||
|     const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; | ||||
|     webpackConfig.plugins.push(new BundleAnalyzerPlugin()) | ||||
| } | ||||
| 
 | ||||
| module.exports = webpackConfig; | ||||
							
								
								
									
										7
									
								
								simon987/config/dev.env.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								simon987/config/dev.env.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| 'use strict'; | ||||
| const merge = require('webpack-merge'); | ||||
| const prodEnv = require('./prod.env'); | ||||
| 
 | ||||
| module.exports = merge(prodEnv, { | ||||
|     NODE_ENV: '"development"' | ||||
| }); | ||||
							
								
								
									
										69
									
								
								simon987/config/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								simon987/config/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | ||||
| 'use strict'; | ||||
| // Template version: 1.3.1
 | ||||
| // see http://vuejs-templates.github.io/webpack for documentation.
 | ||||
| 
 | ||||
| const path = require('path'); | ||||
| 
 | ||||
| module.exports = { | ||||
|     dev: { | ||||
| 
 | ||||
|         // Paths
 | ||||
|         assetsSubDirectory: 'static', | ||||
|         assetsPublicPath: '/', | ||||
|         proxyTable: {}, | ||||
| 
 | ||||
|         // Various Dev Server settings
 | ||||
|         host: '0.0.0.0', // can be overwritten by process.env.HOST
 | ||||
|         port: 42901, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
 | ||||
|         autoOpenBrowser: false, | ||||
|         errorOverlay: true, | ||||
|         notifyOnErrors: true, | ||||
|         poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
 | ||||
| 
 | ||||
| 
 | ||||
|         /** | ||||
|          * Source Maps | ||||
|          */ | ||||
| 
 | ||||
|         // https://webpack.js.org/configuration/devtool/#development
 | ||||
|         devtool: 'cheap-module-eval-source-map', | ||||
| 
 | ||||
|         // If you have problems debugging vue-files in devtools,
 | ||||
|         // set this to false - it *may* help
 | ||||
|         // https://vue-loader.vuejs.org/en/options.html#cachebusting
 | ||||
|         cacheBusting: true, | ||||
| 
 | ||||
|         cssSourceMap: true | ||||
|     }, | ||||
| 
 | ||||
|     build: { | ||||
|         // Template for index.html
 | ||||
|         index: path.resolve(__dirname, '../dist/index.html'), | ||||
| 
 | ||||
|         // Paths
 | ||||
|         assetsRoot: path.resolve(__dirname, '../dist'), | ||||
|         assetsSubDirectory: 'static', | ||||
|         assetsPublicPath: '/', | ||||
| 
 | ||||
|         /** | ||||
|          * Source Maps | ||||
|          */ | ||||
| 
 | ||||
|         productionSourceMap: true, | ||||
|         // https://webpack.js.org/configuration/devtool/#production
 | ||||
|         devtool: '#source-map', | ||||
| 
 | ||||
|         // Gzip off by default as many popular static hosts such as
 | ||||
|         // Surge or Netlify already gzip all static assets for you.
 | ||||
|         // Before setting to `true`, make sure to:
 | ||||
|         // npm install --save-dev compression-webpack-plugin
 | ||||
|         productionGzip: false, | ||||
|         productionGzipExtensions: ['js', 'css'], | ||||
| 
 | ||||
|         // Run the build command with an extra argument to
 | ||||
|         // View the bundle analyzer report after build finishes:
 | ||||
|         // `npm run build --report`
 | ||||
|         // Set to `true` or `false` to always turn it on or off
 | ||||
|         bundleAnalyzerReport: process.env.npm_config_report | ||||
|     } | ||||
| }; | ||||
							
								
								
									
										4
									
								
								simon987/config/prod.env.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								simon987/config/prod.env.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| 'use strict'; | ||||
| module.exports = { | ||||
|     NODE_ENV: '"production"' | ||||
| }; | ||||
							
								
								
									
										11
									
								
								simon987/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								simon987/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="utf-8"> | ||||
|     <meta name="viewport" content="width=device-width,initial-scale=1.0"> | ||||
|     <title>wip</title> | ||||
| </head> | ||||
| <body> | ||||
| <div id="app"></div> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										10862
									
								
								simon987/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										10862
									
								
								simon987/package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										65
									
								
								simon987/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								simon987/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| { | ||||
|   "name": "simon987.net", | ||||
|   "version": "1.0.0", | ||||
|   "description": "A Vue.js project", | ||||
|   "author": "simon987 <fortier.simon@protonmail.com>", | ||||
|   "private": true, | ||||
|   "scripts": { | ||||
|     "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", | ||||
|     "start": "npm run dev", | ||||
|     "build": "node build/build.js" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "d3": "^5.9.2", | ||||
|     "lodash": "^4.17.11", | ||||
|     "pixi.js": "^4.8.7", | ||||
|     "vue": "^2.5.2", | ||||
|     "vue-router": "^3.0.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "autoprefixer": "^7.1.2", | ||||
|     "babel-core": "^6.22.1", | ||||
|     "babel-helper-vue-jsx-merge-props": "^2.0.3", | ||||
|     "babel-loader": "^7.1.1", | ||||
|     "babel-plugin-syntax-jsx": "^6.18.0", | ||||
|     "babel-plugin-transform-runtime": "^6.22.0", | ||||
|     "babel-plugin-transform-vue-jsx": "^3.5.0", | ||||
|     "babel-preset-env": "^1.3.2", | ||||
|     "babel-preset-stage-2": "^6.22.0", | ||||
|     "chalk": "^2.0.1", | ||||
|     "copy-webpack-plugin": "^4.0.1", | ||||
|     "css-loader": "^0.28.0", | ||||
|     "extract-text-webpack-plugin": "^3.0.0", | ||||
|     "file-loader": "^1.1.4", | ||||
|     "friendly-errors-webpack-plugin": "^1.6.1", | ||||
|     "html-webpack-plugin": "^2.30.1", | ||||
|     "node-notifier": "^5.1.2", | ||||
|     "optimize-css-assets-webpack-plugin": "^3.2.0", | ||||
|     "ora": "^1.2.0", | ||||
|     "portfinder": "^1.0.13", | ||||
|     "postcss-import": "^11.0.0", | ||||
|     "postcss-loader": "^2.0.8", | ||||
|     "postcss-url": "^7.2.1", | ||||
|     "rimraf": "^2.6.0", | ||||
|     "semver": "^5.3.0", | ||||
|     "shelljs": "^0.7.6", | ||||
|     "uglifyjs-webpack-plugin": "^1.1.1", | ||||
|     "url-loader": "^0.5.8", | ||||
|     "vue-loader": "^13.3.0", | ||||
|     "vue-style-loader": "^3.0.1", | ||||
|     "vue-template-compiler": "^2.5.2", | ||||
|     "webpack": "^3.6.0", | ||||
|     "webpack-bundle-analyzer": "^2.9.0", | ||||
|     "webpack-dev-server": "^2.9.1", | ||||
|     "webpack-merge": "^4.1.0" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">= 6.0.0", | ||||
|     "npm": ">= 3.0.0" | ||||
|   }, | ||||
|   "browserslist": [ | ||||
|     "> 1%", | ||||
|     "last 2 versions", | ||||
|     "not ie <= 8" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										23
									
								
								simon987/src/App.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								simon987/src/App.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| <template> | ||||
|   <div id="app"> | ||||
|     <router-view/> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
|   name: 'App' | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
| <style> | ||||
|     body { | ||||
|         margin: 0; | ||||
|         padding: 0; | ||||
|     } | ||||
|     html { | ||||
|         overflow-x: hidden; | ||||
|         margin: 0; | ||||
|         padding: 0; | ||||
|     } | ||||
| </style> | ||||
							
								
								
									
										264
									
								
								simon987/src/Grid.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								simon987/src/Grid.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,264 @@ | ||||
| // import * as d3 from 'd3';
 | ||||
| import * as PIXI from 'pixi.js' | ||||
| import * as _ from 'lodash' | ||||
| 
 | ||||
| function Grid(cellSize, tickLen) { | ||||
| 
 | ||||
|     // Light
 | ||||
|     this.c1 = 0xf9989f; | ||||
|     this.c2 = 0xfccb8f; | ||||
|     this.c3 = 0xc5f8c8; | ||||
|     // this.c1 = 0x3a3b52;
 | ||||
|     // this.c2 = 0x33284b;
 | ||||
|     // this.c3 = 0x2c2332;
 | ||||
| 
 | ||||
|     this.seed = function () { | ||||
|         this._cells = new Uint8Array(this._cellCount).map(() => { | ||||
|             let x = Math.random(); | ||||
|             if (x < 1 / 3) { | ||||
|                 return 2; | ||||
|             } else if (x < 2 / 3) { | ||||
|                 return 4; | ||||
|             } | ||||
|             return 8; | ||||
|         }); | ||||
|     }; | ||||
| 
 | ||||
|     this.resize = function () { | ||||
|         this._pxWidth = window.innerWidth; | ||||
|         this._pxHeight = window.innerHeight; | ||||
| 
 | ||||
|         if (this.app) { | ||||
|             this.app.renderer.view.style.width = this._pxWidth + "px"; | ||||
|             this.app.renderer.view.style.height = this._pxHeight + "px"; | ||||
|             this.app.renderer.resize(window.innerWidth, window.innerHeight); | ||||
|         } | ||||
| 
 | ||||
|         this._cellCountX = Math.ceil(this._pxWidth / cellSize); | ||||
|         this._cellCountY = Math.ceil(this._pxHeight / cellSize); | ||||
|         this._cellCount = this._cellCountX * this._cellCountY; | ||||
| 
 | ||||
|         this.seed(); | ||||
| 
 | ||||
|         this.xMap = _.range(0, this._cellCount).map(x => x % this._cellCountX); | ||||
|         this.xCoordsMap = this.xMap.map(x => x * cellSize); | ||||
|         this.yCoordsMap = _.range(0, this._cellCount) | ||||
|             .map(y => Math.floor(y / this._cellCountX)) | ||||
|             .map(y => y * cellSize); | ||||
|     }; | ||||
| 
 | ||||
|     this.g_TICK = tickLen; | ||||
|     this.g_Time = 0; | ||||
| 
 | ||||
|     this._cellSize = cellSize; | ||||
| 
 | ||||
|     this.setup = function () { | ||||
| 
 | ||||
|         let elem = document.getElementById("grid"); | ||||
| 
 | ||||
|         this.app = new PIXI.Application({ | ||||
|             width: 0, | ||||
|             height: 0, | ||||
|             backgroundColor: 0xFFFFFF, | ||||
|         }); | ||||
| 
 | ||||
|         elem.appendChild(this.app.view); | ||||
| 
 | ||||
|         this._graphics = new PIXI.Graphics(); | ||||
|         this.app.stage.addChild(this._graphics); | ||||
| 
 | ||||
|         this.app.ticker.add(() => { | ||||
| 
 | ||||
|             // Limit to the frame rate
 | ||||
|             let timeNow = (new Date()).getTime(); | ||||
|             let timeDiff = timeNow - this.g_Time; | ||||
|             if (timeDiff < this.g_TICK) { | ||||
|                 return; | ||||
|             } | ||||
|             this.g_Time = timeNow; | ||||
| 
 | ||||
|             this.tick(); | ||||
|         }); | ||||
| 
 | ||||
|         window.onresize = () => this.resize(); | ||||
|     }; | ||||
| 
 | ||||
|     this.paint = function () { | ||||
| 
 | ||||
|         this._graphics.clear(); | ||||
| 
 | ||||
|         let bgColor = this.getColor(0); | ||||
| 
 | ||||
|         this._graphics.beginFill(bgColor) | ||||
|             .drawRect(0, 0, this._pxWidth, this._pxHeight) | ||||
|             .endFill(); | ||||
| 
 | ||||
|         let cells = _.groupBy(_.range(0, this._cellCount), this.getColor); | ||||
|         for (let color in cells) { | ||||
| 
 | ||||
|             let intCol = Number(color); | ||||
| 
 | ||||
|             if (intCol !== bgColor) { | ||||
|                 this._graphics.beginFill(intCol); | ||||
| 
 | ||||
|                 cells[color].forEach(d => this._graphics | ||||
|                     .drawRect( | ||||
|                         this.xCoordsMap[d], | ||||
|                         this.yCoordsMap[d], | ||||
|                         this._cellSize, | ||||
|                         this._cellSize | ||||
|                     ) | ||||
|                 ); | ||||
|                 this._graphics.endFill() | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     this.tick = function () { | ||||
| 
 | ||||
|         let xw = this._cellCountX; | ||||
|         let neighbors = new Uint8Array(8); | ||||
|         let cells = this._cells; | ||||
|         let newCells = new Uint8Array(this._cellCount); | ||||
|         let lastCell = this._cellCount - 1; | ||||
|         let xw_m1 = xw - 1; | ||||
|         let xw_p1 = xw + 1; | ||||
|         let lastRowIndex = this._cellCount - xw; | ||||
| 
 | ||||
|         for (let i = 0; i < this._cellCount; i++) { | ||||
| 
 | ||||
|             let x = this.xMap[i]; | ||||
| 
 | ||||
|             if (i < xw) { | ||||
|                 if (i === 0) { | ||||
|                     neighbors[0] = cells[lastCell]; | ||||
|                     neighbors[1] = cells[lastCell - xw_p1]; | ||||
|                     neighbors[2] = cells[lastRowIndex]; | ||||
|                     neighbors[3] = cells[xw_m1]; | ||||
|                     neighbors[4] = cells[1]; | ||||
|                     neighbors[5] = cells[xw + xw_m1]; | ||||
|                     neighbors[6] = cells[xw]; | ||||
|                     neighbors[7] = cells[xw_p1]; | ||||
|                 } else { | ||||
|                     neighbors[0] = cells[lastCell - (xw - i)]; | ||||
|                     neighbors[1] = cells[lastRowIndex + i]; | ||||
|                     if (i === xw_m1) { | ||||
|                         neighbors[2] = cells[lastRowIndex]; | ||||
|                     } else { | ||||
|                         neighbors[2] = cells[lastRowIndex + i + 1]; | ||||
|                     } | ||||
|                     neighbors[3] = cells[i - 1]; | ||||
|                     neighbors[4] = cells[i + 1]; | ||||
|                     neighbors[5] = cells[i + xw_m1]; | ||||
|                     neighbors[6] = cells[i + xw]; | ||||
|                     neighbors[7] = cells[i + xw_p1]; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (x === 0) { | ||||
|                     neighbors[0] = cells[i - 1]; | ||||
|                     neighbors[3] = cells[i + xw_m1]; | ||||
|                 } else { | ||||
|                     neighbors[0] = cells[i - xw_p1]; | ||||
|                     neighbors[3] = cells[i - 1]; | ||||
|                 } | ||||
|                 neighbors[1] = cells[i - xw]; | ||||
|                 if (x === xw_m1) { | ||||
|                     neighbors[2] = cells[i - xw - xw_p1]; | ||||
|                     neighbors[4] = cells[i - xw_m1]; | ||||
|                 } else { | ||||
|                     neighbors[2] = cells[i - xw_m1]; | ||||
|                     neighbors[4] = cells[i + 1]; | ||||
|                 } | ||||
| 
 | ||||
|                 if (i < lastRowIndex) { | ||||
|                     if (x === 0) { | ||||
|                         neighbors[5] = cells[i + xw + xw_m1]; | ||||
|                         neighbors[7] = cells[i + xw_p1]; | ||||
|                     } else { | ||||
|                         neighbors[5] = cells[i + xw_m1]; | ||||
|                         if (x === xw_m1) { | ||||
|                             neighbors[7] = cells[i + 1]; | ||||
|                         } else { | ||||
|                             neighbors[7] = cells[i + xw_p1]; | ||||
|                         } | ||||
|                     } | ||||
|                     neighbors[6] = cells[i + xw]; | ||||
|                 } else if (i > lastRowIndex) { | ||||
|                     neighbors[5] = cells[x - 1]; | ||||
|                     neighbors[6] = cells[x]; | ||||
|                     if (i === lastCell) { | ||||
|                         neighbors[7] = cells[0]; | ||||
|                     } else { | ||||
|                         neighbors[7] = cells[x + 1]; | ||||
|                     } | ||||
|                 } else { | ||||
|                     neighbors[5] = cells[xw_m1]; | ||||
|                     neighbors[6] = cells[0]; | ||||
|                     neighbors[7] = cells[1]; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             newCells[i] = this.computeState(cells[i], neighbors) | ||||
|         } | ||||
| 
 | ||||
|         this._cells = newCells; | ||||
|         this.paint(); | ||||
|     }; | ||||
| 
 | ||||
|     this.getColor = (cell) => { | ||||
|         if (this._cells[cell] === 2) { | ||||
|             return this.c1; | ||||
|         } else if (this._cells[cell] === 4) { | ||||
|             return this.c2; | ||||
|         } | ||||
|         return this.c3; | ||||
|     }; | ||||
| 
 | ||||
|     // this.computeState_ = (state, neighbors) => {
 | ||||
|     //
 | ||||
|     //     let liveNeighbors = 0;
 | ||||
|     //     for (let i = 0; i < 8; i++) {
 | ||||
|     //         if (neighbors[i] === 1) {
 | ||||
|     //             liveNeighbors++;
 | ||||
|     //         }
 | ||||
|     //     }
 | ||||
|     //
 | ||||
|     //     if (state === 1) {
 | ||||
|     //         if (liveNeighbors < 2 || liveNeighbors > 3) {
 | ||||
|     //             return 0;
 | ||||
|     //         }
 | ||||
|     //     } else if (liveNeighbors === 3) {
 | ||||
|     //         return 1;
 | ||||
|     //     }
 | ||||
|     //     return state;
 | ||||
|     // };
 | ||||
| 
 | ||||
|     this.computeState = (state, neighbors) => { | ||||
| 
 | ||||
|         let predators = 0; | ||||
|         let predator; | ||||
| 
 | ||||
|         if (state === 2) { | ||||
|             predator = 4; | ||||
|         } else if (state === 4) { | ||||
|             predator = 8; | ||||
|         } else { | ||||
|             predator = 2; | ||||
|         } | ||||
| 
 | ||||
|         for (let i = 0; i < 8; i++) { | ||||
|             if (neighbors[i] === predator) { | ||||
|                 predators++; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (predators >= 3) { | ||||
|             return predator; | ||||
|         } | ||||
| 
 | ||||
|         return state; | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| export default Grid; | ||||
							
								
								
									
										
											BIN
										
									
								
								simon987/src/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								simon987/src/assets/logo.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 6.7 KiB | 
							
								
								
									
										34
									
								
								simon987/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								simon987/src/components/HelloWorld.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| <template> | ||||
|   <div id="grid"> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| import Grid from '../Grid'; | ||||
| 
 | ||||
| window.onload = () => { | ||||
| 
 | ||||
|     let grid = new Grid( | ||||
|         window.innerWidth < 1000 ? 20 : 30, | ||||
|         window.innerWidth < 1000 ? 80 : 40, | ||||
|     ); | ||||
|     grid.setup(); | ||||
|     grid.resize(); | ||||
| }; | ||||
| 
 | ||||
| export default { | ||||
|   name: 'HelloWorld', | ||||
|   data () { | ||||
|     return { | ||||
|       msg: 'Welcome to Your Vue.js App' | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
| <style scoped> | ||||
|     #grid { | ||||
|         position: fixed; | ||||
|         background: white; | ||||
|     } | ||||
| </style> | ||||
							
								
								
									
										12
									
								
								simon987/src/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								simon987/src/main.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| import Vue from 'vue' | ||||
| import App from './App' | ||||
| import router from './router' | ||||
| 
 | ||||
| Vue.config.productionTip = false | ||||
| 
 | ||||
| /* eslint-disable no-new */ | ||||
| new Vue({ | ||||
|   el: '#app', | ||||
|   router, | ||||
|   render: h => h(App) | ||||
| }) | ||||
							
								
								
									
										15
									
								
								simon987/src/router/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								simon987/src/router/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| import Vue from 'vue' | ||||
| import Router from 'vue-router' | ||||
| import HelloWorld from '@/components/HelloWorld' | ||||
| 
 | ||||
| Vue.use(Router); | ||||
| 
 | ||||
| export default new Router({ | ||||
|     routes: [ | ||||
|         { | ||||
|             path: '/', | ||||
|             name: 'HelloWorld', | ||||
|             component: HelloWorld | ||||
|         } | ||||
|     ] | ||||
| }) | ||||
							
								
								
									
										0
									
								
								simon987/static/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								simon987/static/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user