st 8 years ago babel-loader 11e3a9652a first 8 years ago babel-messages 11e3a9652a first 8 years ago babel-plugin-check-es2015-constants 11e3a9652a first 8 years ago babel-plugin-dynamic-import-node 11e3a9652a first 8 years ago babel-plugin-istanbul 11e3a9652a first 8 years ago babel-plugin-jest-hoist 11e3a9652a first 8 years ago babel-plugin-jsx-event-modifiers 11e3a9652a first 8 years ago babel-plugin-jsx-v-model 11e3a9652a first 8 years ago babel-plugin-jsx-vue-functional 11e3a9652a first 8 years ago babel-plugin-syntax-async-functions 11e3a9652a first 8 years ago babel-plugin-syntax-async-generators 11e3a9652a first 8 years ago babel-plugin-syntax-class-properties 11e3a9652a first 8 years ago babel-plugin-syntax-decorators 11e3a9652a first 8 years ago babel-plugin-syntax-dynamic-import 11e3a9652a first 8 years ago babel-plugin-syntax-exponentiation-operator 11e3a9652a first 8 years ago babel-plugin-syntax-jsx 11e3a9652a first 8 years ago babel-plugin-syntax-object-rest-spread 11e3a9652a first 8 years ago babel-plugin-syntax-trailing-function-commas 11e3a9652a first 8 years ago babel-plugin-transform-async-generator-functions 11e3a9652a first 8 years ago babel-plugin-transform-async-to-generator 11e3a9652a first 8 years ago babel-plugin-transform-class-properties 11e3a9652a first 8 years ago babel-plugin-transform-decorators 11e3a9652a first 8 years ago babel-plugin-transform-es2015-arrow-functions 11e3a9652a first 8 years ago babel-plugin-transform-es2015-block-scoped-functions 11e3a9652a first 8 years ago babel-plugin-transform-es2015-block-scoping 11e3a9652a first 8 years ago babel-plugin-transform-es2015-classes 11e3a9652a first 8 years ago babel-plugin-transform-es2015-computed-properties 11e3a9652a first 8 years ago babel-plugin-transform-es2015-destructuring 11e3a9652a first 8 years ago babel-plugin-transform-es2015-duplicate-keys 11e3a9652a first 8 years ago babel-plugin-transform-es2015-for-of 11e3a9652a first 8 years ago babel-plugin-transform-es2015-function-name 11e3a9652a first 8 years ago babel-plugin-transform-es2015-literals 11e3a9652a first 8 years ago babel-plugin-transform-es2015-modules-amd 11e3a9652a first 8 years ago babel-plugin-transform-es2015-modules-commonjs 11e3a9652a first 8 years ago babel-plugin-transform-es2015-modules-systemjs 11e3a9652a first 8 years ago babel-plugin-transform-es2015-modules-umd 11e3a9652a first 8 years ago babel-plugin-transform-es2015-object-super 11e3a9652a first 8 years ago babel-plugin-transform-es2015-parameters 11e3a9652a first 8 years ago babel-plugin-transform-es2015-shorthand-properties 11e3a9652a first 8 years ago babel-plugin-transform-es2015-spread 11e3a9652a first 8 years ago babel-plugin-transform-es2015-sticky-regex 11e3a9652a first 8 years ago babel-plugin-transform-es2015-template-literals 11e3a9652a first 8 years ago babel-plugin-transform-es2015-typeof-symbol 11e3a9652a first 8 years ago babel-plugin-transform-es2015-unicode-regex 11e3a9652a first 8 years ago babel-plugin-transform-exponentiation-operator 11e3a9652a first 8 years ago babel-plugin-transform-object-rest-spread 11e3a9652a first 8 years ago babel-plugin-transform-regenerator 11e3a9652a first 8 years ago babel-plugin-transform-runtime 11e3a9652a first 8 years ago babel-plugin-transform-strict-mode 11e3a9652a first 8 years ago babel-plugin-transform-vue-jsx 11e3a9652a first 8 years ago babel-preset-env 11e3a9652a first 8 years ago babel-preset-jest 11e3a9652a first 8 years ago babel-preset-stage-2 11e3a9652a first 8 years ago babel-preset-stage-3 11e3a9652a first 8 years ago babel-preset-vue 11e3a9652a first 8 years ago babel-preset-vue-app 11e3a9652a first 8 years ago babel-register 11e3a9652a first 8 years ago babel-runtime 11e3a9652a first 8 years ago babel-template 11e3a9652a first 8 years ago babel-traverse 11e3a9652a first 8 years ago babel-types 11e3a9652a first 8 years ago babylon 11e3a9652a first 8 years ago balanced-match 11e3a9652a first 8 years ago base 11e3a9652a first 8 years ago base64-js 11e3a9652a first 8 years ago batch 11e3a9652a first 8 years ago bcrypt-pbkdf 11e3a9652a first 8 years ago bfj-node4 11e3a9652a first 8 years ago big.js 11e3a9652a first 8 years ago binary-extensions 11e3a9652a first 8 years ago block-stream 11e3a9652a first 8 years ago bluebird 11e3a9652a first 8 years ago bn.js 11e3a9652a first 8 years ago body-parser 11e3a9652a first 8 years ago bonjour 11e3a9652a first 8 years ago boolbase 11e3a9652a first 8 years ago boom 11e3a9652a first 8 years ago brace-expansion 11e3a9652a first 8 years ago braces 11e3a9652a first 8 years ago brorand 11e3a9652a first 8 years ago browser-process-hrtime 11e3a9652a first 8 years ago browser-resolve 11e3a9652a first 8 years ago browser-stdout 11e3a9652a first 8 years ago browserify-aes 11e3a9652a first 8 years ago browserify-cipher 11e3a9652a first 8 years ago browserify-des 11e3a9652a first 8 years ago browserify-rsa 11e3a9652a first 8 years ago browserify-sign 11e3a9652a first 8 years ago browserify-zlib 11e3a9652a first 8 years ago browserslist 11e3a9652a first 8 years ago bser 11e3a9652a first 8 years ago buffer 11e3a9652a first 8 years ago buffer-indexof 11e3a9652a first 8 years ago buffer-xor 11e3a9652a first 8 years ago builtin-modules 11e3a9652a first 8 years ago builtin-status-codes 11e3a9652a first 8 years ago bytes 11e3a9652a first 8 years ago cacache 11e3a9652a first 8 years ago cache-base 11e3a9652a first 8 years ago caller-path 11e3a9652a first 8 years ago callsites 11e3a9652a first 8 years ago camel-case 11e3a9652a first 8 years ago camelcase 11e3a9652a first 8 years ago camelcase-keys 11e3a9652a first 8 years ago caniuse-api 11e3a9652a first 8 years ago caniuse-db 11e3a9652a first 8 years ago caniuse-lite 11e3a9652a first 8 years ago caseless 11e3a9652a first 8 years ago center-align 11e3a9652a first 8 years ago chai-nightwatch 11e3a9652a first 8 years ago chalk 11e3a9652a first 8 years ago chardet 11e3a9652a first 8 years ago check-types 11e3a9652a first 8 years ago chokidar 11e3a9652a first 8 years ago chownr 11e3a9652a first 8 years ago chromedriver 11e3a9652a first 8 years ago ci-info 11e3a9652a first 8 years ago cipher-base 11e3a9652a first 8 years ago circular-json 11e3a9652a first 8 years ago clap 11e3a9652a first 8 years ago class-utils 11e3a9652a first 8 years ago clean-css 11e3a9652a first 8 years ago cli-cursor 11e3a9652a first 8 years ago cli-spinners 11e3a9652a first 8 years ago cli-width 11e3a9652a first 8 years ago cliui 11e3a9652a first 8 years ago clone 11e3a9652a first 8 years ago clone-deep 11e3a9652a first 8 years ago co 11e3a9652a first 8 years ago coa 11e3a9652a first 8 years ago coalescy 11e3a9652a first 8 years ago code-point-at 11e3a9652a first 8 years ago collection-visit 11e3a9652a first 8 years ago color 11e3a9652a first 8 years ago color-convert 11e3a9652a first 8 years ago color-name 11e3a9652a first 8 years ago color-string 11e3a9652a first 8 years ago colormin 11e3a9652a first 8 years ago colors 11e3a9652a first 8 years ago combined-stream 11e3a9652a first 8 years ago commander 11e3a9652a first 8 years ago commondir 11e3a9652a first 8 years ago compare-versions 11e3a9652a first 8 years ago component-emitter 11e3a9652a first 8 years ago compressible 11e3a9652a first 8 years ago compression 11e3a9652a first 8 years ago concat-map 11e3a9652a first 8 years ago concat-stream 11e3a9652a first 8 years ago condense-newlines 11e3a9652a first 8 years ago config-chain 11e3a9652a first 8 years ago connect-history-api-fallback 11e3a9652a first 8 years ago console-browserify 11e3a9652a first 8 years ago console-control-strings 11e3a9652a first 8 years ago consolidate 11e3a9652a first 8 years ago constants-browserify 11e3a9652a first 8 years ago contains-path 11e3a9652a first 8 years ago content-disposition 11e3a9652a first 8 years ago content-type 11e3a9652a first 8 years ago convert-source-map 11e3a9652a first 8 years ago cookie 11e3a9652a first 8 years ago cookie-signature 11e3a9652a first 8 years ago copy-concurrently 11e3a9652a first 8 years ago copy-descriptor 11e3a9652a first 8 years ago copy-webpack-plugin 11e3a9652a first 8 years ago core-js 11e3a9652a first 8 years ago core-util-is 11e3a9652a first 8 years ago cosmiconfig 11e3a9652a first 8 years ago create-ecdh 11e3a9652a first 8 years ago create-hash 11e3a9652a first 8 years ago create-hmac 11e3a9652a first 8 years ago cross-spawn 11e3a9652a first 8 years ago cryptiles 11e3a9652a first 8 years ago crypto-browserify 11e3a9652a first 8 years ago css-color-names 11e3a9652a first 8 years ago css-loader 11e3a9652a first 8 years ago css-select 11e3a9652a first 8 years ago css-selector-tokenizer 11e3a9652a first 8 years ago css-what 11e3a9652a first 8 years ago cssesc 11e3a9652a first 8 years ago cssnano 11e3a9652a first 8 years ago csso 11e3a9652a first 8 years ago cssom 11e3a9652a first 8 years ago cssstyle 11e3a9652a first 8 years ago cuint 11e3a9652a first 8 years ago currently-unhandled 11e3a9652a first 8 years ago cyclist 11e3a9652a first 8 years ago d 11e3a9652a first 8 years ago dashdash 11e3a9652a first 8 years ago data-uri-to-buffer 11e3a9652a first 8 years ago data-urls 11e3a9652a first 8 years ago date-now 11e3a9652a first 8 years ago de-indent 11e3a9652a first 8 years ago debug 11e3a9652a first 8 years ago decamelize 11e3a9652a first 8 years ago decode-uri-component 11e3a9652a first 8 years ago deep-eql 11e3a9652a first 8 years ago deep-equal 11e3a9652a first 8 years ago deep-is 11e3a9652a first 8 years ago deepmerge 11e3a9652a first 8 years ago default-require-extensions 11e3a9652a first 8 years ago define-properties 11e3a9652a first 8 years ago define-property 11e3a9652a first 8 years ago defined 11e3a9652a first 8 years ago degenerator 11e3a9652a first 8 years ago del 11e3a9652a first 8 years ago delayed-stream 11e3a9652a first 8 years ago delegates 11e3a9652a first 8 years ago depd 11e3a9652a first 8 years ago des.js 11e3a9652a first 8 years ago destroy 11e3a9652a first 8 years ago detect-indent 11e3a9652a first 8 years ago detect-newline 11e3a9652a first 8 years ago detect-node 11e3a9652a first 8 years ago diff 11e3a9652a first 8 years ago diffie-hellman 11e3a9652a first 8 years ago dir-glob 11e3a9652a first 8 years ago dns-equal 11e3a9652a first 8 years ago dns-packet 11e3a9652a first 8 years ago dns-txt 11e3a9652a first 8 years ago doctrine 11e3a9652a first 8 years ago dom-converter 11e3a9652a first 8 years ago dom-serializer 11e3a9652a first 8 years ago domain-browser 11e3a9652a first 8 years ago domelementtype 11e3a9652a first 8 years ago domexception 11e3a9652a first 8 years ago domhandler 11e3a9652a first 8 years ago domutils 11e3a9652a first 8 years ago duplexer 11e3a9652a first 8 years ago duplexify 11e3a9652a first 8 years ago ecc-jsbn 11e3a9652a first 8 years ago echarts 11e3a9652a first 8 years ago editorconfig 11e3a9652a first 8 years ago ee-first 11e3a9652a first 8 years ago ejs 11e3a9652a first 8 years ago electron-to-chromium 11e3a9652a first 8 years ago element-ui 11e3a9652a first 8 years ago elliptic 11e3a9652a first 8 years ago emojis-list 11e3a9652a first 8 years ago encodeurl 11e3a9652a first 8 years ago end-of-stream 11e3a9652a first 8 years ago enhanced-resolve 11e3a9652a first 8 years ago entities 11e3a9652a first 8 years ago errno 11e3a9652a first 8 years ago error-ex 11e3a9652a first 8 years ago error-stack-parser 11e3a9652a first 8 years ago es-abstract 11e3a9652a first 8 years ago es-to-primitive 11e3a9652a first 8 years ago es5-ext 11e3a9652a first 8 years ago es6-iterator 11e3a9652a first 8 years ago es6-map 11e3a9652a first 8 years ago es6-set 11e3a9652a first 8 years ago es6-symbol 11e3a9652a first 8 years ago es6-weak-map 11e3a9652a first 8 years ago escape-html 11e3a9652a first 8 years ago escape-string-regexp 11e3a9652a first 8 years ago escodegen 11e3a9652a first 8 years ago escope 11e3a9652a first 8 years ago eslint 11e3a9652a first 8 years ago eslint-config-standard 11e3a9652a first 8 years ago eslint-friendly-formatter 11e3a9652a first 8 years ago eslint-import-resolver-node 11e3a9652a first 8 years ago eslint-loader 11e3a9652a first 8 years ago eslint-module-utils 11e3a9652a first 8 years ago eslint-plugin-import 11e3a9652a first 8 years ago eslint-plugin-node 11e3a9652a first 8 years ago eslint-plugin-promise 11e3a9652a first 8 years ago eslint-plugin-standard 11e3a9652a first 8 years ago eslint-plugin-vue 11e3a9652a first 8 years ago eslint-scope 11e3a9652a first 8 years ago eslint-visitor-keys 11e3a9652a first 8 years ago espree 11e3a9652a first 8 years ago esprima 11e3a9652a first 8 years ago esquery 11e3a9652a first 8 years ago esrecurse 11e3a9652a first 8 years ago estraverse 11e3a9652a first 8 years ago esutils 11e3a9652a first 8 years ago etag 11e3a9652a first 8 years ago event-emitter 11e3a9652a first 8 years ago eventemitter3 11e3a9652a first 8 years ago events 11e3a9652a first 8 years ago eventsource 11e3a9652a first 8 years ago evp_bytestokey 11e3a9652a first 8 years ago exec-sh 11e3a9652a first 8 years ago execa 11e3a9652a first 8 years ago exit 11e3a9652a first 8 years ago expand-brackets 11e3a9652a first 8 years ago expand-range 11e3a9652a first 8 years ago expect 11e3a9652a first 8 years ago express 11e3a9652a first 8 years ago extend 11e3a9652a first 8 years ago extend-shallow 11e3a9652a first 8 years ago external-editor 11e3a9652a first 8 years ago extglob 11e3a9652a first 8 years ago extract-text-webpack-plugin 11e3a9652a first 8 years ago extract-zip 11e3a9652a first 8 years ago extsprintf 11e3a9652a first 8 years ago fast-deep-equal 11e3a9652a first 8 years ago fast-json-stable-stringify 11e3a9652a first 8 years ago fast-levenshtein 11e3a9652a first 8 years ago fastparse 11e3a9652a first 8 years ago faye-websocket 11e3a9652a first 8 years ago fb-watchman 11e3a9652a first 8 years ago fd-slicer 11e3a9652a first 8 years ago figures 11e3a9652a first 8 years ago file-entry-cache 11e3a9652a first 8 years ago file-loader 11e3a9652a first 8 years ago file-uri-to-path 11e3a9652a first 8 years ago filename-regex 11e3a9652a first 8 years ago fileset 11e3a9652a first 8 years ago filesize 11e3a9652a first 8 years ago fill-range 11e3a9652a first 8 years ago finalhandler 11e3a9652a first 8 years ago find-babel-config 11e3a9652a first 8 years ago find-cache-dir 11e3a9652a first 8 years ago find-up 11e3a9652a first 8 years ago flat-cache 11e3a9652a first 8 years ago flatten 11e3a9652a first 8 years ago flush-write-stream 11e3a9652a first 8 years ago follow-redirects 11e3a9652a first 8 years ago for-in 11e3a9652a first 8 years ago for-own 11e3a9652a first 8 years ago foreach 11e3a9652a first 8 years ago forever-agent 11e3a9652a first 8 years ago form-data 11e3a9652a first 8 years ago forwarded 11e3a9652a first 8 years ago fragment-cache 11e3a9652a first 8 years ago fresh 11e3a9652a first 8 years ago friendly-errors-webpack-plugin 11e3a9652a first 8 years ago from2 11e3a9652a first 8 years ago fs-write-stream-atomic 11e3a9652a first 8 years ago fs.realpath 11e3a9652a first 8 years ago fsevents 11e3a9652a first 8 years ago fstream 11e3a9652a first 8 years ago ftp 11e3a9652a first 8 years ago function-bind 11e3a9652a first 8 years ago functional-red-black-tree 11e3a9652a first 8 years ago gauge 11e3a9652a first 8 years ago gaze 11e3a9652a first 8 years ago generate-function 11e3a9652a first 8 years ago generate-object-property 11e3a9652a first 8 years ago get-caller-file 11e3a9652a first 8 years ago get-stdin 11e3a9652a first 8 years ago get-stream 11e3a9652a first 8 years ago get-uri 11e3a9652a first 8 years ago get-value 11e3a9652a first 8 years ago getpass 11e3a9652a first 8 years ago glob 11e3a9652a first 8 years ago glob-base 11e3a9652a first 8 years ago glob-parent 11e3a9652a first 8 years ago globals 11e3a9652a first 8 years ago globby 11e3a9652a first 8 years ago globule 11e3a9652a first 8 years ago graceful-fs 11e3a9652a first 8 years ago graceful-readlink 11e3a9652a first 8 years ago growl 11e3a9652a first 8 years ago growly 11e3a9652a first 8 years ago gzip-size 11e3a9652a first 8 years ago handle-thing 11e3a9652a first 8 years ago handlebars 11e3a9652a first 8 years ago har-schema 11e3a9652a first 8 years ago har-validator 11e3a9652a first 8 years ago has 11e3a9652a first 8 years ago has-ansi 11e3a9652a first 8 years ago has-flag 11e3a9652a first 8 years ago has-unicode 11e3a9652a first 8 years ago has-value 11e3a9652a first 8 years ago has-values 11e3a9652a first 8 years ago hash-base 11e3a9652a first 8 years ago hash-sum 11e3a9652a first 8 years ago hash.js 11e3a9652a first 8 years ago hawk 11e3a9652a first 8 years ago he 11e3a9652a first 8 years ago hmac-drbg 11e3a9652a first 8 years ago hoek 11e3a9652a first 8 years ago home-or-tmp 11e3a9652a first 8 years ago hosted-git-info 11e3a9652a first 8 years ago hpack.js 11e3a9652a first 8 years ago html-comment-regex 11e3a9652a first 8 years ago html-encoding-sniffer 11e3a9652a first 8 years ago html-entities 11e3a9652a first 8 years ago html-minifier 11e3a9652a first 8 years ago html-tags 11e3a9652a first 8 years ago html-webpack-plugin 11e3a9652a first 8 years ago htmlparser2 11e3a9652a first 8 years ago http-deceiver 11e3a9652a first 8 years ago http-errors 11e3a9652a first 8 years ago http-parser-js 11e3a9652a first 8 years ago http-proxy 11e3a9652a first 8 years ago http-proxy-agent 11e3a9652a first 8 years ago http-proxy-middleware 11e3a9652a first 8 years ago http-signature 11e3a9652a first 8 years ago https-browserify 11e3a9652a first 8 years ago https-proxy-agent 11e3a9652a first 8 years ago iconv-lite 11e3a9652a first 8 years ago icss-replace-symbols 11e3a9652a first 8 years ago icss-utils 11e3a9652a first 8 years ago ieee754 11e3a9652a first 8 years ago iferr 11e3a9652a first 8 years ago ignore 11e3a9652a first 8 years ago import-local 11e3a9652a first 8 years ago imurmurhash 11e3a9652a first 8 years ago in-publish 11e3a9652a first 8 years ago indent-string 11e3a9652a first 8 years ago indexes-of 11e3a9652a first 8 years ago indexof 11e3a9652a first 8 years ago inflight 11e3a9652a first 8 years ago inherits 11e3a9652a first 8 years ago ini 11e3a9652a first 8 years ago inquirer 11e3a9652a first 8 years ago internal-ip 11e3a9652a first 8 years ago interpret 11e3a9652a first 8 years ago invariant 11e3a9652a first 8 years ago invert-kv 11e3a9652a first 8 years ago ip 11e3a9652a first 8 years ago ipaddr.js 11e3a9652a first 8 years ago is-absolute-url 11e3a9652a first 8 years ago is-accessor-descriptor 11e3a9652a first 8 years ago is-arrayish 11e3a9652a first 8 years ago is-binary-path 11e3a9652a first 8 years ago is-buffer 11e3a9652a first 8 years ago is-builtin-module 11e3a9652a first 8 years ago is-callable 11e3a9652a first 8 years ago is-ci 11e3a9652a first 8 years ago is-data-descriptor 11e3a9652a first 8 years ago is-date-object 11e3a9652a first 8 years ago is-descriptor 11e3a9652a first 8 years ago is-directory 11e3a9652a first 8 years ago is-dotfile 11e3a9652a first 8 years ago is-equal-shallow 11e3a9652a first 8 years ago is-extendable 11e3a9652a first 8 years ago is-extglob 11e3a9652a first 8 years ago is-finite 11e3a9652a first 8 years ago is-fullwidth-code-point 11e3a9652a first 8 years ago is-generator-fn 11e3a9652a first 8 years ago is-glob 11e3a9652a first 8 years ago is-my-ip-valid 11e3a9652a first 8 years ago is-my-json-valid 11e3a9652a first 8 years ago is-number 11e3a9652a first 8 years ago is-odd 11e3a9652a first 8 years ago is-path-cwd 11e3a9652a first 8 years ago is-path-in-cwd 11e3a9652a first 8 years ago is-path-inside 11e3a9652a first 8 years ago is-plain-obj 11e3a9652a first 8 years ago is-plain-object 11e3a9652a first 8 years ago is-posix-bracket 11e3a9652a first 8 years ago is-primitive 11e3a9652a first 8 years ago is-promise 11e3a9652a first 8 years ago is-property 11e3a9652a first 8 years ago is-regex 11e3a9652a first 8 years ago is-resolvable 11e3a9652a first 8 years ago is-stream 11e3a9652a first 8 years ago is-svg 11e3a9652a first 8 years ago is-symbol 11e3a9652a first 8 years ago is-typedarray 11e3a9652a first 8 years ago is-utf8 11e3a9652a first 8 years ago is-whitespace 11e3a9652a first 8 years ago is-windows 11e3a9652a first 8 years ago is-wsl 11e3a9652a first 8 years ago isarray 11e3a9652a first 8 years ago isexe 11e3a9652a first 8 years ago isobject 11e3a9652a first 8 years ago isstream 11e3a9652a first 8 years ago istanbul-api 11e3a9652a first 8 years ago istanbul-lib-coverage 11e3a9652a first 8 years ago istanbul-lib-hook 11e3a9652a first 8 years ago istanbul-lib-instrument 11e3a9652a first 8 years ago istanbul-lib-report 11e3a9652a first 8 years ago istanbul-lib-source-maps 11e3a9652a first 8 years ago istanbul-reports 11e3a9652a first 8 years ago jest 11e3a9652a first 8 years ago jest-changed-files 11e3a9652a first 8 years ago jest-config 11e3a9652a first 8 years ago jest-diff 11e3a9652a first 8 years ago jest-docblock 11e3a9652a first 8 years ago jest-environment-jsdom 11e3a9652a first 8 years ago jest-environment-node 11e3a9652a first 8 years ago jest-get-type 11e3a9652a first 8 years ago jest-haste-map 11e3a9652a first 8 years ago jest-jasmine2 11e3a9652a first 8 years ago jest-leak-detector 11e3a9652a first 8 years ago jest-matcher-utils 11e3a9652a first 8 years ago jest-message-util 11e3a9652a first 8 years ago jest-mock 11e3a9652a first 8 years ago jest-regex-util 11e3a9652a first 8 years ago jest-resolve 11e3a9652a first 8 years ago jest-resolve-dependencies 11e3a9652a first 8 years ago jest-runner 11e3a9652a first 8 years ago jest-runtime 11e3a9652a first 8 years ago jest-serializer 11e3a9652a first 8 years ago jest-serializer-vue 11e3a9652a first 8 years ago jest-snapshot 11e3a9652a first 8 years ago jest-util 11e3a9652a first 8 years ago jest-validate 11e3a9652a first 8 years ago jest-worker 11e3a9652a first 8 years ago js-base64 11e3a9652a first 8 years ago js-beautify 11e3a9652a first 8 years ago js-tokens 11e3a9652a first 8 years ago js-yaml 11e3a9652a first 8 years ago jsbn 11e3a9652a first 8 years ago jsdom 11e3a9652a first 8 years ago jsesc 11e3a9652a first 8 years ago json-loader 11e3a9652a first 8 years ago json-schema 11e3a9652a first 8 years ago json-schema-traverse 11e3a9652a first 8 years ago json-stable-stringify 11e3a9652a first 8 years ago json-stable-stringify-without-jsonify 11e3a9652a first 8 years ago json-stringify-safe 11e3a9652a first 8 years ago json3 11e3a9652a first 8 years ago json5 11e3a9652a first 8 years ago jsonify 11e3a9652a first 8 years ago jsonpointer 11e3a9652a first 8 years ago jsprim 11e3a9652a first 8 years ago kew 11e3a9652a first 8 years ago killable 11e3a9652a first 8 years ago kind-of 11e3a9652a first 8 years ago last-call-webpack-plugin 11e3a9652a first 8 years ago lazy-cache 11e3a9652a first 8 years ago lcid 11e3a9652a first 8 years ago left-pad 11e3a9652a first 8 years ago leven 11e3a9652a first 8 years ago levn 11e3a9652a first 8 years ago load-json-file 11e3a9652a first 8 years ago loader-fs-cache 11e3a9652a first 8 years ago loader-runner 11e3a9652a first 8 years ago loader-utils 11e3a9652a first 8 years ago locate-path 11e3a9652a first 8 years ago lodash 11e3a9652a first 8 years ago lodash._arraycopy 11e3a9652a first 8 years ago lodash._arrayeach 11e3a9652a first 8 years ago lodash._baseassign 11e3a9652a first 8 years ago lodash._baseclone 11e3a9652a first 8 years ago lodash._basecopy 11e3a9652a first 8 years ago lodash._basecreate 11e3a9652a first 8 years ago lodash._basefor 11e3a9652a first 8 years ago lodash._bindcallback 11e3a9652a first 8 years ago lodash._getnative 11e3a9652a first 8 years ago lodash._isiterateecall 11e3a9652a first 8 years ago lodash._stack 11e3a9652a first 8 years ago lodash.assign 11e3a9652a first 8 years ago lodash.camelcase 11e3a9652a first 8 years ago lodash.clone 11e3a9652a first 8 years ago lodash.clonedeep 11e3a9652a first 8 years ago lodash.create 11e3a9652a first 8 years ago lodash.defaultsdeep 11e3a9652a first 8 years ago lodash.isarguments 11e3a9652a first 8 years ago lodash.isarray 11e3a9652a first 8 years ago lodash.isplainobject 11e3a9652a first 8 years ago lodash.keys 11e3a9652a first 8 years ago lodash.keysin 11e3a9652a first 8 years ago lodash.memoize 11e3a9652a first 8 years ago lodash.mergewith 11e3a9652a first 8 years ago lodash.rest 11e3a9652a first 8 years ago lodash.sortby 11e3a9652a first 8 years ago lodash.tail 11e3a9652a first 8 years ago lodash.uniq 11e3a9652a first 8 years ago log-symbols 11e3a9652a first 8 years ago loglevel 11e3a9652a first 8 years ago longest 11e3a9652a first 8 years ago loose-envify 11e3a9652a first 8 years ago loud-rejection 11e3a9652a first 8 years ago lower-case 11e3a9652a first 8 years ago lru-cache 11e3a9652a first 8 years ago macaddress 11e3a9652a first 8 years ago make-dir 11e3a9652a first 8 years ago makeerror 11e3a9652a first 8 years ago map-cache 11e3a9652a first 8 years ago map-obj 11e3a9652a first 8 years ago map-visit 11e3a9652a first 8 years ago math-expression-evaluator 11e3a9652a first 8 years ago md5.js 11e3a9652a first 8 years ago media-typer 11e3a9652a first 8 years ago mem 11e3a9652a first 8 years ago memory-fs 11e3a9652a first 8 years ago meow 11e3a9652a first 8 years ago merge 11e3a9652a first 8 years ago merge-descriptors 11e3a9652a first 8 years ago merge-stream 11e3a9652a first 8 years ago methods 11e3a9652a first 8 years ago micromatch 11e3a9652a first 8 years ago miller-rabin 11e3a9652a first 8 years ago mime 11e3a9652a first 8 years ago mime-db 11e3a9652a first 8 years ago mime-types 11e3a9652a first 8 years ago mimic-fn 11e3a9652a first 8 years ago minimalistic-assert 11e3a9652a first 8 years ago minimalistic-crypto-utils 11e3a9652a first 8 years ago minimatch 11e3a9652a first 8 years ago minimist 11e3a9652a first 8 years ago mississippi 11e3a9652a first 8 years ago mixin-deep 11e3a9652a first 8 years ago mixin-object 11e3a9652a first 8 years ago mkdirp 11e3a9652a first 8 years ago mkpath 11e3a9652a first 8 years ago mocha-nightwatch 11e3a9652a first 8 years ago move-concurrently 11e3a9652a first 8 years ago ms 11e3a9652a first 8 years ago multicast-dns 11e3a9652a first 8 years ago multicast-dns-service-types 11e3a9652a first 8 years ago mute-stream 11e3a9652a first 8 years ago nan 11e3a9652a first 8 years ago nanomatch 11e3a9652a first 8 years ago natural-compare 11e3a9652a first 8 years ago negotiator 11e3a9652a first 8 years ago neo-async 11e3a9652a first 8 years ago netmask 11e3a9652a first 8 years ago next-tick 11e3a9652a first 8 years ago nightwatch 11e3a9652a first 8 years ago no-case 11e3a9652a first 8 years ago node-cache 11e3a9652a first 8 years ago node-forge 11e3a9652a first 8 years ago node-gyp 11e3a9652a first 8 years ago node-int64 11e3a9652a first 8 years ago node-libs-browser 11e3a9652a first 8 years ago node-notifier 11e3a9652a first 8 years ago node-sass 11e3a9652a first 8 years ago nopt 11e3a9652a first 8 years ago normalize-package-data 11e3a9652a first 8 years ago normalize-path 11e3a9652a first 8 years ago normalize-range 11e3a9652a first 8 years ago normalize-url 11e3a9652a first 8 years ago normalize-wheel 11e3a9652a first 8 years ago npm-run-path 11e3a9652a first 8 years ago npmlog 11e3a9652a first 8 years ago nth-check 11e3a9652a first 8 years ago num2fraction 11e3a9652a first 8 years ago number-is-nan 11e3a9652a first 8 years ago nwmatcher 11e3a9652a first 8 years ago oauth-sign 11e3a9652a first 8 years ago object-assign 11e3a9652a first 8 years ago object-copy 11e3a9652a first 8 years ago object-hash 11e3a9652a first 8 years ago object-keys 11e3a9652a first 8 years ago object-visit 11e3a9652a first 8 years ago object.getownpropertydescriptors 11e3a9652a first 8 years ago object.omit 11e3a9652a first 8 years ago object.pick 11e3a9652a first 8 years ago obuf 11e3a9652a first 8 years ago on-finished 11e3a9652a first 8 years ago on-headers 11e3a9652a first 8 years ago once 11e3a9652a first 8 years ago onetime 11e3a9652a first 8 years ago opener 11e3a9652a first 8 years ago opn 11e3a9652a first 8 years ago optimist 11e3a9652a first 8 years ago optimize-css-assets-webpack-plugin 11e3a9652a first 8 years ago optionator 11e3a9652a first 8 years ago ora 11e3a9652a first 8 years ago original 11e3a9652a first 8 years ago os-browserify 11e3a9652a first 8 years ago os-homedir 11e3a9652a first 8 years ago os-locale 11e3a9652a first 8 years ago os-tmpdir 11e3a9652a first 8 years ago osenv 11e3a9652a first 8 years ago p-finally 11e3a9652a first 8 years ago p-limit 11e3a9652a first 8 years ago p-locate 11e3a9652a first 8 years ago p-map 11e3a9652a first 8 years ago p-try 11e3a9652a first 8 years ago pac-proxy-agent 11e3a9652a first 8 years ago pac-resolver 11e3a9652a first 8 years ago pako 11e3a9652a first 8 years ago parallel-transform 11e3a9652a first 8 years ago param-case 11e3a9652a first 8 years ago parse-asn1 11e3a9652a first 8 years ago parse-glob 11e3a9652a first 8 years ago parse-json 11e3a9652a first 8 years ago parse5 11e3a9652a first 8 years ago parseurl 11e3a9652a first 8 years ago pascalcase 11e3a9652a first 8 years ago path-browserify 11e3a9652a first 8 years ago path-dirname 11e3a9652a first 8 years ago path-exists 11e3a9652a first 8 years ago path-is-absolute 11e3a9652a first 8 years ago path-is-inside 11e3a9652a first 8 years ago path-key 11e3a9652a first 8 years ago path-parse 11e3a9652a first 8 years ago path-to-regexp 11e3a9652a first 8 years ago path-type 11e3a9652a first 8 years ago pbkdf2 11e3a9652a first 8 years ago pend 11e3a9652a first 8 years ago performance-now 11e3a9652a first 8 years ago pify 11e3a9652a first 8 years ago pinkie 11e3a9652a first 8 years ago pinkie-promise 11e3a9652a first 8 years ago pkg-dir 11e3a9652a first 8 years ago pluralize 11e3a9652a first 8 years ago pn 11e3a9652a first 8 years ago portfinder 11e3a9652a first 8 years ago posix-character-classes 11e3a9652a first 8 years ago postcss 11e3a9652a first 8 years ago postcss-calc 11e3a9652a first 8 years ago postcss-colormin 11e3a9652a first 8 years ago postcss-convert-values 11e3a9652a first 8 years ago postcss-discard-comments 11e3a9652a first 8 years ago postcss-discard-duplicates 11e3a9652a first 8 years ago postcss-discard-empty 11e3a9652a first 8 years ago postcss-discard-overridden 11e3a9652a first 8 years ago postcss-discard-unused 11e3a9652a first 8 years ago postcss-filter-plugins 11e3a9652a first 8 years ago postcss-import 11e3a9652a first 8 years ago postcss-load-config 11e3a9652a first 8 years ago postcss-load-options 11e3a9652a first 8 years ago postcss-load-plugins 11e3a9652a first 8 years ago postcss-loader 11e3a9652a first 8 years ago postcss-merge-idents 11e3a9652a first 8 years ago postcss-merge-longhand 11e3a9652a first 8 years ago postcss-merge-rules 11e3a9652a first 8 years ago postcss-message-helpers 11e3a9652a first 8 years ago postcss-minify-font-values 11e3a9652a first 8 years ago postcss-minify-gradients 11e3a9652a first 8 years ago postcss-minify-params 11e3a9652a first 8 years ago postcss-minify-selectors 11e3a9652a first 8 years ago postcss-modules-extract-imports 11e3a9652a first 8 years ago postcss-modules-local-by-default 11e3a9652a first 8 years ago postcss-modules-scope 11e3a9652a first 8 years ago postcss-modules-values 11e3a9652a first 8 years ago postcss-normalize-charset 11e3a9652a first 8 years ago postcss-normalize-url 11e3a9652a first 8 years ago postcss-ordered-values 11e3a9652a first 8 years ago postcss-reduce-idents 11e3a9652a first 8 years ago postcss-reduce-initial 11e3a9652a first 8 years ago postcss-reduce-transforms 11e3a9652a first 8 years ago postcss-selector-parser 11e3a9652a first 8 years ago postcss-svgo 11e3a9652a first 8 years ago postcss-unique-selectors 11e3a9652a first 8 years ago postcss-url 11e3a9652a first 8 years ago postcss-value-parser 11e3a9652a first 8 years ago postcss-zindex 11e3a9652a first 8 years ago prelude-ls 11e3a9652a first 8 years ago prepend-http 11e3a9652a first 8 years ago preserve 11e3a9652a first 8 years ago prettier 11e3a9652a first 8 years ago pretty 11e3a9652a first 8 years ago pretty-error 11e3a9652a first 8 years ago pretty-format 11e3a9652a first 8 years ago private 11e3a9652a first 8 years ago process 11e3a9652a first 8 years ago process-nextick-args 11e3a9652a first 8 years ago progress 11e3a9652a first 8 years ago promise-inflight 11e3a9652a first 8 years ago proto-list 11e3a9652a first 8 years ago proxy-addr 11e3a9652a first 8 years ago proxy-agent 11e3a9652a first 8 years ago prr 11e3a9652a first 8 years ago pseudomap 11e3a9652a first 8 years ago public-encrypt 11e3a9652a first 8 years ago pump 11e3a9652a first 8 years ago pumpify 11e3a9652a first 8 years ago punycode 11e3a9652a first 8 years ago q 11e3a9652a first 8 years ago qrcodejs2 11e3a9652a first 8 years ago qs 11e3a9652a first 8 years ago query-string 11e3a9652a first 8 years ago querystring 11e3a9652a first 8 years ago querystring-es3 11e3a9652a first 8 years ago querystringify 11e3a9652a first 8 years ago randomatic 11e3a9652a first 8 years ago randombytes 11e3a9652a first 8 years ago randomfill 11e3a9652a first 8 years ago range-parser 11e3a9652a first 8 years ago raw-body 11e3a9652a first 8 years ago read-cache 11e3a9652a first 8 years ago read-pkg 11e3a9652a first 8 years ago read-pkg-up 11e3a9652a first 8 years ago readable-stream 11e3a9652a first 8 years ago readdirp 11e3a9652a first 8 years ago realpath-native 11e3a9652a first 8 years ago rechoir 11e3a9652a first 8 years ago redent 11e3a9652a first 8 years ago reduce-css-calc 11e3a9652a first 8 years ago reduce-function-call 11e3a9652a first 8 years ago regenerate 11e3a9652a first 8 years ago regenerator-runtime 11e3a9652a first 8 years ago regenerator-transform 11e3a9652a first 8 years ago regex-cache 11e3a9652a first 8 years ago regex-not 11e3a9652a first 8 years ago regexpp 11e3a9652a first 8 years ago regexpu-core 11e3a9652a first 8 years ago regjsgen 11e3a9652a first 8 years ago regjsparser 11e3a9652a first 8 years ago relateurl 11e3a9652a first 8 years ago remove-trailing-separator 11e3a9652a first 8 years ago renderkid 11e3a9652a first 8 years ago repeat-element 11e3a9652a first 8 years ago repeat-string 11e3a9652a first 8 years ago repeating 11e3a9652a first 8 years ago request 11e3a9652a first 8 years ago request-promise-core 11e3a9652a first 8 years ago request-promise-native 11e3a9652a first 8 years ago require-directory 11e3a9652a first 8 years ago require-from-string 11e3a9652a first 8 years ago require-main-filename 11e3a9652a first 8 years ago require-uncached 11e3a9652a first 8 years ago requires-port 11e3a9652a first 8 years ago resize-observer-polyfill 11e3a9652a first 8 years ago resolve 11e3a9652a first 8 years ago resolve-cwd 11e3a9652a first 8 years ago resolve-from 11e3a9652a first 8 years ago resolve-url 11e3a9652a first 8 years ago restore-cursor 11e3a9652a first 8 years ago ret 11e3a9652a first 8 years ago right-align 11e3a9652a first 8 years ago rimraf 11e3a9652a first 8 years ago ripemd160 11e3a9652a first 8 years ago run-async 11e3a9652a first 8 years ago run-queue 11e3a9652a first 8 years ago rx-lite 11e3a9652a first 8 years ago rx-lite-aggregates 11e3a9652a first 8 years ago safe-buffer 11e3a9652a first 8 years ago safe-regex 11e3a9652a first 8 years ago safer-buffer 11e3a9652a first 8 years ago sane 11e3a9652a first 8 years ago sass-graph 11e3a9652a first 8 years ago sass-loader 11e3a9652a first 8 years ago sax 11e3a9652a first 8 years ago schema-utils 11e3a9652a first 8 years ago scss-tokenizer 11e3a9652a first 8 years ago select-hose 11e3a9652a first 8 years ago selenium-server 11e3a9652a first 8 years ago selfsigned 11e3a9652a first 8 years ago semver 11e3a9652a first 8 years ago send 11e3a9652a first 8 years ago serialize-javascript 11e3a9652a first 8 years ago serve-index 11e3a9652a first 8 years ago serve-static 11e3a9652a first 8 years ago set-blocking 11e3a9652a first 8 years ago set-immediate-shim 11e3a9652a first 8 years ago set-value 11e3a9652a first 8 years ago setimmediate 11e3a9652a first 8 years ago setprototypeof 11e3a9652a first 8 years ago sha.js 11e3a9652a first 8 years ago shallow-clone 11e3a9652a first 8 years ago shebang-command 11e3a9652a first 8 years ago shebang-regex 11e3a9652a first 8 years ago shelljs 11e3a9652a first 8 years ago shellwords 11e3a9652a first 8 years ago sigmund 11e3a9652a first 8 years ago signal-exit 11e3a9652a first 8 years ago slash 11e3a9652a first 8 years ago slice-ansi 11e3a9652a first 8 years ago smart-buffer 11e3a9652a first 8 years ago snapdragon 11e3a9652a first 8 years ago snapdragon-node 11e3a9652a first 8 years ago snapdragon-util 11e3a9652a first 8 years ago sntp 11e3a9652a first 8 years ago sockjs 11e3a9652a first 8 years ago sockjs-client 11e3a9652a first 8 years ago socks 11e3a9652a first 8 years ago socks-proxy-agent 11e3a9652a first 8 years ago sort-keys 11e3a9652a first 8 years ago source-list-map 11e3a9652a first 8 years ago source-map 11e3a9652a first 8 years ago source-map-resolve 11e3a9652a first 8 years ago source-map-support 11e3a9652a first 8 years ago source-map-url 11e3a9652a first 8 years ago spdx-correct 11e3a9652a first 8 years ago spdx-exceptions 11e3a9652a first 8 years ago spdx-expression-parse 11e3a9652a first 8 years ago spdx-license-ids 11e3a9652a first 8 years ago spdy 11e3a9652a first 8 years ago spdy-transport 11e3a9652a first 8 years ago split-string 11e3a9652a first 8 years ago sprintf-js 11e3a9652a first 8 years ago sshpk 11e3a9652a first 8 years ago ssri 11e3a9652a first 8 years ago stack-utils 11e3a9652a first 8 years ago stackframe 11e3a9652a first 8 years ago static-extend 11e3a9652a first 8 years ago statuses 11e3a9652a first 8 years ago stdout-stream 11e3a9652a first 8 years ago stealthy-require 11e3a9652a first 8 years ago stream-browserify 11e3a9652a first 8 years ago stream-each 11e3a9652a first 8 years ago stream-http 11e3a9652a first 8 years ago stream-shift 11e3a9652a first 8 years ago strict-uri-encode 11e3a9652a first 8 years ago string-length 11e3a9652a first 8 years ago string-width 11e3a9652a first 8 years ago string_decoder 11e3a9652a first 8 years ago stringstream 11e3a9652a first 8 years ago strip-ansi 11e3a9652a first 8 years ago strip-bom 11e3a9652a first 8 years ago strip-eof 11e3a9652a first 8 years ago strip-indent 11e3a9652a first 8 years ago strip-json-comments 11e3a9652a first 8 years ago supports-color 11e3a9652a first 8 years ago svg-tags 11e3a9652a first 8 years ago svgo 11e3a9652a first 8 years ago symbol-tree 11e3a9652a first 8 years ago table 11e3a9652a first 8 years ago tapable 11e3a9652a first 8 years ago tar 11e3a9652a first 8 years ago test-exclude 11e3a9652a first 8 years ago text-table 11e3a9652a first 8 years ago throat 11e3a9652a first 8 years ago throttle-debounce 11e3a9652a first 8 years ago through 11e3a9652a first 8 years ago through2 11e3a9652a first 8 years ago thunkify 11e3a9652a first 8 years ago thunky 11e3a9652a first 8 years ago time-stamp 11e3a9652a first 8 years ago timers-browserify 11e3a9652a first 8 years ago tmp 11e3a9652a first 8 years ago tmpl 11e3a9652a first 8 years ago to-arraybuffer 11e3a9652a first 8 years ago to-fast-properties 11e3a9652a first 8 years ago to-object-path 11e3a9652a first 8 years ago to-regex 11e3a9652a first 8 years ago to-regex-range 11e3a9652a first 8 years ago toposort 11e3a9652a first 8 years ago tough-cookie 11e3a9652a first 8 years ago tr46 11e3a9652a first 8 years ago trim-newlines 11e3a9652a first 8 years ago trim-right 11e3a9652a first 8 years ago true-case-path 11e3a9652a first 8 years ago tryer 11e3a9652a first 8 years ago tsconfig 11e3a9652a first 8 years ago tty-browserify 11e3a9652a first 8 years ago tunnel-agent 11e3a9652a first 8 years ago tweetnacl 11e3a9652a first 8 years ago type-check 11e3a9652a first 8 years ago type-detect 11e3a9652a first 8 years ago type-is 11e3a9652a first 8 years ago typedarray 11e3a9652a first 8 years ago uglify-js 11e3a9652a first 8 years ago uglify-to-browserify 11e3a9652a first 8 years ago uglifyjs-webpack-plugin 11e3a9652a first 8 years ago union-value 11e3a9652a first 8 years ago uniq 11e3a9652a first 8 years ago uniqid 11e3a9652a first 8 years ago uniqs 11e3a9652a first 8 years ago unique-filename 11e3a9652a first 8 years ago unique-slug 11e3a9652a first 8 years ago unpipe 11e3a9652a first 8 years ago unset-value 11e3a9652a first 8 years ago upath 11e3a9652a first 8 years ago upper-case 11e3a9652a first 8 years ago uri-js 11e3a9652a first 8 years ago urix 11e3a9652a first 8 years ago url 11e3a9652a first 8 years ago url-loader 11e3a9652a first 8 years ago url-parse 11e3a9652a first 8 years ago use 11e3a9652a first 8 years ago util 11e3a9652a first 8 years ago util-deprecate 11e3a9652a first 8 years ago util.promisify 11e3a9652a first 8 years ago utila 11e3a9652a first 8 years ago utils-merge 11e3a9652a first 8 years ago uuid 11e3a9652a first 8 years ago validate-npm-package-license 11e3a9652a first 8 years ago vary 11e3a9652a first 8 years ago vendors 11e3a9652a first 8 years ago verror 11e3a9652a first 8 years ago vm-browserify 11e3a9652a first 8 years ago vue 11e3a9652a first 8 years ago vue-eslint-parser 11e3a9652a first 8 years ago vue-hot-reload-api 11e3a9652a first 8 years ago vue-jest 11e3a9652a first 8 years ago vue-loader 11e3a9652a first 8 years ago vue-router 11e3a9652a first 8 years ago vue-style-loader 11e3a9652a first 8 years ago vue-template-compiler 11e3a9652a first 8 years ago vue-template-es2015-compiler 11e3a9652a first 8 years ago w3c-hr-time 11e3a9652a first 8 years ago walker 11e3a9652a first 8 years ago watch 11e3a9652a first 8 years ago watchpack 11e3a9652a first 8 years ago wbuf 11e3a9652a first 8 years ago webidl-conversions 11e3a9652a first 8 years ago webpack 11e3a9652a first 8 years ago webpack-bundle-analyzer 11e3a9652a first 8 years ago webpack-dev-middleware 11e3a9652a first 8 years ago webpack-dev-server 11e3a9652a first 8 years ago webpack-merge 11e3a9652a first 8 years ago webpack-sources 11e3a9652a first 8 years ago websocket-driver 11e3a9652a first 8 years ago websocket-extensions 11e3a9652a first 8 years ago whatwg-encoding 11e3a9652a first 8 years ago whatwg-mimetype 11e3a9652a first 8 years ago whatwg-url 11e3a9652a first 8 years ago whet.extend 11e3a9652a first 8 years ago which 11e3a9652a first 8 years ago which-module 11e3a9652a first 8 years ago wide-align 11e3a9652a first 8 years ago window-size 11e3a9652a first 8 years ago wordwrap 11e3a9652a first 8 years ago worker-farm 11e3a9652a first 8 years ago wrap-ansi 11e3a9652a first 8 years ago wrappy 11e3a9652a first 8 years ago write 11e3a9652a first 8 years ago write-file-atomic 11e3a9652a first 8 years ago ws 11e3a9652a first 8 years ago xml-name-validator 11e3a9652a first 8 years ago xregexp 11e3a9652a first 8 years ago xtend 11e3a9652a first 8 years ago xxhashjs 11e3a9652a first 8 years ago y18n 11e3a9652a first 8 years ago yallist 11e3a9652a first 8 years ago yargs 11e3a9652a first 8 years ago yargs-parser 11e3a9652a first 8 years ago yauzl 11e3a9652a first 8 years ago zrender 11e3a9652a first 8 years ago :art: Format Codes · 2c83131e50 - Gogs: Go Git Service

:art: Format Codes

huangqimin001 6 ans auparavant
Parent
Commettre
2c83131e50
8 fichiers modifiés avec 177 ajouts et 165 suppressions
  1. 51 49
      api/admin_views.py
  2. 1 2
      api/mini_views.py
  3. 9 9
      api/urls.py
  4. 4 2
      live/admin.py
  5. 16 16
      live/models.py
  6. 1 0
      live/tests.py
  7. 74 65
      live/views.py
  8. 21 22
      pay/views.py

+ 51 - 49
api/admin_views.py

@@ -1,34 +1,31 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
-import logging
4
-import requests
5 3
 import json
4
+import logging
6 5
 
7
-from django.core.paginator import Paginator
6
+import requests
7
+from django.conf import settings
8 8
 from django.contrib.auth.hashers import check_password
9
+from django.core.paginator import Paginator
9 10
 from django.db import transaction
10 11
 from django.db.models import Q
11 12
 from django_logit import logit
12 13
 from django_response import response
13
-from django.core.files import File
14
-from TimeConvert import TimeConvert as tc
15
-from django.conf import settings
16
-
17 14
 from pywe_token import access_token
18
-from pywe_storage import RedisStorage
15
+from TimeConvert import TimeConvert as tc
19 16
 
20 17
 from account.models import AdministratorInfo, UserInfo
21 18
 from goods.models import GoodsInfo, PackInfo
22 19
 from kol.models import KOLInfo
20
+from live.models import AnchorInfo, RoomGoodsInfo, RoomInfo, RoomOrderInfo, liveGoodsInfo
23 21
 from pay.models import OrderInfo
24
-from live.models import RoomInfo, RoomGoodsInfo, RoomOrderInfo, AnchorInfo, liveGoodsInfo
25 22
 from utils.error.errno_utils import AdministratorStatusCode, OrderStatusCode
26 23
 
27
-from utils.redis.connect import r
28 24
 
29 25
 logger = logging.getLogger('logit')
30 26
 WECHAT = settings.WECHAT
31 27
 
28
+
32 29
 @logit(res=True)
33 30
 def login(request):
34 31
     name = request.POST.get('name', '')
@@ -141,6 +138,7 @@ def order_update(request):
141 138
 
142 139
     return response(200, 'Order Update Success', '订单更新成功')
143 140
 
141
+
144 142
 @logit(res=True)
145 143
 def live_goods_list(request):
146 144
     admin_id = request.POST.get('admin_id', '')
@@ -169,6 +167,7 @@ def live_goods_list(request):
169 167
         'count': count,
170 168
     })
171 169
 
170
+
172 171
 @logit(res=True)
173 172
 def live_goods_create(request):
174 173
     admin_id = request.POST.get('admin_id', '')
@@ -182,7 +181,6 @@ def live_goods_create(request):
182 181
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
183 182
     except AdministratorInfo.DoesNotExist:
184 183
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
185
-    
186 184
 
187 185
     wxcfg = WECHAT.get('MINIAPP', {})
188 186
 
@@ -195,7 +193,7 @@ def live_goods_create(request):
195 193
 
196 194
     if media_id == '':
197 195
         return response()
198
-    
196
+
199 197
     goods_info, _ = liveGoodsInfo.objects.get_or_create(
200 198
         name=goods_name,
201 199
         coverImgUrl=media_id,
@@ -205,7 +203,7 @@ def live_goods_create(request):
205 203
         goods_img=goods_img
206 204
     )
207 205
 
208
-    data ={
206
+    data = {
209 207
         "goodsInfo": {
210 208
             'name': goods_name,
211 209
             'coverImgUrl': media_id,
@@ -214,7 +212,7 @@ def live_goods_create(request):
214 212
             'price2': price2 / 100,
215 213
             'url': 'pages/live/order/order?goods_id=' + goods_info.goods_id,
216 214
         }
217
-    } 
215
+    }
218 216
 
219 217
     wx_goods = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=' + token), json=data).text
220 218
     wx_goods = json.loads(wx_goods)
@@ -227,6 +225,7 @@ def live_goods_create(request):
227 225
         'goods': goods_info.admindata,
228 226
     })
229 227
 
228
+
230 229
 @logit(res=True)
231 230
 def live_goods_update(request):
232 231
     admin_id = request.POST.get('admin_id', '')
@@ -239,7 +238,6 @@ def live_goods_update(request):
239 238
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
240 239
     except AdministratorInfo.DoesNotExist:
241 240
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
242
-    
243 241
 
244 242
     goods_info = liveGoodsInfo.objects.get(goods_id=goods_id, status=True)
245 243
 
@@ -255,8 +253,8 @@ def live_goods_update(request):
255 253
     if media_id == '':
256 254
         return response()
257 255
 
258
-    data ={
259
-        "goodsInfo": {
256
+    data = {
257
+        'goodsInfo': {
260 258
             'goodsId': goods_info.wx_goods_id,
261 259
             'name': goods_info.name,
262 260
             'coverImgUrl': media_id,
@@ -265,7 +263,7 @@ def live_goods_update(request):
265 263
             'price2': price2 / 100,
266 264
             'url': 'pages/live/order/order?goods_id=' + goods_id,
267 265
         }
268
-    } 
266
+    }
269 267
 
270 268
     wx_goods = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/update?access_token=' + token), json=data).text
271 269
     errcode = json.loads(wx_goods).get('errcode', -1)
@@ -278,12 +276,12 @@ def live_goods_update(request):
278 276
     goods_info.price2 = price2
279 277
     goods_info.coverImgUrl = media_id
280 278
     goods_info.save()
281
-    
282 279
 
283 280
     return response(200, 'Live Goods Update Success', u'直播商品库更新成功', data={
284 281
         'goods': goods_info.admindata,
285 282
     })
286 283
 
284
+
287 285
 @logit(res=True)
288 286
 def live_goods_audit(request):
289 287
     admin_id = request.POST.get('admin_id', '')
@@ -291,7 +289,6 @@ def live_goods_audit(request):
291 289
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
292 290
     except AdministratorInfo.DoesNotExist:
293 291
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
294
-    
295 292
 
296 293
     wxcfg = WECHAT.get('MINIAPP', {})
297 294
 
@@ -312,9 +309,8 @@ def live_goods_audit(request):
312 309
         g = liveGoodsInfo.objects.get(wx_goods_id=goods.get('goods_id', ''), status=True)
313 310
         g.audit_status = goods.get('audit_status', 0)
314 311
         g.save()
315
-    
316
-    return response(200, 'Live Goods Audit Success', '获取直播商品库审核状态成功') 
317 312
 
313
+    return response(200, 'Live Goods Audit Success', '获取直播商品库审核状态成功')
318 314
 
319 315
 
320 316
 @logit(res=True)
@@ -322,11 +318,11 @@ def live_goods_delete(request):
322 318
     admin_id = request.POST.get('admin_id', '')
323 319
     goods_id = request.POST.get('goods_id', '')
324 320
     wx_goods_id = request.POST.get('wx_goods_id', '')
321
+
325 322
     try:
326 323
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
327 324
     except AdministratorInfo.DoesNotExist:
328 325
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
329
-    
330 326
 
331 327
     wxcfg = WECHAT.get('MINIAPP', {})
332 328
 
@@ -334,18 +330,15 @@ def live_goods_delete(request):
334 330
     secret = wxcfg.get('appsecret')
335 331
     token = access_token(appid, secret)
336 332
 
337
-    status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=' + token), json={ 'goodsId': wx_goods_id}).text
333
+    status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=' + token), json={'goodsId': wx_goods_id}).text
338 334
     errcode = json.loads(status).get('errcode', -1)
339 335
 
340 336
     if errcode != 0:
341 337
         return response()
342
-    
343
-    try:
344
-        liveGoodsInfo.objects.filter(goods_id=goods_id, status=True).update(status=False)
345
-    except:
346
-        return response()
347
-    
348
-    return response(200, 'Live Goods Delete Success', '直播商品库删除成功') 
338
+
339
+    liveGoodsInfo.objects.filter(goods_id=goods_id, status=True).update(status=False)
340
+
341
+    return response(200, 'Live Goods Delete Success', '直播商品库删除成功')
349 342
 
350 343
 
351 344
 @logit(res=True)
@@ -373,6 +366,7 @@ def live_room_list(request):
373 366
         'count': count,
374 367
     })
375 368
 
369
+
376 370
 @logit(res=True)
377 371
 def live_order_list(request):
378 372
     admin_id = request.POST.get('admin_id', '')
@@ -386,11 +380,11 @@ def live_order_list(request):
386 380
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
387 381
     except AdministratorInfo.DoesNotExist:
388 382
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
389
-    
383
+
390 384
     orders = RoomOrderInfo.objects.filter(Q(name__contains=query) | Q(phone__contains=query)).order_by('-created_at')
391 385
     if pay_status:
392 386
         orders = orders.filter(pay_status=pay_status)
393
-    
387
+
394 388
     if goods_name:
395 389
         goods_infos = liveGoodsInfo.objects.filter(goods_name__contains=goods_name)
396 390
         goods_infos = [info.goods_id for info in goods_infos]
@@ -405,12 +399,13 @@ def live_order_list(request):
405 399
         'count': count,
406 400
     })
407 401
 
402
+
408 403
 @logit(res=True)
409 404
 def live_order_delivery(request):
410 405
     admin_id = request.POST.get('admin_id', '')
411 406
     order_id = request.POST.get('order_id', '')
412 407
     user_id = request.POST.get('user_id', '')
413
-    
408
+
414 409
     delivery_id = request.POST.get('delivery_id', '')
415 410
     biz_id = request.POST.get('biz_id', '')
416 411
 
@@ -418,13 +413,13 @@ def live_order_delivery(request):
418 413
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
419 414
     except AdministratorInfo.DoesNotExist:
420 415
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
421
-    
416
+
422 417
     user = UserInfo.objects.get(user_id=user_id, status=True)
423 418
 
424 419
     order = RoomOrderInfo.objects.get(order_id=order_id, status=True)
425 420
 
426 421
     goods = liveGoodsInfo.objects.get(goods_id=order.goods_id, status=True)
427
-    
422
+
428 423
     wxcfg = WECHAT.get('MINIAPP', {})
429 424
 
430 425
     appid = wxcfg.get('appID')
@@ -462,13 +457,15 @@ def live_order_delivery(request):
462 457
             'spaceX': 10,
463 458
             'spaceY': 10,
464 459
             'spaceZ': 10,
465
-            'detail_list': [{
466
-            'name': goods.name,
467
-            'count': order.amount,
468
-            }]
460
+            'detail_list': [
461
+                {
462
+                    'name': goods.name,
463
+                    'count': order.amount,
464
+                }
465
+            ]
469 466
         },
470 467
         'shop': {
471
-            'wxa_path': 'pages/live/anchorHome/anchorHome?anchor_id='+order.anchor_id,
468
+            'wxa_path': 'pages/live/anchorHome/anchorHome?anchor_id=' + order.anchor_id,
472 469
             'img_url': goods.goods_img_url,
473 470
             'goods_name': goods.name,
474 471
             'goods_count': order.amount,
@@ -493,14 +490,15 @@ def live_order_delivery(request):
493 490
         deliveryResultcode = res.get('delivery_resultcode', '')
494 491
         deliveryResultmsg = res.get('delivery_resultmsg', '')
495 492
         return response(errCode, errMsg, str(deliveryResultcode) + ':' + deliveryResultmsg)
496
-    
493
+
497 494
     order.tracking_number = res.get('waybill_id', '')
498 495
     order.save()
499
-    
496
+
500 497
     return response(200, 'Live Order Delivery Success', '直播订单下单成功', data={
501 498
         'order': order.admindata
502 499
     })
503 500
 
501
+
504 502
 @logit(res=True)
505 503
 def fetch_wx_room_list(request):
506 504
     admin_id = request.POST.get('admin_id', '')
@@ -508,7 +506,6 @@ def fetch_wx_room_list(request):
508 506
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
509 507
     except AdministratorInfo.DoesNotExist:
510 508
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
511
-    
512 509
 
513 510
     wxcfg = WECHAT.get('MINIAPP', {})
514 511
 
@@ -521,7 +518,7 @@ def fetch_wx_room_list(request):
521 518
     if rooms.count() != 0:
522 519
         start = int(rooms[0].room_id) - 1
523 520
 
524
-    roominfos = requests.post(url=('http://api.weixin.qq.com/wxa/business/getliveinfo?access_token='+token), json={'start': 0, 'limit': 99})
521
+    roominfos = requests.post(url=('http://api.weixin.qq.com/wxa/business/getliveinfo?access_token=' + token), json={'start': 0, 'limit': 99})
525 522
 
526 523
     roominfos = json.loads(roominfos.text).get('room_info', {})
527 524
     for roominfo in roominfos:
@@ -540,9 +537,10 @@ def fetch_wx_room_list(request):
540 537
         room.anchor_name = roominfo.get('anchor_name', '')
541 538
         room.anchor_id = anchor.anchor_id
542 539
         room.save()
543
-    
540
+
544 541
     return response(200, 'Fetch wx Room List Success', u'微信直播间列表获取成功')
545 542
 
543
+
546 544
 @logit(res=True)
547 545
 def room_goods_list(request):
548 546
     admin_id = request.POST.get('admin_id', '')
@@ -554,7 +552,7 @@ def room_goods_list(request):
554 552
         administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
555 553
     except AdministratorInfo.DoesNotExist:
556 554
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
557
-    
555
+
558 556
     goods_list = RoomGoodsInfo.objects.filter(status=True).order_by('-created_at')
559 557
 
560 558
     if room_id:
@@ -569,6 +567,7 @@ def room_goods_list(request):
569 567
         'count': count,
570 568
     })
571 569
 
570
+
572 571
 def room_goods_add(request):
573 572
     admin_id = request.POST.get('admin_id', '')
574 573
     room_id = request.POST.get('room_id', '')
@@ -591,6 +590,7 @@ def room_goods_add(request):
591 590
 
592 591
     return response(200, 'Room Goods Add Success', u'直播间商品库添加成功')
593 592
 
593
+
594 594
 def room_goods_publish(request):
595 595
     admin_id = request.POST.get('admin_id', '')
596 596
     room_id = request.POST.get('room_id', '')
@@ -606,17 +606,18 @@ def room_goods_publish(request):
606 606
     secret = wxcfg.get('appsecret')
607 607
     token = access_token(appid, secret)
608 608
 
609
-    status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token=' + token), json={ 'ids': [goods.wx_goods_id], 'roomId': room_id}).text
609
+    status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token=' + token), json={'ids': [goods.wx_goods_id], 'roomId': room_id}).text
610 610
     errcode = json.loads(status).get('errcode', -1)
611 611
 
612 612
     if errcode != 0:
613 613
         return response(errcode, 'Room Goods Publish Fail', '直播间商品发布失败')
614
-    
614
+
615 615
     room_goods.goods_status = RoomGoodsInfo.PUBLISH
616 616
     room_goods.save()
617 617
 
618 618
     return response(200, 'Room Goods Publish Success', '直播间商品上架成功')
619 619
 
620
+
620 621
 def room_goods_off(request):
621 622
     admin_id = request.POST.get('admin_id', '')
622 623
     room_id = request.POST.get('room_id', '')
@@ -629,6 +630,7 @@ def room_goods_off(request):
629 630
 
630 631
     return response(200, 'Room Goods Off Success', '直播间商品下架成功')
631 632
 
633
+
632 634
 def room_goods_update(request):
633 635
     admin_id = request.POST.get('admin_id', '')
634 636
     room_id = request.POST.get('room_id', '')

+ 1 - 2
api/mini_views.py

@@ -64,6 +64,7 @@ def mini_login_api(request):
64 64
 
65 65
     return response(data=user.data)
66 66
 
67
+
67 68
 @logit(res=True)
68 69
 @transaction.atomic
69 70
 def mini_live_login_api(request):
@@ -112,7 +113,6 @@ def mini_live_login_api(request):
112 113
     # Store SessionKey
113 114
     store_session_key(appid=appid, secret=secret, session_key=session_key, unid=user.user_id, storage=RedisStorage(r))
114 115
 
115
-
116 116
     # Update live
117 117
     room = RoomInfo.objects.get(room_id=room_id)
118 118
     is_new = not RoomUserInfo.objects.filter(user_id=user.user_id).exists()
@@ -129,7 +129,6 @@ def mini_live_login_api(request):
129 129
     room_user.is_new = is_new
130 130
     room_user.save()
131 131
 
132
-
133 132
     return response(data=user.data)
134 133
 
135 134
 

+ 9 - 9
api/urls.py

@@ -4,8 +4,8 @@ from django.conf.urls import url
4 4
 from django_file_upload import views as file_views
5 5
 
6 6
 from api import admin_views, mini_views, oauth_views, pack_views
7
-from pay import views as pay_views
8 7
 from live import views as live_views
8
+from pay import views as pay_views
9 9
 
10 10
 
11 11
 urlpatterns = [
@@ -23,7 +23,7 @@ urlpatterns += [
23 23
     url(r'^pay/wx/notify_url$', pay_views.wx_notify_url_api, name='wx_notify_url_api'),  # 支付异步通知回调地址
24 24
 ]
25 25
 
26
-#直播相关
26
+# 直播相关
27 27
 urlpatterns += [
28 28
     url(r'^live/anchor/detail$', live_views.anchor_detail, name='anchor_detail'),   # 微信直播间列表
29 29
     url(r'^live/goods/detail$', live_views.room_goods_detail, name='room_goods_detail'),
@@ -55,15 +55,15 @@ urlpatterns += [
55 55
     url(r'^admin/live/room/list$', admin_views.live_room_list, name='live_room_list'),   # 直播间列表
56 56
 
57 57
     url(r'^admin/live/order/list$', admin_views.live_order_list, name='live_order_list'),   # 直播间订单列表
58
-    url(r'^admin/live/order/delivery$', admin_views.live_order_delivery, name='live_order_delivery'), # 直播间订单发货
58
+    url(r'^admin/live/order/delivery$', admin_views.live_order_delivery, name='live_order_delivery'),  # 直播间订单发货
59 59
 
60
-    url(r'^admin/room/goods/list$', admin_views.room_goods_list, name='room_goods_list'), # 直播间商品
61
-    url(r'^admin/room/goods/add$', admin_views.room_goods_add, name='room_goods_add'), #添加直播间商品
62
-    url(r'^admin/room/goods/publish$', admin_views.room_goods_publish, name='room_goods_publish'), #直播间商品上架
63
-    url(r'^admin/room/goods/off$', admin_views.room_goods_off, name='room_goods_off'), #直播间商品下架
64
-    url(r'^admin/room/goods/update$', admin_views.room_goods_update, name='room_goods_update'), #直播间商品库存更新
60
+    url(r'^admin/room/goods/list$', admin_views.room_goods_list, name='room_goods_list'),  # 直播间商品
61
+    url(r'^admin/room/goods/add$', admin_views.room_goods_add, name='room_goods_add'),  # 添加直播间商品
62
+    url(r'^admin/room/goods/publish$', admin_views.room_goods_publish, name='room_goods_publish'),  # 直播间商品上架
63
+    url(r'^admin/room/goods/off$', admin_views.room_goods_off, name='room_goods_off'),  # 直播间商品下架
64
+    url(r'^admin/room/goods/update$', admin_views.room_goods_update, name='room_goods_update'),  # 直播间商品库存更新
65 65
 
66
-    #微信直播 api
66
+    # 微信直播 api
67 67
     url(r'^admin/live/wx/room/list$', admin_views.fetch_wx_room_list, name='fetch_wx_room_list'),   # 微信直播间列表
68 68
 ]
69 69
 

+ 4 - 2
live/admin.py

@@ -1,6 +1,6 @@
1 1
 from django.contrib import admin
2 2
 
3
-from live.models import RoomGoodsInfo, RoomInfo, AnchorInfo, liveGoodsInfo, RoomOrderInfo, RoomUserInfo
3
+from live.models import AnchorInfo, RoomGoodsInfo, RoomInfo, RoomOrderInfo, RoomUserInfo, liveGoodsInfo
4 4
 
5 5
 
6 6
 class AnchorInfoAdmin(admin.ModelAdmin):
@@ -18,10 +18,12 @@ class liveGoodsInfoAdmin(admin.ModelAdmin):
18 18
 class RoomGoodsInfoAdmin(admin.ModelAdmin):
19 19
     list_display = ('room_id', 'anchor_id', 'goods_id', 'inventory', 'sale_infos', 'status', 'created_at', 'updated_at')
20 20
 
21
+
21 22
 class RoomOrderInfoAdmin(admin.ModelAdmin):
22 23
     list_display = ('order_id', 'anchor_id', 'room_id', 'goods_id', 'share_openid', 'user_id', 'total_fee', 'name', 'phone', 'address', 'tracking_number', 'pay_status', 'status', 'created_at', 'updated_at')
23 24
     readonly_fields_exclude = ('tracking_number', )
24 25
 
26
+
25 27
 class RoomUserInfoAdmin(admin.ModelAdmin):
26 28
     list_display = ('room_id', 'anchor_id', 'user_id', 'openid', 'share_openid', 'status', 'created_at', 'updated_at')
27 29
 
@@ -31,4 +33,4 @@ admin.site.register(RoomInfo, RoomInfoAdmin)
31 33
 admin.site.register(liveGoodsInfo, liveGoodsInfoAdmin)
32 34
 admin.site.register(RoomGoodsInfo, RoomGoodsInfoAdmin)
33 35
 admin.site.register(RoomOrderInfo, RoomOrderInfoAdmin)
34
-admin.site.register(RoomUserInfo, RoomUserInfoAdmin)
36
+admin.site.register(RoomUserInfo, RoomUserInfoAdmin)

+ 16 - 16
live/models.py

@@ -1,5 +1,3 @@
1
-import json
2
-
3 1
 from django.db import models
4 2
 from django.utils.translation import ugettext_lazy as _
5 3
 from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path
@@ -7,9 +5,9 @@ from jsonfield import JSONField
7 5
 from shortuuidfield import ShortUUIDField
8 6
 from TimeConvert import TimeConvert as tc
9 7
 
10
-from account.models import UserInfo
11 8
 from simditor.fields import RichTextField
12 9
 
10
+
13 11
 class AnchorInfo(BaseModelMixin):
14 12
     anchor_id = ShortUUIDField(_('anchor_id'), max_length=32, blank=True, help_text='主播唯一标识', unique=True)
15 13
     # 微信相关
@@ -20,14 +18,14 @@ class AnchorInfo(BaseModelMixin):
20 18
     anchor_name = models.CharField(_('anchor_name'), max_length=255, blank=True, help_text='主播姓名', db_index=True)
21 19
     anchor_avatar = models.ImageField(_('anchor_avatar'), upload_to=upload_path, help_text='主播头像')
22 20
     anchor_intro = RichTextField(_('anchor_intro'), blank=True, help_text='主播介绍')
23
-    
21
+
24 22
     class Meta:
25 23
         verbose_name = _('主播信息')
26 24
         verbose_name_plural = _('主播信息')
27 25
 
28 26
     def __unicode__(self):
29 27
         return self.pk
30
-    
28
+
31 29
     @property
32 30
     def anchor_avatar_path(self):
33 31
         return upload_file_path(self.anchor_avatar)
@@ -35,6 +33,7 @@ class AnchorInfo(BaseModelMixin):
35 33
     @property
36 34
     def anchor_avatar_url(self):
37 35
         return upload_file_url(self.anchor_avatar)
36
+
38 37
     @property
39 38
     def banner_path(self):
40 39
         return upload_file_path(self.banner)
@@ -57,8 +56,8 @@ class RoomInfo(BaseModelMixin):
57 56
 
58 57
     anchor_id = models.CharField(_('anchor_id'), blank=True, max_length=32, help_text='主播唯一标识')
59 58
     anchor_name = models.CharField(_('anchor_name'), blank=True, max_length=255, help_text='主播名称', db_index=True)
60
-    
61
-    # "goods": [          
59
+
60
+    # "goods": [
62 61
     #     {
63 62
     #         "cover_img": "http://mmbiz.qpic.cn/mmbiz_png/FVribAGdErI2PmyST9ZM0JLbNM48I7TH2FlrwYOlnYqGaej8qKubG1EvK0QIkkwqvicrYTzVtjKmSZSeY5ianc3mw/0?wx_fmt=png",
64 63
     #         "url": "pages/index/index.html",
@@ -74,7 +73,7 @@ class RoomInfo(BaseModelMixin):
74 73
 
75 74
     def __unicode__(self):
76 75
         return self.pk
77
-    
76
+
78 77
     @property
79 78
     def cover_img_path(self):
80 79
         return upload_file_path(self.cover_img)
@@ -82,7 +81,7 @@ class RoomInfo(BaseModelMixin):
82 81
     @property
83 82
     def cover_img_url(self):
84 83
         return upload_file_url(self.cover_img)
85
-    
84
+
86 85
     @property
87 86
     def share_img_path(self):
88 87
         return upload_file_path(self.share_img)
@@ -100,7 +99,7 @@ class RoomInfo(BaseModelMixin):
100 99
             'cover_img': self.wx_cover_img,
101 100
             'share_img': self.wx_share_img,
102 101
         }
103
-       
102
+
104 103
     @property
105 104
     def admindata(self):
106 105
         anchor = AnchorInfo.objects.get(anchor_id=self.anchor_id)
@@ -117,7 +116,7 @@ class RoomInfo(BaseModelMixin):
117 116
             'anchor_avatar': anchor.anchor_avatar_url
118 117
         }
119 118
 
120
-  
119
+
121 120
 class liveGoodsInfo(BaseModelMixin):
122 121
     goods_id = ShortUUIDField(_('goods_id'), max_length=32, blank=True, help_text='商品ID', unique=True)
123 122
 
@@ -161,7 +160,7 @@ class liveGoodsInfo(BaseModelMixin):
161 160
     @property
162 161
     def goods_img_url(self):
163 162
         return upload_file_url(self.goods_img)
164
-    
163
+
165 164
     @property
166 165
     def admindata(self):
167 166
         return {
@@ -179,7 +178,6 @@ class liveGoodsInfo(BaseModelMixin):
179 178
         }
180 179
 
181 180
 
182
-
183 181
 class RoomGoodsInfo(BaseModelMixin):
184 182
     PUBLISH = 0
185 183
     DRAFT = 1
@@ -205,7 +203,7 @@ class RoomGoodsInfo(BaseModelMixin):
205 203
 
206 204
     def __unicode__(self):
207 205
         return self.pk
208
-    
206
+
209 207
     @property
210 208
     def admindata(self):
211 209
         goods = liveGoodsInfo.objects.get(goods_id=self.goods_id)
@@ -230,6 +228,7 @@ class RoomGoodsInfo(BaseModelMixin):
230 228
             'sale_count': len(self.sale_infos),
231 229
         }
232 230
 
231
+
233 232
 class RoomUserInfo(BaseModelMixin):
234 233
     room_id = models.CharField(_('room_id'), max_length=32, help_text='房间唯一标识', db_index=True)
235 234
     anchor_id = models.CharField(_('anchor_id'), max_length=32, blank=True, help_text='主播唯一标识')
@@ -247,6 +246,7 @@ class RoomUserInfo(BaseModelMixin):
247 246
     def __unicode__(self):
248 247
         return self.pk
249 248
 
249
+
250 250
 class RoomOrderInfo(BaseModelMixin):
251 251
     """
252 252
     # Trade State of Wechat Query
@@ -279,7 +279,7 @@ class RoomOrderInfo(BaseModelMixin):
279 279
     share_openid = models.CharField(_('share_openid'), max_length=32, blank=True, help_text='转发用户 openid')
280 280
 
281 281
     amount = models.IntegerField(_('amount'), default=0, help_text='数量')
282
-    
282
+
283 283
     name = models.CharField(_('name'), max_length=255, blank=True, null=True, help_text='姓名')
284 284
     phone = models.CharField(_('phone'), max_length=255, blank=True, null=True, help_text='电话')
285 285
     province = models.CharField(_('province'), max_length=255, blank=True, null=True, help_text='省份')
@@ -344,4 +344,4 @@ class RoomOrderInfo(BaseModelMixin):
344 344
             'total_fee': self.total_fee,
345 345
             'pay_status': self.pay_status,
346 346
             'paid_at': tc.local_string(utc_dt=self.paid_at, format='%Y-%m-%d %H:%M'),
347
-        }
347
+        }

+ 1 - 0
live/tests.py

@@ -1,3 +1,4 @@
1 1
 from django.test import TestCase
2 2
 
3
+
3 4
 # Create your tests here.

+ 74 - 65
live/views.py

@@ -1,35 +1,34 @@
1
-from django.shortcuts import render
2
-from django_query import get_query_value
1
+from django.conf import settings
3 2
 from django.db import transaction
4
-from django_response import response
5 3
 from django.shortcuts import HttpResponse
6 4
 from django_logit import logit
5
+from django_query import get_query_value
6
+from django_response import response
7 7
 from pywe_exception import WeChatPayException
8 8
 from pywe_pay import WeChatPay
9 9
 from pywe_pay_notify import check_pay_notify
10 10
 from pywe_response import WXPAY_NOTIFY_FAIL, WXPAY_NOTIFY_SUCCESS
11 11
 from TimeConvert import TimeConvert as tc
12 12
 
13
-from django.conf import settings
14
-
15
-from live.models import liveGoodsInfo, RoomGoodsInfo, RoomOrderInfo, RoomInfo, AnchorInfo
16 13
 from account.models import UserInfo
17
-
14
+from live.models import AnchorInfo, RoomGoodsInfo, RoomInfo, RoomOrderInfo, liveGoodsInfo
18 15
 from utils.error.errno_utils import OrderStatusCode, UserStatusCode
19 16
 
17
+
20 18
 WECHAT = settings.WECHAT
21 19
 
20
+
22 21
 def anchor_detail(request):
23 22
     anchor_id = get_query_value(request, 'anchor_id', '')
24 23
 
25 24
     try:
26 25
         anchor = AnchorInfo.objects.get(anchor_id=anchor_id)
27
-    except:
26
+    except AnchorInfo.DoesNotExist:
28 27
         return response()
29
-    
28
+
30 29
     rooms = RoomInfo.objects.filter(anchor_id=anchor_id)
31 30
     rooms = [room.anchorData for room in rooms]
32
-    
31
+
33 32
     return response(200, 'Get Room Anchor Details Success', '获取主播详情成功', data={
34 33
         'anchor': {
35 34
             'anchor_id': anchor.anchor_id,
@@ -43,49 +42,50 @@ def anchor_detail(request):
43 42
 
44 43
 
45 44
 def room_goods_detail(request):
46
-  goods_id = get_query_value(request, 'goods_id', '')
47
-  room_id = get_query_value(request, 'room_id', '')
48
-  
49
-  # 校验直播间和商品
50
-  try:
51
-    room_goods_info = RoomGoodsInfo.objects.get(goods_id=goods_id, room_id=room_id)
52
-  except:
53
-    return response(400001, 'Room Goods Not Found', '直播间商品不存在')
54
-  
55
-  try:
56
-    goods_info = liveGoodsInfo.objects.get(goods_id=goods_id)
57
-  except:
58
-    return response(400001, 'Live Goods Not Found', '直播商品不存在')
59
-
60
-  return response(200, 'Get Room Goods Detail Success', '获取直播间商品成功', data={
45
+    goods_id = get_query_value(request, 'goods_id', '')
46
+    room_id = get_query_value(request, 'room_id', '')
47
+
48
+    # 校验直播间和商品
49
+    try:
50
+        room_goods_info = RoomGoodsInfo.objects.get(goods_id=goods_id, room_id=room_id)
51
+    except RoomGoodsInfo.DoesNotExist:
52
+        return response(400001, 'Room Goods Not Found', '直播间商品不存在')
53
+
54
+    try:
55
+        goods_info = liveGoodsInfo.objects.get(goods_id=goods_id)
56
+    except liveGoodsInfo.DoesNotExist:
57
+        return response(400001, 'Live Goods Not Found', '直播商品不存在')
58
+
59
+    return response(200, 'Get Room Goods Detail Success', '获取直播间商品成功', data={
61 60
         'goods_info': {
62
-          'goods_img': goods_info.goods_img_url,
63
-          'name': goods_info.name,
64
-          'price_type': goods_info.price_type,
65
-          'price': goods_info.price,
66
-          'price2': goods_info.price2,
67
-          'goods_status': room_goods_info.goods_status,
68
-          'inventory': room_goods_info.inventory,
61
+            'goods_img': goods_info.goods_img_url,
62
+            'name': goods_info.name,
63
+            'price_type': goods_info.price_type,
64
+            'price': goods_info.price,
65
+            'price2': goods_info.price2,
66
+            'goods_status': room_goods_info.goods_status,
67
+            'inventory': room_goods_info.inventory,
69 68
         },
70 69
         'anchor_id': room_goods_info.anchor_id,
71
-      })
70
+    })
71
+
72 72
 
73 73
 def room_anchor_details(request):
74 74
     room_id = request.POST.get('room_id', '')
75 75
 
76 76
     try:
77 77
         room = RoomInfo.objects.get(room_id=room_id)
78
-    except:
78
+    except RoomInfo.DoesNotExist:
79 79
         return response()
80
-    
80
+
81 81
     try:
82 82
         anchor = AnchorInfo.objects.get(anchor_id=room.anchor_id)
83
-    except:
83
+    except AnchorInfo.DoesNotExist:
84 84
         return response()
85
-    
85
+
86 86
     rooms = RoomInfo.objects.filter(anchor_id=room.anchor_id)
87 87
     rooms = [room.anchorData for room in rooms]
88
-    
88
+
89 89
     return response(200, 'Get Room Anchor Details Success', '获取主播详情成功', data={
90 90
         'anchor': {
91 91
             'anchor_id': anchor.anchor_id,
@@ -97,6 +97,7 @@ def room_anchor_details(request):
97 97
         'rooms': rooms
98 98
     })
99 99
 
100
+
100 101
 @logit
101 102
 def live_order_create(request):
102 103
     """ 订单创建 """
@@ -121,32 +122,34 @@ def live_order_create(request):
121 122
     # 用户校验
122 123
     try:
123 124
         user = UserInfo.objects.get(user_id=user_id, status=True)
124
-        user.consignee_name = name
125
-        user.consignee_phone = phone
126
-        user.consignee_province = province
127
-        user.consignee_city = city
128
-        user.consignee_county = county
129
-        user.consignee_address = address
130
-        user.save()
131 125
     except UserInfo.DoesNotExist:
132 126
         return response(UserStatusCode.USER_NOT_FOUND)
133 127
 
128
+    user.consignee_name = name
129
+    user.consignee_phone = phone
130
+    user.consignee_province = province
131
+    user.consignee_city = city
132
+    user.consignee_county = county
133
+    user.consignee_address = address
134
+    user.save()
135
+
134 136
     # 校验直播间和商品
135 137
     try:
136 138
         room_goods_info = RoomGoodsInfo.objects.get(goods_id=goods_id, room_id=room_id, anchor_id=anchor_id)
137
-    except:
139
+    except RoomGoodsInfo.DoesNotExist:
138 140
         return response(400001, 'Room Goods Not Found', description='直播间商品不存在')
139 141
 
140
-    #库存校验
142
+    # 库存校验
141 143
     if room_goods_info.inventory <= 0:
142 144
         return response(400001, 'Room Goods Not En', description='商品库存不足')
143 145
 
144 146
     # 金额校验
145 147
     try:
146 148
         goods_info = liveGoodsInfo.objects.get(goods_id=goods_id)
147
-        if amount * int(goods_info.price if goods_info.price_type == 1 else goods_info.price2) != total_fee:
148
-            return response(404091, 'FEE Check Fail', description='金额校验失败')
149
-    except:
149
+    except liveGoodsInfo.DoesNotExist:
150
+        return response(404091, 'FEE Check Fail', description='金额校验失败')
151
+
152
+    if amount * int(goods_info.price if goods_info.price_type == 1 else goods_info.price2) != total_fee:
150 153
         return response(404091, 'FEE Check Fail', description='金额校验失败')
151 154
 
152 155
     # 消库存
@@ -198,7 +201,6 @@ def live_order_create(request):
198 201
     order.save()
199 202
 
200 203
     wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id)
201
-    
202 204
 
203 205
     return response(200, 'Order Create Success', '订单创建成功', {
204 206
         'order_id': order.order_id,
@@ -206,6 +208,7 @@ def live_order_create(request):
206 208
         'wxpay_params': wxpay_params,
207 209
     })
208 210
 
211
+
209 212
 def live_order_cancel(request):
210 213
     user_id = request.POST.get('user_id', '')
211 214
     order_id = request.POST.get('order_id', '')
@@ -213,24 +216,26 @@ def live_order_cancel(request):
213 216
 
214 217
     try:
215 218
         order = RoomOrderInfo.objects.get(user_id=user_id, order_id=order_id, prepay_id=prepay_id)
216
-    except:
219
+    except RoomOrderInfo.DoesNotExist:
217 220
         return response(400001, 'Order Not Found', description='直播间订单不存在')
218
-    
221
+
219 222
     if order.pay_status == RoomOrderInfo.FAIL:
220 223
         return response(200, 'Order Cancel Success', '订单取消成功')
221
-    
224
+
222 225
     order.pay_status = RoomOrderInfo.FAIL
223 226
     order.save()
224
-    
227
+
225 228
     try:
226 229
         goods_info = RoomGoodsInfo.objects.get(room_id=order.room_id, goods_id=order.goods_id, anchor_id=order.anchor_id)
227
-        goods_info.inventory += order.amount
228
-        goods_info.save()
229
-    except:
230
+    except RoomGoodsInfo.DoesNotExist:
230 231
         return response(400001, 'Room Goods Not Found', description='直播间商品不存在')
231
-    
232
+
233
+    goods_info.inventory += order.amount
234
+    goods_info.save()
235
+
232 236
     return response(200, 'Order Cancel Success', '订单取消成功')
233 237
 
238
+
234 239
 def order_paid_success(order):
235 240
     if order.pay_status == RoomOrderInfo.PAID:
236 241
         return
@@ -241,11 +246,13 @@ def order_paid_success(order):
241 246
 
242 247
     try:
243 248
         goods_info = RoomGoodsInfo.objects.get(room_id=order.room_id, goods_id=order.goods_id, anchor_id=order.anchor_id)
244
-        goods_info.sale_infos += [order.order_id]
245
-        goods_info.save()
246
-    except:
249
+    except RoomGoodsInfo.DoesNotExist:
247 250
         return
248 251
 
252
+    goods_info.sale_infos += [order.order_id]
253
+    goods_info.save()
254
+
255
+
249 256
 def order_paid_fail(order):
250 257
     if order.pay_status == RoomGoodsInfo.FAIL:
251 258
         return
@@ -255,11 +262,13 @@ def order_paid_fail(order):
255 262
 
256 263
     try:
257 264
         goods_info = RoomGoodsInfo.objects.get(room_id=order.room_id, goods_id=order.goods_id, anchor_id=order.anchor_id)
258
-        goods_info.inventory += order.amount
259
-        goods_info.save()
260
-    except:
265
+    except RoomGoodsInfo.DoesNotExist:
261 266
         return
262 267
 
268
+    goods_info.inventory += order.amount
269
+    goods_info.save()
270
+
271
+
263 272
 @logit
264 273
 @transaction.atomic
265 274
 def notify_url_api(request):

+ 21 - 22
pay/views.py

@@ -17,12 +17,11 @@ from TimeConvert import TimeConvert as tc
17 17
 from account.models import UserInfo
18 18
 from goods.models import GoodsInfo, PackGoodsInfo, PackGoodsSaleInfo, PackInfo
19 19
 from kol.models import KOLInfo
20
-from pay.models import OrderInfo
20
+from live import views as live_views
21 21
 from live.models import RoomOrderInfo
22
+from pay.models import OrderInfo
22 23
 from utils.error.errno_utils import KOLStatusCode, OrderStatusCode, PackGoodsStatusCode, PackStatusCode, UserStatusCode
23 24
 
24
-from live import views as live_views
25
-
26 25
 
27 26
 WECHAT = settings.WECHAT
28 27
 
@@ -82,7 +81,7 @@ def wx_order_create_api(request):
82 81
         except GoodsInfo.DoesNotExist:
83 82
             continue
84 83
         amount = amount + good.price * g.get('num', 0)
85
-    
84
+
86 85
     if amount != total_fee:
87 86
         return response(OrderStatusCode.FEE_CHECK_FAIL)
88 87
 
@@ -145,6 +144,7 @@ def wx_order_create_api(request):
145 144
         'wxpay_params': wxpay_params,
146 145
     })
147 146
 
147
+
148 148
 def order_cancel(request):
149 149
     user_id = request.POST.get('user_id', '')
150 150
     order_id = request.POST.get('order_id', '')
@@ -152,15 +152,15 @@ def order_cancel(request):
152 152
 
153 153
     try:
154 154
         order = OrderInfo.objects.get(user_id=user_id, order_id=order_id, prepay_id=prepay_id)
155
-    except:
155
+    except OrderInfo.DoesNotExist:
156 156
         return response()
157
-    
157
+
158 158
     if order.pay_status == OrderInfo.FAIL:
159 159
         return response(200, 'Order Cancel Success', '订单取消成功')
160
-    
160
+
161 161
     order.pay_status = OrderInfo.FAIL
162 162
     order.save()
163
-    
163
+
164 164
     for g in order.goods_info:
165 165
         try:
166 166
             good = PackGoodsInfo.objects.get(pack_id=order.pack_id, good_id=g.get('good_id', ''))
@@ -168,9 +168,10 @@ def order_cancel(request):
168 168
             good.save()
169 169
         except PackGoodsInfo.DoesNotExist:
170 170
             continue
171
-    
171
+
172 172
     return response(200, 'Order Cancel Success', '订单取消成功')
173 173
 
174
+
174 175
 def order_paid_success(order):
175 176
     if order.pay_status == OrderInfo.PAID:
176 177
         return
@@ -218,22 +219,20 @@ def wx_notify_url_api(request):
218 219
     if not success:
219 220
         return HttpResponse(WXPAY_NOTIFY_FAIL)
220 221
 
221
-    #尖货接龙订单
222
+    # 尖货接龙订单
222 223
     try:
223 224
         order = OrderInfo.objects.select_for_update().get(order_id=notify_data.get('out_trade_no', ''), status=True)
224
-        order.notify_msg = request.body
225
-        order.transaction_id = notify_data.get('transaction_id', '')
226
-        order.save()
227
-
228
-        result_code = notify_data.get('result_code', '')
229
-        if result_code == 'SUCCESS':
230
-            order_paid_success(order)
231
-        else:
232
-            order_paid_fail(order)
233
-        
234
-        return HttpResponse(WXPAY_NOTIFY_SUCCESS)
235
-    except:
225
+    except OrderInfo.DoesNotExist:
236 226
         return HttpResponse(WXPAY_NOTIFY_FAIL)
237 227
 
228
+    order.notify_msg = request.body
229
+    order.transaction_id = notify_data.get('transaction_id', '')
230
+    order.save()
231
+
232
+    result_code = notify_data.get('result_code', '')
233
+    if result_code == 'SUCCESS':
234
+        order_paid_success(order)
235
+    else:
236
+        order_paid_fail(order)
238 237
 
239 238
     return HttpResponse(WXPAY_NOTIFY_SUCCESS)