├── .eslintrc ├── src ├── common │ ├── config │ │ ├── index.ts │ │ └── gender.ts │ ├── index.ts │ ├── test.ts │ └── utils │ │ ├── index.ts │ │ └── comma.ts ├── utils │ ├── util1.ts │ ├── util2.ts │ └── index.ts ├── config │ ├── server.ts │ ├── env.ts │ ├── backend │ │ ├── local.ts │ │ ├── development.ts │ │ └── production.ts │ └── index.ts ├── types │ ├── user-info.ts │ └── config.d.ts ├── server.ts ├── controllers │ ├── index.ts │ ├── info │ │ └── add.ts │ └── list │ │ └── list.ts ├── models │ └── user │ │ └── user-info.ts └── app.ts ├── client-src ├── config │ └── index.ts ├── utils │ └── index.ts ├── types │ └── unable-webpack-plugins.d.ts ├── index.ejs ├── webpack │ ├── common.ts │ ├── dll.ts │ ├── base.ts │ ├── dev.ts │ └── pro.ts ├── tsconfig-for-webpack-config.json ├── .babelrc ├── .eslintrc ├── index.tsx ├── tsconfig.json ├── components │ ├── index.tsx │ ├── slide-bar.tsx │ ├── add.tsx │ ├── list.tsx │ └── app.tsx ├── package.json └── dist │ └── vendors-manifest.json ├── test ├── conf │ └── index.ts ├── number-comma.ts ├── number-comma.spec.ts └── api │ ├── add-user.spec.ts │ └── filter-list.spec.ts ├── copy-static-assets.ts ├── nodemon.json ├── tsconfig.json ├── LICENSE ├── .gitignore ├── package.json └── README.md /.eslintrc: -------------------------------------------------------------------------------- 1 | extends: blued-typescript -------------------------------------------------------------------------------- /src/common/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from './gender' -------------------------------------------------------------------------------- /client-src/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from '@Common/config' -------------------------------------------------------------------------------- /client-src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from '@Common/utils' -------------------------------------------------------------------------------- /src/common/index.ts: -------------------------------------------------------------------------------- 1 | export { default as test } from './test' -------------------------------------------------------------------------------- /src/common/test.ts: -------------------------------------------------------------------------------- 1 | export default (str: string) => console.log(str) -------------------------------------------------------------------------------- /src/common/utils/index.ts: -------------------------------------------------------------------------------- 1 | export { default as comma } from './comma' -------------------------------------------------------------------------------- /src/utils/util1.ts: -------------------------------------------------------------------------------- 1 | export default () => console.log('util1') 2 | -------------------------------------------------------------------------------- /src/utils/util2.ts: -------------------------------------------------------------------------------- 1 | export default () => console.log('util2') 2 | -------------------------------------------------------------------------------- /src/common/config/gender.ts: -------------------------------------------------------------------------------- 1 | export enum Gender { 2 | Male = 1, 3 | Female = 2, 4 | } -------------------------------------------------------------------------------- /test/conf/index.ts: -------------------------------------------------------------------------------- 1 | export const host = 'http://127.0.0.1' 2 | export const port = 8888 -------------------------------------------------------------------------------- /copy-static-assets.ts: -------------------------------------------------------------------------------- 1 | import * as shell from 'shelljs' 2 | 3 | shell.cp('-R', 'src/public', 'dist/public/') 4 | -------------------------------------------------------------------------------- /src/common/utils/comma.ts: -------------------------------------------------------------------------------- 1 | export default (num: number): string => String(num).replace(/\B(?=(\d{3})+$)/g, ',') -------------------------------------------------------------------------------- /test/number-comma.ts: -------------------------------------------------------------------------------- 1 | export default (num: number | string) => String(num).replace(/\B(?=(\d{3})+$)/g, ',') 2 | -------------------------------------------------------------------------------- /client-src/types/unable-webpack-plugins.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'html-webpack-plugin' 2 | 3 | declare module 'qiniu-webpack-plugin' -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from '../common/utils' 2 | 3 | export { default as util1 } from './util1' 4 | export { default as util2 } from './util2' 5 | -------------------------------------------------------------------------------- /client-src/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= title %> 5 | 6 | 7 |
8 | 9 | -------------------------------------------------------------------------------- /src/config/server.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | 3 | export const app = 'typescript-example' 4 | export const port = 8888 5 | export const distPath = path.resolve(__dirname, '../../client-dist') -------------------------------------------------------------------------------- /src/config/env.ts: -------------------------------------------------------------------------------- 1 | const env = process.env.NODE_ENV 2 | export let isPro = env === 'production' 3 | export let isDev = env === 'development' 4 | export let isLocal = env === 'local' || env === 'local_dev' 5 | -------------------------------------------------------------------------------- /src/types/user-info.ts: -------------------------------------------------------------------------------- 1 | export declare type UserData = { 2 | name: string 3 | age?: number 4 | gender: number 5 | } 6 | 7 | export declare type UserInfo = UserData & { 8 | uid: number 9 | } 10 | -------------------------------------------------------------------------------- /client-src/webpack/common.ts: -------------------------------------------------------------------------------- 1 | import { Configuration } from 'webpack' 2 | 3 | const config: Configuration = { 4 | mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', 5 | } 6 | 7 | export default config -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import app from './app' 2 | import { port } from './config' 3 | 4 | export default app.listen(port, () => console.log(`Server run as http://127.0.0.1:${port}`)) 5 | 6 | process.on('uncaughtException', console.error) 7 | -------------------------------------------------------------------------------- /client-src/tsconfig-for-webpack-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", // 可以相对这个目录 import 文件 4 | "module": "commonjs", 5 | "target": "es5", 6 | "esModuleInterop": true, 7 | "moduleResolution": "node", 8 | "resolveJsonModule": true, 9 | } 10 | } -------------------------------------------------------------------------------- /src/config/backend/local.ts: -------------------------------------------------------------------------------- 1 | import { ConfigMap } from 'config' 2 | 3 | export const configs: ConfigMap = { 4 | mysql: { 5 | host: ['127.0.0.1'], 6 | user: 'root', 7 | password: 'jarvis', 8 | database: 'ts_test', 9 | key: 'mysql', 10 | modelPath: 'user', 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /src/config/backend/development.ts: -------------------------------------------------------------------------------- 1 | import { ConfigMap } from 'config' 2 | 3 | export const configs: ConfigMap = { 4 | mysql: { 5 | host: ['127.0.0.1'], 6 | user: 'root', 7 | password: 'jarvis', 8 | database: 'ts_test', 9 | key: 'mysql', 10 | modelPath: 'user', 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /src/config/backend/production.ts: -------------------------------------------------------------------------------- 1 | import { ConfigMap } from 'config' 2 | 3 | export const configs: ConfigMap = { 4 | mysql: { 5 | host: ['127.0.0.1'], 6 | user: 'root', 7 | password: 'jarvis', 8 | database: 'ts_test', 9 | key: 'mysql', 10 | modelPath: 'user', 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /client-src/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "env", 4 | "react" 5 | ], 6 | "plugins": [ 7 | [ 8 | "import", 9 | { 10 | "libraryName": "material-ui", 11 | "libraryDirectory": "components", 12 | "camel2DashComponentName": false 13 | } 14 | ] 15 | ] 16 | } -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "verbose": true, 3 | "ignore": ["public/*", "node_modules/*"], 4 | "events": { 5 | "restart": "osascript -e 'display notification \"App restarted due to:\n'$FILENAME'\" with title \"nodemon\"'" 6 | }, 7 | "watch": [ 8 | "src/*" 9 | ], 10 | "ext": "ts js json jsx scss hbs html ejs css sass" 11 | } 12 | -------------------------------------------------------------------------------- /src/types/config.d.ts: -------------------------------------------------------------------------------- 1 | export type MysqlConfig = { 2 | key: string 3 | host: Array 4 | user: string 5 | password: string 6 | database: string 7 | modelPath: string 8 | } 9 | 10 | export type ConfigItem = MysqlConfig | string | Array 11 | 12 | export type ConfigMap = { 13 | [key: string]: ConfigItem 14 | } 15 | -------------------------------------------------------------------------------- /src/controllers/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Get, 3 | Controller, 4 | } from 'routing-controllers' 5 | import cons from 'consolidate' 6 | import path from 'path' 7 | 8 | @Controller() 9 | export default class { 10 | @Get('/') 11 | async router() { 12 | return cons.ejs(path.resolve(__dirname, '../../views/index.ejs'), { 13 | title: 'Example For TypeScript React App', 14 | }) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /client-src/.eslintrc: -------------------------------------------------------------------------------- 1 | extends: 2 | - blued-react 3 | - blued-typescript 4 | rules: 5 | react/jsx-filename-extension: 6 | - 2 7 | - extensions: 8 | - .js 9 | - .jsx 10 | - .ts 11 | - .tsx 12 | import/no-extraneous-dependencies: 13 | - 2 14 | - devDependencies: 15 | - "**/*.test.js" 16 | - "**/*.spec.js" 17 | - "**/webpack*" 18 | - "**/webpack/*" 19 | global-require: 0 20 | typescript/member-ordering: 0 -------------------------------------------------------------------------------- /test/number-comma.spec.ts: -------------------------------------------------------------------------------- 1 | import chai from 'chai' 2 | import numberComma from './number-comma' 3 | 4 | const { expect } = chai 5 | 6 | describe('number-comma', () => { 7 | it('`1234567` should transform to `1,234,567`', done => { 8 | expect(numberComma(1234567)).to.equal('1,234,567') 9 | done() 10 | }) 11 | 12 | it('`123` should never transform', done => { 13 | const num = 123 14 | expect(numberComma(num)).to.equal(String(num)) 15 | done() 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /src/models/user/user-info.ts: -------------------------------------------------------------------------------- 1 | import { Model, Table, Column } from 'sequelize-typescript' 2 | 3 | @Table({ 4 | tableName: 'user_info_test' 5 | }) 6 | export default class UserInfo extends Model { 7 | @Column({ 8 | comment: '自增ID', 9 | autoIncrement: true, 10 | primaryKey: true, 11 | }) 12 | uid: number 13 | 14 | @Column({ 15 | comment: '姓名', 16 | }) 17 | name: string 18 | 19 | @Column({ 20 | comment: '年龄', 21 | defaultValue: 0, 22 | }) 23 | age: number 24 | 25 | @Column({ 26 | comment: '性别', 27 | }) 28 | gender: number 29 | } 30 | -------------------------------------------------------------------------------- /src/config/index.ts: -------------------------------------------------------------------------------- 1 | import { configs as pro } from './backend/production' 2 | import { configs as dev } from './backend/development' 3 | import { configs as local } from './backend/local' 4 | import { isPro, isDev, isLocal } from './env' 5 | import { ConfigMap } from 'config' 6 | 7 | export * from './env' 8 | export * from './server' 9 | export * from '../common/config' 10 | 11 | let configs: ConfigMap 12 | 13 | switch (true) { 14 | case isPro: 15 | configs = pro 16 | break 17 | case isDev: 18 | configs = dev 19 | break 20 | case isLocal: 21 | default: 22 | configs = local 23 | } 24 | 25 | export { configs } 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "target": "ES2017", 6 | "noImplicitAny": true, 7 | "moduleResolution": "node", 8 | "sourceMap": true, 9 | "outDir": "dist", 10 | "baseUrl": ".", 11 | "paths": { 12 | "*": [ 13 | "node_modules/*", 14 | "src/types/*" 15 | ] 16 | }, 17 | "lib": [ 18 | "es2017" 19 | ], 20 | "emitDecoratorMetadata": true, 21 | "experimentalDecorators": true, 22 | "skipLibCheck": true 23 | }, 24 | "include": [ 25 | "src/**/*" 26 | ], 27 | "experimentalDecorators": true 28 | } -------------------------------------------------------------------------------- /client-src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import { MuiThemeProvider } from '@material-ui/core' 4 | import { createMuiTheme } from '@material-ui/core/styles' 5 | import { blue, lightBlue } from '@material-ui/core/colors' 6 | import App from './components/app' 7 | import { comma } from './utils' 8 | 9 | const mountNode = document.getElementById('app') 10 | 11 | comma(123) 12 | 13 | const theme = createMuiTheme({ 14 | palette: { 15 | primary: blue, 16 | secondary: lightBlue, 17 | }, 18 | }) 19 | 20 | ReactDOM.render( 21 | 22 | 23 | , mountNode 24 | ) 25 | 26 | -------------------------------------------------------------------------------- /test/api/add-user.spec.ts: -------------------------------------------------------------------------------- 1 | import chai from 'chai' 2 | import chaiHttp from 'chai-http' 3 | import { host, port } from '../conf' 4 | import { Gender } from '../../src/config' 5 | 6 | chai.use(chaiHttp) 7 | const should = chai.should() 8 | const { expect } = chai 9 | const url = '/add' 10 | const name = 'Niko' 11 | const age = 18 12 | const gender = Gender.Female 13 | 14 | describe(`add new user`, () => { 15 | it('request success', done => { 16 | chai.request(`${host}:${port}`) 17 | .get(`${url}/${name}/${age}/${gender}`) 18 | .end((err, res) => { 19 | should.exist(res.body) 20 | expect(res.body).to.have.property('code') 21 | expect(res.body.code).to.equal(200) 22 | 23 | done() 24 | }) 25 | }) 26 | }) 27 | -------------------------------------------------------------------------------- /client-src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "esnext", // 使用 ES2015 模块 4 | "target": "es6", // 编译成 ES2015 (Babel 将做剩下的事情) 5 | "allowSyntheticDefaultImports": true, // 看下面 6 | "baseUrl": ".", // 可以相对这个目录 import 文件 7 | "sourceMap": true, // 使 TypeScript 生成 sourcemaps 8 | "outDir": "../client-dist", // 构建输出目录 (因为我们大部分时间都在使用 Webpack,所以不太相关) 9 | "jsx": "preserve", // 开启 JSX 模式, 但是 "preserve" 告诉 TypeScript 不要转换它(我们将使用 Babel) 10 | "strict": true, 11 | "moduleResolution": "node", 12 | "experimentalDecorators": true, 13 | "emitDecoratorMetadata": true, 14 | "paths": { 15 | "@Common/*": [ 16 | "../src/common/*" 17 | ] 18 | } 19 | }, 20 | "exclude": [ 21 | "node_modules" // 这个目录下的代码不会被 typescript 处理 22 | ] 23 | } -------------------------------------------------------------------------------- /test/api/filter-list.spec.ts: -------------------------------------------------------------------------------- 1 | import chai from 'chai' 2 | import chaiHttp from 'chai-http' 3 | import { host, port } from '../conf' 4 | import { Gender } from '../../src/config' 5 | import UserInfo from '../../src/models/user/user-info' 6 | 7 | chai.use(chaiHttp) 8 | const should = chai.should() 9 | const { expect } = chai 10 | const url = '/list/filter' 11 | const gender = Gender.Female 12 | 13 | describe(`filter list with female`, () => { 14 | it('request success', done => { 15 | chai.request(`${host}:${port}`) 16 | .get(`${url}/${gender}`) 17 | .end((err, res) => { 18 | should.exist(res.body) 19 | expect(res.body).to.have.property('code') 20 | expect(res.body.code).to.equal(200) 21 | expect(res.body.data).to.be.a('array') 22 | expect(res.body.data.filter((item: UserInfo) => item.gender)).to.not.include(Gender.Male) 23 | 24 | done() 25 | }) 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /client-src/webpack/dll.ts: -------------------------------------------------------------------------------- 1 | import webpack from 'webpack' 2 | import merge from 'webpack-merge' 3 | import UglifyJsPlugin from 'uglifyjs-webpack-plugin' 4 | import path from 'path' 5 | import common from './common' 6 | 7 | module.exports = merge(common, { 8 | entry: { 9 | vendors: [ 10 | 'react', 11 | 'react-dom', 12 | 'react-router-dom', 13 | 'babel-polyfill', 14 | ], 15 | }, 16 | output: { 17 | filename: 'vendors.dll.js', 18 | path: path.resolve(__dirname, '../../client-dist'), 19 | library: 'vendors_lib', 20 | }, 21 | plugins: [ 22 | new webpack.DllPlugin({ 23 | context: __dirname, 24 | path: path.join(__dirname, '../dist/vendors-manifest.json'), 25 | name: 'vendors_lib', 26 | }), 27 | new UglifyJsPlugin({ 28 | uglifyOptions: { 29 | compress: { 30 | warnings: false, 31 | drop_console: true, 32 | collapse_vars: true, 33 | reduce_vars: true, 34 | }, 35 | }, 36 | }), 37 | ], 38 | }) -------------------------------------------------------------------------------- /client-src/components/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CssBaseline } from '@material-ui/core' 3 | import { withStyles, createStyles, Theme } from '@material-ui/core/styles' 4 | import Add from './add' 5 | import List from './list' 6 | 7 | const styles = () => createStyles({ 8 | logo: { 9 | maxWidth: '140px', 10 | margin: '0 auto', 11 | display: 'block', 12 | }, 13 | wrap: { 14 | width: '100%', 15 | display: 'flex', 16 | flexDirection: 'column', 17 | // alignItems: 'center', 18 | // justifyContent: 'center', 19 | }, 20 | slogan: { 21 | marginTop: 20, 22 | }, 23 | }) 24 | 25 | class Index extends React.PureComponent<{ 26 | classes: any 27 | theme: Theme 28 | }> { 29 | render() { 30 | const { classes } = this.props 31 | return ( 32 |
33 | 34 | 35 | 36 |
37 | ) 38 | } 39 | } 40 | 41 | export default withStyles(styles, { 42 | withTheme: true, 43 | })(Index) 44 | -------------------------------------------------------------------------------- /client-src/components/slide-bar.tsx: -------------------------------------------------------------------------------- 1 | // This file is shared across the demos. 2 | 3 | import React, { Fragment } from 'react' 4 | import { ListItem, ListItemIcon, ListItemText, Divider, List } from '@material-ui/core' 5 | import AddIcon from '@material-ui/icons/Add' 6 | import FormatListNumberedIcon from '@material-ui/icons/FormatListNumbered' 7 | 8 | export const mailFolderListItems = ( 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | ) 18 | 19 | export const otherMailFolderListItems = ( 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | ) 29 | 30 | export default () => ( 31 | 32 | 33 | {mailFolderListItems} 34 | 35 | {otherMailFolderListItems} 36 | 37 | ) 38 | -------------------------------------------------------------------------------- /client-src/webpack/base.ts: -------------------------------------------------------------------------------- 1 | import webpack from 'webpack' 2 | import merge from 'webpack-merge' 3 | import path from 'path' 4 | import common from './common' 5 | 6 | export default merge(common, { 7 | entry: ['babel-polyfill', './index.tsx'], 8 | module: { 9 | rules: [ 10 | { 11 | test: /\.tsx?$/, 12 | use: ['babel-loader', 'ts-loader'], 13 | exclude: /node_modules/, 14 | }, 15 | { 16 | test: /\.css$/, 17 | use: ['style-loader', 'css-loader'], 18 | }, 19 | { 20 | test: /\.less$/, 21 | use: ['style-loader', 'less-loader', 'css-loader'], 22 | }, 23 | { 24 | test: /\.ejs/, 25 | use: [ 26 | { 27 | loader: 'ejs-loader', 28 | options: { 29 | interpolate: /<\$=([\s\S]+?)\$>/g, 30 | evaluate: /<\$([\s\S]+?)\$>/g, 31 | }, 32 | }, 33 | ], 34 | }, 35 | ], 36 | }, 37 | resolve: { 38 | extensions: ['.tsx', '.ts', '.js'], 39 | alias: { 40 | '@Common': path.resolve(__dirname, '../../src/common'), 41 | }, 42 | }, 43 | }) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 贾顺名(Jarvis) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata' 2 | import path from 'path' 3 | import { createKoaServer } from 'routing-controllers' 4 | import { Sequelize } from 'sequelize-typescript' 5 | import serve from 'koa-static' 6 | import bodyParser from 'koa-bodyparser' 7 | import { MysqlConfig } from 'config' 8 | import { distPath, configs } from './config' 9 | 10 | const app = createKoaServer({ 11 | controllers: [`${__dirname}/controllers/**/*{.js,.ts}`], 12 | }) 13 | 14 | app.use(serve(distPath)) 15 | app.use(bodyParser()) 16 | 17 | const mysqlConfig = configs.mysql as MysqlConfig 18 | 19 | const _ = new Sequelize({ 20 | host: mysqlConfig.host[0], 21 | database: mysqlConfig.database, 22 | username: mysqlConfig.user, 23 | password: mysqlConfig.password, 24 | // 或者一些其他的数据库 25 | dialect: 'mysql', 26 | // 加载我们的实体 27 | modelPaths: [path.resolve(__dirname, `./models/${mysqlConfig.modelPath}`)], 28 | pool: { 29 | // 连接池的一些相关配置 30 | max: 5, 31 | min: 0, 32 | acquire: 30000, 33 | idle: 10000, 34 | }, 35 | operatorsAliases: false, 36 | // true会在控制台打印每次sequelize操作时对应的SQL命令 37 | logging: true, 38 | }) 39 | 40 | export default app 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | dist 63 | client-dist 64 | views -------------------------------------------------------------------------------- /src/controllers/info/add.ts: -------------------------------------------------------------------------------- 1 | import { Ctx, Param, Get, JsonController } from 'routing-controllers' 2 | import { UserData } from 'user-info' 3 | import { Context } from 'koa' 4 | import UserInfo from '../../models/user/user-info' 5 | 6 | @JsonController('/add') 7 | export default class { 8 | @Get('/:name/:age/:gender') 9 | async router( 10 | @Ctx() ctx: Context, 11 | @Param('name') name: string, 12 | @Param('age') age: number, 13 | @Param('gender') gender: number 14 | ) { 15 | try { 16 | if (!name || !gender) { 17 | return { 18 | code: 401, 19 | message: '缺少参数', 20 | } 21 | } 22 | 23 | const entity: UserData = { 24 | name, 25 | gender, 26 | age, 27 | } 28 | 29 | // 创建举报记录 30 | createUser(entity).catch(err => { 31 | console.error(ctx, err, { 32 | type: 'insert', 33 | ...entity, 34 | }) 35 | }) 36 | 37 | return { 38 | code: 200, 39 | } 40 | } catch (e) { 41 | console.error(ctx, e) 42 | return { 43 | code: 500, 44 | message: '服务器错误', 45 | } 46 | } 47 | } 48 | } 49 | 50 | /** 51 | * 创建一个新的用户 52 | */ 53 | async function createUser({ name, gender }: UserData) { 54 | return (await UserInfo.create({ 55 | name, 56 | gender, 57 | })).save() 58 | } 59 | -------------------------------------------------------------------------------- /src/controllers/list/list.ts: -------------------------------------------------------------------------------- 1 | import { Ctx, Param, Get, JsonController } from 'routing-controllers' 2 | import { Context } from 'koa' 3 | import UserInfo from '../../models/user/user-info' 4 | 5 | @JsonController('/list') 6 | export default class { 7 | @Get('/') 8 | async router(@Ctx() ctx: Context) { 9 | try { 10 | return { 11 | code: 200, 12 | data: await filterList(), 13 | } 14 | } catch (e) { 15 | console.error(ctx, e) 16 | return { 17 | code: 500, 18 | message: '服务器错误', 19 | } 20 | } 21 | } 22 | 23 | @Get('/filter/:gender') 24 | async anotherRouter(@Ctx() ctx: Context, @Param('gender') gender: number) { 25 | try { 26 | if (!gender) { 27 | return { 28 | code: 401, 29 | message: '缺少参数', 30 | } 31 | } 32 | 33 | return { 34 | code: 200, 35 | data: await filterList({ 36 | gender, 37 | }), 38 | } 39 | } catch (e) { 40 | console.error(ctx, e) 41 | return { 42 | code: 500, 43 | message: '服务器错误', 44 | } 45 | } 46 | } 47 | } 48 | 49 | /** 50 | * 获取列表数据 51 | */ 52 | async function filterList({ gender }: { gender?: number } = {}) { 53 | return UserInfo.findAll({ 54 | raw: true, 55 | where: gender && { 56 | gender, 57 | }, 58 | }) 59 | } 60 | -------------------------------------------------------------------------------- /client-src/webpack/dev.ts: -------------------------------------------------------------------------------- 1 | import webpack from 'webpack' 2 | import merge from 'webpack-merge' 3 | import path from 'path' 4 | import HtmlWebpackPlugin from 'html-webpack-plugin' 5 | import AddAssetHtmlPlugin from 'add-asset-html-webpack-plugin' 6 | import baseConfig from './base' 7 | 8 | const manifest = require('../dist/vendors-manifest.json') 9 | 10 | export default merge(baseConfig, { 11 | output: { 12 | filename: 'bundle.js', 13 | path: path.resolve(__dirname, '../../client-dist'), 14 | publicPath: '/', 15 | }, 16 | devtool: 'source-map', 17 | module: { 18 | rules: [ 19 | { 20 | test: /\.(gif|png|jpe?g|svg)$/, 21 | use: [ 22 | { 23 | loader: 'file-loader', 24 | options: { 25 | // isProduction ? '[name]-[hash].[ext]' : 26 | name: '[name].[ext]', 27 | publicPath: '/', 28 | }, 29 | }, 30 | ], 31 | }, 32 | ], 33 | }, 34 | plugins: [ 35 | new HtmlWebpackPlugin({ 36 | template: path.resolve(__dirname, '../index.ejs'), 37 | filename: path.resolve(__dirname, '../../views/index.ejs'), 38 | }), 39 | new AddAssetHtmlPlugin({ 40 | filepath: path.resolve(__dirname, '../../client-dist/vendors.dll.js'), 41 | }), 42 | new webpack.WatchIgnorePlugin([ 43 | /\.ejs$/, 44 | /\.js$/, 45 | ]), 46 | new webpack.DllReferencePlugin({ 47 | context: __dirname, 48 | manifest, 49 | }), 50 | ], 51 | }) -------------------------------------------------------------------------------- /client-src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "c.blued-client", 3 | "version": "0.0.1", 4 | "description": "", 5 | "scripts": { 6 | "start": "cross-env TS_NODE_PROJECT=tsconfig-for-webpack-config.json NODE_ENV=development webpack --config ./webpack/dev.ts", 7 | "dll": "cross-env TS_NODE_PROJECT=tsconfig-for-webpack-config.json NODE_ENV=production webpack --config ./webpack/dll.ts", 8 | "watch": "npm start -- -w", 9 | "clean": "", 10 | "build": "cross-env TS_NODE_PROJECT=tsconfig-for-webpack-config.json NODE_ENV=production webpack --config ./webpack/pro.ts" 11 | }, 12 | "dependencies": { 13 | "@material-ui/core": "^4.0.2", 14 | "@material-ui/icons": "^4.0.1", 15 | "babel-polyfill": "^6.26.0", 16 | "classnames": "^2.2.6", 17 | "prop-types": "^15.7.2", 18 | "react": "^16.8.6", 19 | "react-dom": "^16.8.6", 20 | "react-router-dom": "^5.0.1" 21 | }, 22 | "devDependencies": { 23 | "@babel/core": "^7.4.5", 24 | "@types/classnames": "^2.2.8", 25 | "@types/material-ui": "^0.21.6", 26 | "@types/react": "^16.8.19", 27 | "@types/react-dom": "^16.8.4", 28 | "@types/uglifyjs-webpack-plugin": "^1.1.0", 29 | "@types/webpack": "^4.4.32", 30 | "@types/webpack-merge": "^4.1.5", 31 | "add-asset-html-webpack-plugin": "^3.1.3", 32 | "babel-core": "^6.26.3", 33 | "babel-eslint": "^10.0.1", 34 | "babel-loader": "^8.0.6", 35 | "babel-plugin-import": "^1.12.0", 36 | "babel-preset-env": "^1.7.0", 37 | "babel-preset-react": "^6.24.1", 38 | "cross-env": "^5.2.0", 39 | "css-loader": "^2.1.1", 40 | "ejs-loader": "^0.3.3", 41 | "eslint": "^5.16.0", 42 | "eslint-config-blued-react": "1.0.1", 43 | "eslint-plugin-import": "^2.17.3", 44 | "eslint-plugin-jsx-a11y": "^6.2.1", 45 | "eslint-plugin-react": "^7.13.0", 46 | "file-loader": "^4.0.0", 47 | "html-webpack-plugin": "^3.2.0", 48 | "image-webpack-loader": "^5.0.0", 49 | "less": "^3.9.0", 50 | "less-loader": "^5.0.0", 51 | "qiniu-webpack-plugin": "^0.4.2", 52 | "style-loader": "^0.23.1", 53 | "ts-loader": "^6.0.2", 54 | "ts-node": "^8.2.0", 55 | "tsconfig-paths": "^3.8.0", 56 | "uglifyjs-webpack-plugin": "^2.1.3", 57 | "webpack": "^4.33.0", 58 | "webpack-cli": "^3.3.3", 59 | "webpack-merge": "^4.2.1" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-example", 3 | "version": "1.0.0", 4 | "description": "example for typescript, with decorators (routing-controllers and sequelize)", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "NODE_ENV=local npm run serve", 8 | "build": "npm run build-ts && npm run copy-static-assets", 9 | "serve": "node dist/server.js", 10 | "watch-node": "NODE_ENV=local nodemon dist/server.js", 11 | "build-ts": "tsc", 12 | "watch-ts": "tsc -w", 13 | "tslint": "tslint -c tslint.json -p tsconfig.json", 14 | "copy-static-assets": "ts-node copy-static-assets.ts", 15 | "test": "mocha -r ts-node/register test/**/*.spec.ts" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/Jiasm/typescript-example.git" 20 | }, 21 | "keywords": [], 22 | "author": "", 23 | "license": "ISC", 24 | "dependencies": { 25 | "consolidate": "^0.15.1", 26 | "ejs": "^2.6.1", 27 | "koa": "^2.7.0", 28 | "koa-bodyparser": "^4.2.1", 29 | "koa-compose": "^4.1.0", 30 | "koa-multer": "^1.0.2", 31 | "koa-router": "^7.4.0", 32 | "koa-static": "^5.0.0", 33 | "koa-views": "^6.2.0", 34 | "mysql2": "^1.6.5", 35 | "reflect-metadata": "^0.1.13", 36 | "routing-controllers": "^0.7.7", 37 | "sequelize": "^5.15.1", 38 | "sequelize-typescript": "^0.6.11" 39 | }, 40 | "devDependencies": { 41 | "@types/chai": "^4.1.7", 42 | "@types/chai-http": "^4.2.0", 43 | "@types/consolidate": "0.0.35", 44 | "@types/core-js": "^2.5.0", 45 | "@types/jest": "^24.0.13", 46 | "@types/koa": "^2.0.48", 47 | "@types/koa-bodyparser": "^5.0.0", 48 | "@types/koa-compose": "^3.2.4", 49 | "@types/koa-router": "^7.0.40", 50 | "@types/koa-static": "^4.0.1", 51 | "@types/koa-views": "^2.0.3", 52 | "@types/mocha": "^5.2.7", 53 | "@types/mysql": "^2.15.6", 54 | "@types/node": "^12.0.7", 55 | "@types/shelljs": "^0.8.5", 56 | "@typescript-eslint/eslint-plugin": "^1.10.2", 57 | "chai": "^4.2.0", 58 | "chai-http": "^4.3.0", 59 | "eslint": "^5.16.0", 60 | "eslint-config-blued-typescript": "^1.0.1", 61 | "eslint-import-resolver-typescript": "^1.1.1", 62 | "eslint-plugin-import": "^2.17.3", 63 | "mocha": "^6.1.4", 64 | "nodemon": "^1.19.1", 65 | "shelljs": "^0.8.3", 66 | "ts-node": "^8.2.0", 67 | "tslint": "^5.17.0", 68 | "typescript": "^3.5.1" 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # typescript-example 2 | :pager: example for typescript, with decorators (routing-controllers and sequelize) 3 | 4 | ## dependence 5 | 6 | - [routing-controllers](https://github.com/typestack/routing-controllers) 7 | - [sequelize](https://github.com/sequelize/sequelize) 8 | - [sequelize-typescript](https://github.com/RobinBuschmann/sequelize-typescript) 9 | - [react](https://github.com/facebook/react) 10 | - [material-ui](https://github.com/mui-org/material-ui) 11 | - [webpack](https://github.com/webpack/webpack) 12 | - [eslint](https://github.com/webpack/webpack) 13 | 14 | ## usage 15 | 16 | ```bash 17 | > npm i 18 | > brew services start mysql 19 | > mysql -u root -p 20 | # 请自行修改config/backend/local.js 中的user、password 以及以下的database 21 | mysql> create database ts_test; 22 | mysql> use ts_test; 23 | mysql> CREATE TABLE `user_info_test` ( `uid` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(11) NOT NULL, `age` int(3) DEFAULT '0', `gender` int(1) NOT NULL, PRIMARY KEY (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 24 | 25 | > npm run watch-ts 26 | > npm run watch-node 27 | 28 | > curl http://127.0.0.1:8888/add/Niko/18/1 29 | > curl http://127.0.0.1:8888/add/Bellic/26/2 30 | 31 | > curl http://127.0.0.1:8888/list/ # [{name: Niko, ...}, {name: Bellic, ...}] 32 | > curl http://127.0.0.1:8888/list/filter/1 # [{name: Niko, ...}] 33 | ``` 34 | 35 | ## front-end 36 | 37 | 如果还想看TS在React中的使用,可以这样搞: 38 | ```bash 39 | > cd client-src 40 | > npm i 41 | > npm run dll 42 | > npm run start 43 | # 在确保上边的node服务是启动的情况下 44 | > open http://127.0.0.1:8888 45 | ``` 46 | 47 | ## run test 48 | 49 | 本示例存在一些简单的测试用例,可以在服务启动的情况下使用: 50 | ```bash 51 | npm test 52 | ``` 53 | 54 | ## 配套的一篇水文 55 | 56 | - [blog](https://blog.jiasm.org/2018/07/21/TypeScript%E5%9C%A8node%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E5%AE%9E%E8%B7%B5/) 57 | - [掘金](https://juejin.im/post/5b5413755188251aab713d14) 58 | - [思否](https://segmentfault.com/a/1190000015719697) 59 | 60 | ### 关于React的水文地址 61 | 62 | - [blog](https://blog.jiasm.org/2018/08/26/TypeScript%E5%9C%A8react%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E5%AE%9E%E8%B7%B5/) 63 | - [掘金](https://juejin.im/post/5b83a02ff265da43737e9a27) 64 | - [思否](https://segmentfault.com/a/1190000016163937) 65 | 66 | ### 最后一公里 - webpack 与 mocha/chai 67 | 68 | - [blog](https://blog.jiasm.org/2018/09/03/%E4%BD%BF%E7%94%A8-TypeScript-%E6%94%B9%E9%80%A0%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B/) 69 | - [掘金](https://juejin.im/post/5b8ca576e51d4538e6334bcd) 70 | - [思否](https://segmentfault.com/a/1190000016247815) -------------------------------------------------------------------------------- /client-src/webpack/pro.ts: -------------------------------------------------------------------------------- 1 | import merge from 'webpack-merge' 2 | import path from 'path' 3 | import HtmlWebpackPlugin from 'html-webpack-plugin' 4 | import UglifyJsPlugin from 'uglifyjs-webpack-plugin' 5 | import QiniuPlugin from 'qiniu-webpack-plugin' 6 | import baseConfig from './base' 7 | 8 | const qntoken = { 9 | // 如果使用七牛的童鞋,可以自行输入token之类的参数体验 10 | accessKey: '', 11 | secretKey: '', 12 | bucket: '', 13 | cdnBase: '', 14 | } 15 | 16 | const cdnPath = '/XXX' 17 | 18 | module.exports = merge(baseConfig, { 19 | output: { 20 | filename: 'bundle-[hash].js', 21 | publicPath: `${qntoken.cdnBase}/${cdnPath}`, 22 | }, 23 | devtool: false, 24 | module: { 25 | rules: [ 26 | { 27 | test: /\.(gif|png|jpe?g|svg)$/, 28 | use: [ 29 | { 30 | loader: 'file-loader', 31 | options: { 32 | name: '[name]-[hash].[ext]', 33 | publicPath: `${qntoken.cdnBase}/${cdnPath}`, 34 | }, 35 | }, 36 | { 37 | loader: 'image-webpack-loader', 38 | options: { 39 | optipng: { 40 | optimizationLevel: 7, 41 | }, 42 | gifsicle: { 43 | interlaced: false, 44 | }, 45 | pngquant: { 46 | quality: '65-90', 47 | speed: 4, 48 | }, 49 | mozjpeg: { 50 | progressive: true, 51 | quality: 65, 52 | }, 53 | svgo: { 54 | plugins: [ 55 | { removeViewBox: false }, 56 | { removeEmptyAttrs: false }, 57 | ], 58 | }, 59 | }, 60 | }, 61 | ], 62 | }, 63 | ], 64 | }, 65 | plugins: [ 66 | new HtmlWebpackPlugin({ 67 | template: path.resolve(__dirname, '../index.ejs'), 68 | filename: path.resolve(__dirname, '../../views/index.ejs'), 69 | }), 70 | new UglifyJsPlugin({ 71 | uglifyOptions: { 72 | compress: { 73 | warnings: false, 74 | drop_console: true, 75 | collapse_vars: true, 76 | reduce_vars: true, 77 | }, 78 | }, 79 | }), 80 | new QiniuPlugin({ 81 | ACCESS_KEY: qntoken.accessKey, 82 | SECRET_KEY: qntoken.secretKey, 83 | bucket: qntoken.bucket, 84 | path: cdnPath, 85 | // 支持上传的文件 86 | include: [ 87 | /\.js$/, 88 | /\.css$/, 89 | /\.(gif|png|jpe?g|svg)$/, 90 | ], 91 | }), 92 | ], 93 | }) -------------------------------------------------------------------------------- /client-src/components/add.tsx: -------------------------------------------------------------------------------- 1 | import React, { ChangeEvent } from 'react' 2 | import { withStyles, createStyles, Theme } from '@material-ui/core/styles' 3 | import { Input, InputLabel, FormControl, RadioGroup, FormControlLabel, Radio, Button } from '@material-ui/core' 4 | 5 | const styles = (theme: Theme) => createStyles({ 6 | group: { 7 | flexDirection: 'row', 8 | margin: `${theme.spacing.unit}px 0`, 9 | }, 10 | container: { 11 | display: 'flex', 12 | flexWrap: 'wrap', 13 | }, 14 | margin: { 15 | margin: theme.spacing.unit, 16 | }, 17 | button: { 18 | margin: theme.spacing.unit, 19 | height: 40, 20 | alignSelf: 'center', 21 | }, 22 | }) 23 | 24 | class Add extends React.Component<{ 25 | classes: any 26 | theme: Theme 27 | }> { 28 | state = { 29 | gender: '1', 30 | nickname: '', 31 | age: '', 32 | } 33 | 34 | handleChange = (type: string) => (event: ChangeEvent) => { 35 | this.setState({ [type]: event.target.value }) 36 | } 37 | 38 | nicknameChange = this.handleChange('nickname') 39 | 40 | ageChange = this.handleChange('age') 41 | 42 | genderChange = this.handleChange('gender') 43 | 44 | addNewUser = async () => { 45 | const { nickname, age, gender } = this.state 46 | 47 | const res = await fetch(`/add/${nickname}/${age}/${gender}`) 48 | } 49 | 50 | render() { 51 | const { classes } = this.props 52 | const { nickname, age, gender } = this.state 53 | 54 | return ( 55 |
56 | 57 | 58 | 昵称 59 | 60 | 65 | 66 | 67 | 68 | 年龄 69 | 70 | 76 | 77 | 78 | 85 | } label="Female" /> 86 | } label="Male" /> 87 | 88 | 89 | 92 |
93 | ) 94 | } 95 | } 96 | export default withStyles(styles)(Add) -------------------------------------------------------------------------------- /client-src/components/list.tsx: -------------------------------------------------------------------------------- 1 | import React, { ChangeEvent } from 'react' 2 | import { withStyles, createStyles, Theme } from '@material-ui/core/styles' 3 | import { Table, TableHead, TableBody, TableRow, TableCell, FormControl, RadioGroup, FormControlLabel, Radio, Button } from '@material-ui/core' 4 | import { Gender } from '../config' 5 | 6 | const styles = (theme: Theme) => createStyles({ 7 | root: { 8 | width: '100%', 9 | marginTop: theme.spacing.unit * 3, 10 | overflowX: 'auto', 11 | }, 12 | container: { 13 | display: 'flex', 14 | flexWrap: 'wrap', 15 | }, 16 | group: { 17 | flexDirection: 'row', 18 | margin: `${theme.spacing.unit}px 0`, 19 | }, 20 | margin: { 21 | margin: theme.spacing.unit, 22 | }, 23 | button: { 24 | margin: theme.spacing.unit, 25 | height: 40, 26 | alignSelf: 'center', 27 | }, 28 | }) 29 | 30 | class List extends React.Component<{ 31 | classes: any 32 | theme: Theme 33 | }> { 34 | state: { 35 | rows: Array<{ 36 | uid: number 37 | name: string 38 | age: number 39 | gender: number 40 | }> 41 | gender: string 42 | } = { 43 | rows: [], 44 | gender: '0', 45 | }; 46 | 47 | componentDidMount() { 48 | this.getData() 49 | } 50 | 51 | handleChange = (event: ChangeEvent) => { 52 | this.setState({ gender: event.target.value }) 53 | } 54 | 55 | getData = async () => { 56 | const { gender } = this.state 57 | const res = await fetch(Number(gender) in Gender ? `/list/filter/${gender}` : '/list') 58 | 59 | const { data } = await res.json() 60 | 61 | this.setState({ 62 | rows: data, 63 | }) 64 | } 65 | 66 | render() { 67 | const { classes } = this.props 68 | const { gender, rows } = this.state 69 | 70 | return ( 71 |
72 |
73 | 74 | 80 | } label="Female" /> 81 | } label="Male" /> 82 | } label="All" /> 83 | 84 | 85 | 88 |
89 | 90 | 91 | 92 | # 93 | Name 94 | Age 95 | Gender 96 | 97 | 98 | 99 | {rows.map((row, index) => ( 100 | 101 | 102 | {index + 1} 103 | 104 | {row.name} 105 | {row.age} 106 | {row.gender === Gender.Male ? 'Male' : 'Female'} 107 | 108 | ))} 109 | 110 |
111 |
112 | ) 113 | } 114 | } 115 | export default withStyles(styles)(List) -------------------------------------------------------------------------------- /client-src/components/app.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import classNames from 'classnames' 3 | import Drawer from '@material-ui/core/Drawer' 4 | import AppBar from '@material-ui/core/AppBar' 5 | import Toolbar from '@material-ui/core/Toolbar' 6 | import Typography from '@material-ui/core/Typography' 7 | import IconButton from '@material-ui/core/IconButton' 8 | import Paper from '@material-ui/core/Paper' 9 | import MenuIcon from '@material-ui/icons/Menu' 10 | import { withStyles, createStyles, Theme } from '@material-ui/core/styles' 11 | import ChevronLeftIcon from '@material-ui/icons/ChevronLeft' 12 | import ChevronRightIcon from '@material-ui/icons/ChevronRight' 13 | import Index from './index' 14 | import SlideBar from './slide-bar' 15 | 16 | const drawerWidth = 300 17 | 18 | const styles = (theme: Theme) => createStyles({ 19 | root: { 20 | flexGrow: 1, 21 | height: '100%', 22 | width: '100%', 23 | zIndex: 1, 24 | overflow: 'hidden', 25 | position: 'absolute', 26 | display: 'flex', 27 | left: 0, 28 | top: 0, 29 | }, 30 | appBar: { 31 | zIndex: theme.zIndex.drawer + 1, 32 | transition: theme.transitions.create(['width', 'margin'], { 33 | easing: theme.transitions.easing.sharp, 34 | duration: theme.transitions.duration.leavingScreen, 35 | }), 36 | }, 37 | appBarShift: { 38 | marginLeft: drawerWidth, 39 | width: `calc(100% - ${drawerWidth}px)`, 40 | transition: theme.transitions.create(['width', 'margin'], { 41 | easing: theme.transitions.easing.sharp, 42 | duration: theme.transitions.duration.enteringScreen, 43 | }), 44 | }, 45 | menuButton: { 46 | marginLeft: 12, 47 | marginRight: 36, 48 | }, 49 | hide: { 50 | display: 'none', 51 | }, 52 | drawerPaper: { 53 | position: 'relative', 54 | whiteSpace: 'nowrap', 55 | width: drawerWidth, 56 | transition: theme.transitions.create('width', { 57 | easing: theme.transitions.easing.sharp, 58 | duration: theme.transitions.duration.enteringScreen, 59 | }), 60 | }, 61 | drawerPaperClose: { 62 | overflowX: 'hidden', 63 | transition: theme.transitions.create('width', { 64 | easing: theme.transitions.easing.sharp, 65 | duration: theme.transitions.duration.leavingScreen, 66 | }), 67 | width: theme.spacing.unit * 7, 68 | [theme.breakpoints.up('sm')]: { 69 | width: theme.spacing.unit * 9, 70 | }, 71 | }, 72 | toolbar: { 73 | display: 'flex', 74 | alignItems: 'center', 75 | justifyContent: 'flex-end', 76 | padding: '0 8px', 77 | ...theme.mixins.toolbar, 78 | }, 79 | content: { 80 | flexGrow: 1, 81 | backgroundColor: theme.palette.background.default, 82 | padding: theme.spacing.unit * 3, 83 | overflow: 'scroll', 84 | }, 85 | paper: { 86 | ...theme.mixins.gutters(), 87 | paddingTop: theme.spacing.unit * 2, 88 | paddingBottom: theme.spacing.unit * 2, 89 | minHeight: 400, 90 | display: 'flex', 91 | }, 92 | }) 93 | 94 | class App extends React.Component<{ 95 | classes: any 96 | theme: Theme 97 | }> { 98 | state = { 99 | open: false, 100 | } 101 | 102 | handleDrawerOpen = () => { 103 | this.setState({ open: true }) 104 | } 105 | 106 | handleDrawerClose = () => { 107 | this.setState({ open: false }) 108 | } 109 | 110 | render() { 111 | const { classes, theme } = this.props 112 | const { open } = this.state 113 | 114 | return ( 115 |
116 | 120 | 121 | 127 | 128 | 129 | 130 | 一个简单的Demo页面 131 | 132 | 133 | 134 | 141 |
142 | 143 | {theme.direction === 'rtl' ? : } 144 | 145 |
146 | 147 |
148 |
149 | 150 | 151 | 152 | 153 |
154 |
155 | ) 156 | } 157 | } 158 | 159 | export default withStyles(styles, { 160 | withTheme: true, 161 | })(App) 162 | 163 | -------------------------------------------------------------------------------- /client-src/dist/vendors-manifest.json: -------------------------------------------------------------------------------- 1 | {"name":"vendors_lib","content":{"../node_modules/babel-polyfill/node_modules/core-js/modules/_export.js":{"id":0,"buildMeta":{"providedExports":true}},"../node_modules/prop-types/index.js":{"id":1,"buildMeta":{"providedExports":true}},"../node_modules/react/index.js":{"id":2,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_an-object.js":{"id":3,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_global.js":{"id":4,"buildMeta":{"providedExports":true}},"../node_modules/history/es/PathUtils.js":{"id":5,"buildMeta":{"exportsType":"namespace","providedExports":["addLeadingSlash","stripLeadingSlash","hasBasename","stripBasename","stripTrailingSlash","parsePath","createPath"]}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_fails.js":{"id":6,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_is-object.js":{"id":7,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_wks.js":{"id":8,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_descriptors.js":{"id":9,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dp.js":{"id":10,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-length.js":{"id":11,"buildMeta":{"providedExports":true}},"../node_modules/warning/warning.js":{"id":12,"buildMeta":{"providedExports":true}},"../node_modules/invariant/browser.js":{"id":13,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-object.js":{"id":14,"buildMeta":{"providedExports":true}},"../node_modules/history/node_modules/warning/browser.js":{"id":15,"buildMeta":{"providedExports":true}},"../node_modules/history/es/index.js":{"id":16,"buildMeta":{"exportsType":"namespace","providedExports":["createBrowserHistory","createHashHistory","createMemoryHistory","createLocation","locationsAreEqual","parsePath","createPath"]}},"../node_modules/history/es/LocationUtils.js":{"id":17,"buildMeta":{"exportsType":"namespace","providedExports":["createLocation","locationsAreEqual"]}},"../node_modules/history/es/DOMUtils.js":{"id":18,"buildMeta":{"exportsType":"namespace","providedExports":["canUseDOM","addEventListener","removeEventListener","getConfirmation","supportsHistory","supportsPopStateOnHashChange","supportsGoWithoutReloadUsingHash","isExtraneousPopstateEvent"]}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_a-function.js":{"id":19,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_hide.js":{"id":20,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine.js":{"id":21,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-html.js":{"id":22,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_has.js":{"id":23,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-iobject.js":{"id":24,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopd.js":{"id":25,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gpo.js":{"id":26,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_core.js":{"id":27,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_ctx.js":{"id":28,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_cof.js":{"id":29,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_strict-method.js":{"id":30,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-primitive.js":{"id":31,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_defined.js":{"id":32,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-integer.js":{"id":33,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-sap.js":{"id":34,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-methods.js":{"id":35,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-array.js":{"id":36,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_metadata.js":{"id":37,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_meta.js":{"id":38,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_library.js":{"id":39,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_add-to-unscopables.js":{"id":40,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_property-desc.js":{"id":41,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_uid.js":{"id":42,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys.js":{"id":43,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-absolute-index.js":{"id":44,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-create.js":{"id":45,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn.js":{"id":46,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_set-species.js":{"id":47,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_an-instance.js":{"id":48,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_for-of.js":{"id":49,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_redefine-all.js":{"id":50,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_set-to-string-tag.js":{"id":51,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-trim.js":{"id":52,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iterators.js":{"id":53,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_validate-collection.js":{"id":54,"buildMeta":{"providedExports":true}},"../node_modules/react-router-dom/es/Router.js":{"id":55,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/history/es/createTransitionManager.js":{"id":56,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/Router.js":{"id":57,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/matchPath.js":{"id":58,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iobject.js":{"id":59,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-pie.js":{"id":60,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_classof.js":{"id":61,"buildMeta":{"providedExports":true}},"../node_modules/react-router-dom/es/Link.js":{"id":62,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/generatePath.js":{"id":63,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_shared.js":{"id":64,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-includes.js":{"id":65,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gops.js":{"id":66,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array.js":{"id":67,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_is-regexp.js":{"id":68,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-detect.js":{"id":69,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_flags.js":{"id":70,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_fix-re-wks.js":{"id":71,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_species-constructor.js":{"id":72,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_user-agent.js":{"id":73,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_collection.js":{"id":74,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_typed.js":{"id":75,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-forced-pam.js":{"id":76,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-of.js":{"id":77,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_set-collection-from.js":{"id":78,"buildMeta":{"providedExports":true}},"../node_modules/react-router-dom/es/Route.js":{"id":79,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/Route.js":{"id":80,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/path-to-regexp/index.js":{"id":81,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_dom-create.js":{"id":82,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-define.js":{"id":83,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_shared-key.js":{"id":84,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-bug-keys.js":{"id":85,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_html.js":{"id":86,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_set-proto.js":{"id":87,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-ws.js":{"id":88,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_inherit-if-required.js":{"id":89,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-repeat.js":{"id":90,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_math-sign.js":{"id":91,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_math-expm1.js":{"id":92,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-at.js":{"id":93,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-define.js":{"id":94,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-create.js":{"id":95,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-context.js":{"id":96,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_fails-is-regexp.js":{"id":97,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_is-array-iter.js":{"id":98,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_create-property.js":{"id":99,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/core.get-iterator-method.js":{"id":100,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-create.js":{"id":101,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-fill.js":{"id":102,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.iterator.js":{"id":103,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_task.js":{"id":104,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_microtask.js":{"id":105,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_new-promise-capability.js":{"id":106,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_typed-buffer.js":{"id":107,"buildMeta":{"providedExports":true}},"../node_modules/object-assign/index.js":{"id":108,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/invariant.js":{"id":109,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/emptyObject.js":{"id":110,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/emptyFunction.js":{"id":111,"buildMeta":{"providedExports":true}},"../node_modules/react-router-dom/es/BrowserRouter.js":{"id":112,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/history/es/createBrowserHistory.js":{"id":113,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/history/es/createHashHistory.js":{"id":114,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/history/es/createMemoryHistory.js":{"id":115,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/HashRouter.js":{"id":116,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/MemoryRouter.js":{"id":117,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/NavLink.js":{"id":118,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/Prompt.js":{"id":119,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/Redirect.js":{"id":120,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/StaticRouter.js":{"id":121,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/Switch.js":{"id":122,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/generatePath.js":{"id":123,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/matchPath.js":{"id":124,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router-dom/es/withRouter.js":{"id":125,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/webpack/buildin/global.js":{"id":126,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_ie8-dom-define.js":{"id":127,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_wks-ext.js":{"id":128,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-keys-internal.js":{"id":129,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-dps.js":{"id":130,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-gopn-ext.js":{"id":131,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-assign.js":{"id":132,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_bind.js":{"id":133,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_invoke.js":{"id":134,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-int.js":{"id":135,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_parse-float.js":{"id":136,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_a-number-value.js":{"id":137,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_is-integer.js":{"id":138,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_math-log1p.js":{"id":139,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_math-fround.js":{"id":140,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-call.js":{"id":141,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-reduce.js":{"id":142,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-copy-within.js":{"id":143,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_iter-step.js":{"id":144,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.flags.js":{"id":145,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_perform.js":{"id":146,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_promise-resolve.js":{"id":147,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.map.js":{"id":148,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-strong.js":{"id":149,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.set.js":{"id":150,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-map.js":{"id":151,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-weak.js":{"id":152,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_to-index.js":{"id":153,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_own-keys.js":{"id":154,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_flatten-into-array.js":{"id":155,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_string-pad.js":{"id":156,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js":{"id":157,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_collection-to-json.js":{"id":158,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-from-iterable.js":{"id":159,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_math-scale.js":{"id":160,"buildMeta":{"providedExports":true}},"../node_modules/resolve-pathname/index.js":{"id":161,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/value-equal/index.js":{"id":162,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/MemoryRouter.js":{"id":163,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/Prompt.js":{"id":164,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/Redirect.js":{"id":165,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/StaticRouter.js":{"id":166,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/Switch.js":{"id":167,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/react-router/es/withRouter.js":{"id":168,"buildMeta":{"exportsType":"namespace","providedExports":["default"]}},"../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js":{"id":169,"buildMeta":{"providedExports":true}},"../node_modules/react/cjs/react.production.min.js":{"id":171,"buildMeta":{"providedExports":true}},"../node_modules/react-dom/index.js":{"id":172,"buildMeta":{"providedExports":true}},"../node_modules/react-dom/cjs/react-dom.production.min.js":{"id":173,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/ExecutionEnvironment.js":{"id":174,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/getActiveElement.js":{"id":175,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/shallowEqual.js":{"id":176,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/containsNode.js":{"id":177,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/isTextNode.js":{"id":178,"buildMeta":{"providedExports":true}},"../node_modules/fbjs/lib/isNode.js":{"id":179,"buildMeta":{"providedExports":true}},"../node_modules/react-router-dom/es/index.js":{"id":180,"buildMeta":{"exportsType":"namespace","providedExports":["BrowserRouter","HashRouter","Link","MemoryRouter","NavLink","Prompt","Redirect","Route","Router","StaticRouter","Switch","generatePath","matchPath","withRouter"]}},"../node_modules/prop-types/factoryWithThrowingShims.js":{"id":181,"buildMeta":{"providedExports":true}},"../node_modules/prop-types/lib/ReactPropTypesSecret.js":{"id":182,"buildMeta":{"providedExports":true}},"../node_modules/isarray/index.js":{"id":183,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/lib/index.js":{"id":184,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/shim.js":{"id":185,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.symbol.js":{"id":186,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_enum-keys.js":{"id":187,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.create.js":{"id":188,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-property.js":{"id":189,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.define-properties.js":{"id":190,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js":{"id":191,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-prototype-of.js":{"id":192,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.keys.js":{"id":193,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.get-own-property-names.js":{"id":194,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.freeze.js":{"id":195,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.seal.js":{"id":196,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.prevent-extensions.js":{"id":197,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-frozen.js":{"id":198,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-sealed.js":{"id":199,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is-extensible.js":{"id":200,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.assign.js":{"id":201,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.is.js":{"id":202,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_same-value.js":{"id":203,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.set-prototype-of.js":{"id":204,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.object.to-string.js":{"id":205,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.bind.js":{"id":206,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.name.js":{"id":207,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.function.has-instance.js":{"id":208,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-int.js":{"id":209,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.parse-float.js":{"id":210,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.constructor.js":{"id":211,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-fixed.js":{"id":212,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.to-precision.js":{"id":213,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.epsilon.js":{"id":214,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-finite.js":{"id":215,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-integer.js":{"id":216,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-nan.js":{"id":217,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.is-safe-integer.js":{"id":218,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.max-safe-integer.js":{"id":219,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.min-safe-integer.js":{"id":220,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-float.js":{"id":221,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.number.parse-int.js":{"id":222,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.acosh.js":{"id":223,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.asinh.js":{"id":224,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.atanh.js":{"id":225,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cbrt.js":{"id":226,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.clz32.js":{"id":227,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.cosh.js":{"id":228,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.expm1.js":{"id":229,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.fround.js":{"id":230,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.hypot.js":{"id":231,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.imul.js":{"id":232,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log10.js":{"id":233,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log1p.js":{"id":234,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.log2.js":{"id":235,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sign.js":{"id":236,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.sinh.js":{"id":237,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.tanh.js":{"id":238,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.math.trunc.js":{"id":239,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.from-code-point.js":{"id":240,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.raw.js":{"id":241,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.trim.js":{"id":242,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.iterator.js":{"id":243,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.code-point-at.js":{"id":244,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.ends-with.js":{"id":245,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.includes.js":{"id":246,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.repeat.js":{"id":247,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.starts-with.js":{"id":248,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.anchor.js":{"id":249,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.big.js":{"id":250,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.blink.js":{"id":251,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.bold.js":{"id":252,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fixed.js":{"id":253,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontcolor.js":{"id":254,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.fontsize.js":{"id":255,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.italics.js":{"id":256,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.link.js":{"id":257,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.small.js":{"id":258,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.strike.js":{"id":259,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sub.js":{"id":260,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.string.sup.js":{"id":261,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.now.js":{"id":262,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-json.js":{"id":263,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-iso-string.js":{"id":264,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-iso-string.js":{"id":265,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-string.js":{"id":266,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.date.to-primitive.js":{"id":267,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_date-to-primitive.js":{"id":268,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.is-array.js":{"id":269,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.from.js":{"id":270,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.of.js":{"id":271,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.join.js":{"id":272,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.slice.js":{"id":273,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.sort.js":{"id":274,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.for-each.js":{"id":275,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_array-species-constructor.js":{"id":276,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.map.js":{"id":277,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.filter.js":{"id":278,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.some.js":{"id":279,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.every.js":{"id":280,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce.js":{"id":281,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.reduce-right.js":{"id":282,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.index-of.js":{"id":283,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.last-index-of.js":{"id":284,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.copy-within.js":{"id":285,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.fill.js":{"id":286,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find.js":{"id":287,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.find-index.js":{"id":288,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.array.species.js":{"id":289,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.constructor.js":{"id":290,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.to-string.js":{"id":291,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.match.js":{"id":292,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.replace.js":{"id":293,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.search.js":{"id":294,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.regexp.split.js":{"id":295,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.promise.js":{"id":296,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.weak-set.js":{"id":297,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.array-buffer.js":{"id":298,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.data-view.js":{"id":299,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int8-array.js":{"id":300,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-array.js":{"id":301,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js":{"id":302,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int16-array.js":{"id":303,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint16-array.js":{"id":304,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.int32-array.js":{"id":305,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.uint32-array.js":{"id":306,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float32-array.js":{"id":307,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.typed.float64-array.js":{"id":308,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.apply.js":{"id":309,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.construct.js":{"id":310,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.define-property.js":{"id":311,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.delete-property.js":{"id":312,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.enumerate.js":{"id":313,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get.js":{"id":314,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js":{"id":315,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.get-prototype-of.js":{"id":316,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.has.js":{"id":317,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.is-extensible.js":{"id":318,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.own-keys.js":{"id":319,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.prevent-extensions.js":{"id":320,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set.js":{"id":321,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es6.reflect.set-prototype-of.js":{"id":322,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.includes.js":{"id":323,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flat-map.js":{"id":324,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.array.flatten.js":{"id":325,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.at.js":{"id":326,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-start.js":{"id":327,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.pad-end.js":{"id":328,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-left.js":{"id":329,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.trim-right.js":{"id":330,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.string.match-all.js":{"id":331,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.async-iterator.js":{"id":332,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.symbol.observable.js":{"id":333,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js":{"id":334,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js":{"id":335,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.entries.js":{"id":336,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-getter.js":{"id":337,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.define-setter.js":{"id":338,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-getter.js":{"id":339,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.lookup-setter.js":{"id":340,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.to-json.js":{"id":341,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.to-json.js":{"id":342,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.of.js":{"id":343,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.of.js":{"id":344,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.of.js":{"id":345,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.of.js":{"id":346,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.map.from.js":{"id":347,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.set.from.js":{"id":348,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-map.from.js":{"id":349,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.weak-set.from.js":{"id":350,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.global.js":{"id":351,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.system.global.js":{"id":352,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.error.is-error.js":{"id":353,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.clamp.js":{"id":354,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.deg-per-rad.js":{"id":355,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.degrees.js":{"id":356,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.fscale.js":{"id":357,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.iaddh.js":{"id":358,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.isubh.js":{"id":359,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.imulh.js":{"id":360,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.rad-per-deg.js":{"id":361,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.radians.js":{"id":362,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.scale.js":{"id":363,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.umulh.js":{"id":364,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.math.signbit.js":{"id":365,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.finally.js":{"id":366,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.promise.try.js":{"id":367,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.define-metadata.js":{"id":368,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.delete-metadata.js":{"id":369,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata.js":{"id":370,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js":{"id":371,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata.js":{"id":372,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js":{"id":373,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-metadata.js":{"id":374,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.has-own-metadata.js":{"id":375,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.reflect.metadata.js":{"id":376,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.asap.js":{"id":377,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/es7.observable.js":{"id":378,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/web.timers.js":{"id":379,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/web.immediate.js":{"id":380,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/web.dom.iterable.js":{"id":381,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/regenerator-runtime/runtime.js":{"id":382,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/fn/regexp/escape.js":{"id":383,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/core.regexp.escape.js":{"id":384,"buildMeta":{"providedExports":true}},"../node_modules/babel-polyfill/node_modules/core-js/modules/_replacer.js":{"id":385,"buildMeta":{"providedExports":true}}}} --------------------------------------------------------------------------------