From f91d6c60524228cd832ae919c53898f17d8bab8b Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:33:27 +0530 Subject: [PATCH 01/59] Add editorconfig --- .editorconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b3dfee7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 From 0c5949f97e705d794a35fc0003162296eaa6b9c2 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:33:35 +0530 Subject: [PATCH 02/59] Stop ignoring typings --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index eaa97c4..d8a31b9 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,3 @@ jspm_packages # Generated files dist - -# Typings -typings/ From 26946c46ad9f697aeee2aaacf05094ce386d0b8f Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:33:46 +0530 Subject: [PATCH 03/59] Remove launch configuration --- .vscode/launch.json | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 86e5707..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Launch Chrome against localhost, with sourcemaps", - "type": "chrome", - "request": "launch", - "url": "http://localhost:3000", - "sourceMaps": true, - "webRoot": "${workspaceRoot}", - - //This line is important, since it instructs chrome to run in a separate, sandbox instance. - //This way, other running chrome instances won't prevent remote debugging from running. - "userDataDir": "C:\\temp\\chrome-dev-instance" - }, - { - "name": "Attach to Chrome, with sourcemaps", - "type": "chrome", - "request": "attach", - "port": 9222, - "sourceMaps": true, - "webRoot": "${workspaceRoot}" - } - ] -} From ce3e10bf0aa85034ccb3d9aec81677963ebc55ef Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:34:00 +0530 Subject: [PATCH 04/59] Move index.html into src --- index.html => src/index.html | 2 -- 1 file changed, 2 deletions(-) rename index.html => src/index.html (68%) diff --git a/index.html b/src/index.html similarity index 68% rename from index.html rename to src/index.html index eed6d0f..12a9551 100644 --- a/index.html +++ b/src/index.html @@ -4,10 +4,8 @@ TypeScript Starter for cycle.js with Webpack -
- \ No newline at end of file From cd40da83c891285f2967f76fdea103cf49fe45dc Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:34:09 +0530 Subject: [PATCH 05/59] Update license --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 90a9c61..1c25c07 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 Cycle.js Community +Copyright (c) 2017 Sudarsan Balaji and Cycle.js Community Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 8b0bb31dea0a508ff2e1caf756d31a857a27619f Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:34:18 +0530 Subject: [PATCH 06/59] Remove styles --- style.css | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 style.css diff --git a/style.css b/style.css deleted file mode 100644 index e69de29..0000000 From 534d6305f88e9969672a725cd6516a12c04d0ab4 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:34:26 +0530 Subject: [PATCH 07/59] Remove typings --- typings.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 typings.json diff --git a/typings.json b/typings.json deleted file mode 100644 index 8628705..0000000 --- a/typings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "globalDependencies": { - "es6-shim": "registry:dt/es6-shim#0.31.2+20160602141504" - } -} From de6d9c530a65adef4d02a71204c2c92f89935a55 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:34:33 +0530 Subject: [PATCH 08/59] Add a favicon --- src/favicon.ico | Bin 0 -> 1332 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/favicon.ico diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cbb59673578d86ec7af1d23888880af493d2e018 GIT binary patch literal 1332 zcmchXu};G<5QcrWPb!5WLVkdDD-wc=3B;066$ArHfl91A2UCW=0S^!co`N@GWMc|< zPR@2BbwVYoT7PyD`Mdkwo7?O2iRa*EoT}zkHJ_?!*-uV??A}gA=PnBS4AYN!2re! zfEciwq5+tc0kok<=nj7oGSfu&241#C3nCKIM0`IoCx~cAZdTTLrSVWHsmONy;Ld|G zmSQNJ6hp_gY~~XEIT6^fdD<3mIf6cdA-||g%jCxsLDzZ~A-1P=!CmW145$>FE#03` zB&t02+u5p^NER|@d%D!^0c(@kqW0Ym_Qa;A@4G$JH~-T8HuVzzK%{Sbr6H=zQFlxZ z+SY~*QtQ*~0&=*cu7q9M%gpr=_SLXE?S2yYa1a(NR|R2iEyq2Re*()iNhoHa)0gcd d>60#s0M)|lcT6XP)1V=+*1faN_?Pfs{sMFWul@i4 literal 0 HcmV?d00001 From aa63fc86bc46d497d3b49178416ffe5e3a760b5b Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:34:58 +0530 Subject: [PATCH 09/59] Update packages --- package.json | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index bfafa8c..7897874 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,10 @@ { "name": "typescript-starter-cycle", - "version": "1.0.0", - "description": "A simple project for getting started with TypeScript in cycle.js, using Webpack", - "main": "index.js", + "version": "2.0.0", + "description": "An opinionated starter for Cycle.js projects powered by TypeScript", "scripts": { - "postinstall": "typings install", - "dev": "concurrently \"webpack --watch\" \"lite-server\"", + "build": "cross-env NODE_ENV=production webpack", + "dev": "cross-env NODE_ENV=development webpack-dev-server --content-base ./docs --hot --inline --colors --port 3030 --open --history-api-fallback", "start": "npm run dev" }, "repository": { @@ -25,18 +24,26 @@ "url": "https://github.com/cyclejs-community/typescript-starter-cycle/issues" }, "homepage": "https://github.com/cyclejs-community/typescript-starter-cycle", - "dependencies": { - "@cycle/dom": "^10.0.6", - "@cycle/xstream-run": "^3.0.3", - "immutable": "^3.8.1", - "xstream": "^5.2.0" - }, "devDependencies": { - "concurrently": "^2.2.0", - "lite-server": "^2.2.2", - "ts-loader": "^0.8.2", - "typescript": "^1.8.10", - "typings": "^1.3.1", - "webpack": "^1.13.1" + "cross-env": "^5.1.0", + "source-map-loader": "^0.2.2", + "ts-loader": "^3.0.2", + "typescript": "^2.5.3", + "uglifyjs-webpack-plugin": "^1.0.0-beta.3", + "webpack": "^3.8.1", + "webpack-cleanup-plugin": "^0.5.1", + "webpack-dev-server": "^2.9.2", + "yargs": "^9.0.1" + }, + "dependencies": { + "@cycle/dom": "^18.3.0", + "@cycle/history": "^6.4.0", + "@cycle/http": "^14.5.0", + "@cycle/isolate": "^3.1.0", + "@cycle/run": "^3.3.0", + "ramda": "^0.25.0", + "switch-path": "^1.2.0", + "typestyle": "^1.4.3", + "xstream": "^11.0.0" } } From 360cb273ad15e73f5dc32996cadc7e9b23cd4198 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:35:04 +0530 Subject: [PATCH 10/59] Add a lockfile --- package-lock.json | 4544 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 4544 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..859d0ee --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4544 @@ +{ + "name": "typescript-starter-cycle", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@cycle/dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@cycle/dom/-/dom-18.3.0.tgz", + "integrity": "sha1-N7n1XGsPYp0baJ7OV2N3aPvu0rA=", + "requires": { + "@cycle/run": "3.3.0", + "es6-map": "0.1.5", + "snabbdom": "0.7.0", + "snabbdom-selector": "1.2.1" + } + }, + "@cycle/history": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@cycle/history/-/history-6.4.0.tgz", + "integrity": "sha1-qZT2dWE95Zhi9efs8tKC8+zhW9M=", + "requires": { + "@cycle/run": "3.3.0", + "history": "4.6.3" + } + }, + "@cycle/http": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/@cycle/http/-/http-14.5.0.tgz", + "integrity": "sha1-BbRMo+Z1ySgCvRuclaImOrgm4tU=", + "requires": { + "@cycle/run": "3.3.0", + "@types/superagent": "3.5.6", + "superagent": "3.6.3" + } + }, + "@cycle/isolate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@cycle/isolate/-/isolate-3.1.0.tgz", + "integrity": "sha1-+xWBdQ1BP4DCMGN+F/wki+ff0W8=" + }, + "@cycle/run": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@cycle/run/-/run-3.3.0.tgz", + "integrity": "sha1-oA3WOODpNJ/PDXt2KPnzcwlVm58=", + "requires": { + "xstream": "11.0.0" + } + }, + "@types/node": { + "version": "8.0.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.44.tgz", + "integrity": "sha512-56TeARKE2uMi7xWhpRRws/QdnpSVx9i7E8esGiPYoj90jnonGfmV1vwRLvHWYjPxF5u5l7p5fgdKwdse+VeAQQ==" + }, + "@types/superagent": { + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.5.6.tgz", + "integrity": "sha512-yGiVkRbB1qtIkRCpEJIxlHazBoILmu33xbbu4IiwxTJjwDi/EudiPYAD7QwWe035jkE40yQgTVXZsAePFtleww==", + "requires": { + "@types/node": "8.0.44" + } + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "ajv": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", + "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", + "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.1.1", + "multicast-dns-service-types": "1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.0.tgz", + "integrity": "sha512-W2bIMLYoZ9oow7TyePpMJk9l9LY7O3R61a/68bVCDOtnJynnwe3ZeW2IzzSkrQnPKNdJrxVDn3ALZNisSBwb7g==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.0", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-9.3.0.tgz", + "integrity": "sha512-Vbi8J1XfC8v+FbQ6QkOtKXsHpPnB0i9uMeYFJoj40EbdOsEqWB3DPpNjfsnYBkqOPYA8UvrqH6FZPpBP0zdN7g==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "1.3.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "4.1.6", + "unique-filename": "1.1.0", + "y18n": "3.2.1" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", + "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "compressible": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", + "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "bytes": "3.0.0", + "compressible": "2.0.11", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz", + "integrity": "sha1-PbJPlz9LkjsOgvYZzg3wJBHKYj0=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "cross-env": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.0.tgz", + "integrity": "sha512-R+0paw9UZQc7odHjIxElqyYotgyMlhcUMTfRxiv4I22grgvS5WOSSfCpyfAZUDhP/c9ShSRv+Hzfxs6fY4JA7g==", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "is-windows": "1.0.1" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "requires": { + "through": "2.3.8" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.35" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", + "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "duplexify": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.0.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "free-style": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/free-style/-/free-style-2.4.1.tgz", + "integrity": "sha512-MvYHzGTpNbEdESMD0Luj3GOf5PEfnl+jIpkss1C3nexFzvAnDO6GSS8PILvIErg5Cr8vwKH+1C9+q8ruLue41Q==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "history": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", + "integrity": "sha1-bXI6hxLFgda+836MJvSu3G64aWc=", + "requires": { + "invariant": "2.2.2", + "loose-envify": "1.3.1", + "resolve-pathname": "2.2.0", + "value-equal": "0.2.1", + "warning": "3.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.4", + "micromatch": "2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", + "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, + "loglevel": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.5.1.tgz", + "integrity": "sha1-GJB4yUq5BT7iFaCs2/JCROoPZQI=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.1", + "end-of-stream": "1.4.0", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.2", + "pumpify": "1.3.5", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", + "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "dev": true, + "requires": { + "dns-packet": "1.2.2", + "thunky": "0.1.0" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "node-forge": { + "version": "0.6.33", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", + "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", + "dev": true + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.11.1", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.1", + "browserify-aes": "1.1.0", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "pump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", + "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", + "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "inherits": "2.0.3", + "pump": "1.0.2" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "recursive-readdir-sync": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/recursive-readdir-sync/-/recursive-readdir-sync-1.0.6.tgz", + "integrity": "sha1-Hb9tMvPFu4083pemxYjVR6nhPVY=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve-pathname": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", + "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.2.3" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", + "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "dev": true, + "requires": { + "node-forge": "0.6.33" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snabbdom": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/snabbdom/-/snabbdom-0.7.0.tgz", + "integrity": "sha512-LCg6lH9p2OD5n52SI4LlpYmDW2bscxsyN7rhnGJB/R3LQy/FdJfqNBM5aVST+zOfM4OdKFl8pxVUhjGsPtQA1w==" + }, + "snabbdom-selector": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/snabbdom-selector/-/snabbdom-selector-1.2.1.tgz", + "integrity": "sha512-g0w2Ft4RJl+F/1/tQvA4BUsH09s+RNd0RRa+So24Inv5yzce5xUnPzxlEWNUBG5TwQjfKDZSFWrf2rXz+e1Q2g==", + "requires": { + "cssauron": "1.4.0" + } + }, + "sockjs": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", + "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "2.0.3" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.1.9" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "source-map-loader": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.2.tgz", + "integrity": "sha512-C3iYM6IqMT6jVzo6HTDmeZz9QP0ott9LtOeDJAPDQlHG5uJx+whP3c39TCMc1/FqP0feo546wCgt89JCn6DBMg==", + "dev": true, + "requires": { + "async": "0.9.2", + "loader-utils": "0.2.17", + "source-map": "0.1.43" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + } + }, + "ssri": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-4.1.6.tgz", + "integrity": "sha512-WUbCdgSAMQjTFZRWvSPpauryvREEA+Krn19rx67UlJEJx/M192ZHxMmJXjZ4tkdFm+Sb0SXGlENeQVlA5wY7kA==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "superagent": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.6.3.tgz", + "integrity": "sha512-GjsfCFijfjqoz2tRiStSOoTdy7gNZOcK3ar4zONP9D8dXQWE+Qg7cbePHimRpapo06WUvoU3dmgi2e4q+sab5A==", + "requires": { + "component-emitter": "1.2.1", + "cookiejar": "2.1.1", + "debug": "3.1.0", + "extend": "3.0.1", + "form-data": "2.3.1", + "formidable": "1.1.1", + "methods": "1.1.2", + "mime": "1.4.1", + "qs": "6.5.1", + "readable-stream": "2.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "switch-path": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/switch-path/-/switch-path-1.2.0.tgz", + "integrity": "sha1-P4css8frK3f7lQnepOPz/yXs9VY=" + }, + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "thunky": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", + "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "ts-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.0.2.tgz", + "integrity": "sha512-dy82zfGOAZtF2LRsmryU1aKebtcdIS+diswWoMjFx0wY+knHLENVI2vOvmjB7fy8i4kWRuUPK2FAxjMB4CDmCA==", + "dev": true, + "requires": { + "chalk": "2.2.0", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "semver": "5.4.1" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", + "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", + "dev": true + }, + "typestyle": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/typestyle/-/typestyle-1.4.3.tgz", + "integrity": "sha512-4XErmGDEVS60bYDAxSBKWX4WPyYuiJG+/a3mhggoirinU/d2GSmgZGJ/4SILobpuBa9fEMY9WJOGJAjBMaFuJA==", + "requires": { + "free-style": "2.4.1" + } + }, + "uglify-es": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.1.3.tgz", + "integrity": "sha512-Nuo5gkv/Q6PmLa+Ui2LvK+87YdMAcuXfRIWF0uVfkHVSfpT3Ue0euCSu4t0b8xv4Bt05lmXUT8bLI9OmnyPj8A==", + "dev": true, + "requires": { + "commander": "2.11.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.0.0-beta.3", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.0.0-beta.3.tgz", + "integrity": "sha512-4fpQrnoYEuzAwDxI2zLrKMgrknaWu71CpG4XaMRXWWyUJ7yBM4ueIhNNf0/AcKVSUgBpVudi1i9h9lWdfrU7ZQ==", + "dev": true, + "requires": { + "cacache": "9.3.0", + "find-cache-dir": "1.0.0", + "schema-utils": "0.3.0", + "source-map": "0.5.7", + "uglify-es": "3.1.3", + "webpack-sources": "1.0.1", + "worker-farm": "1.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", + "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "value-equal": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-0.2.1.tgz", + "integrity": "sha1-wiCjBDYfzmmU277ao8fhobiVhx0=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.5.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + }, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + } + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.0" + } + }, + "webpack": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", + "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.2.3", + "ajv-keywords": "2.1.0", + "async": "2.5.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.0.4", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.0.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.0.1", + "yargs": "8.0.2" + }, + "dependencies": { + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.0.1" + } + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + } + } + }, + "webpack-cleanup-plugin": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/webpack-cleanup-plugin/-/webpack-cleanup-plugin-0.5.1.tgz", + "integrity": "sha1-3y1wa9dTZMBuZbBRGGMW1nTrlq8=", + "dev": true, + "requires": { + "lodash.union": "4.6.0", + "minimatch": "3.0.3", + "recursive-readdir-sync": "1.0.6" + }, + "dependencies": { + "minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", + "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.4.1", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + } + }, + "webpack-dev-server": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.2.tgz", + "integrity": "sha512-ppL53TttdTPfiZA4EphKRE4QgtXssjLdHBwNs/MOx/fWLHCrZ0JeyE+eFcHrAcv7qOJgvR5jFZ1quO7i1LNieA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.1", + "connect-history-api-fallback": "1.4.0", + "del": "3.0.0", + "express": "4.16.2", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "loglevel": "1.5.1", + "opn": "5.1.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.1", + "serve-index": "1.9.1", + "sockjs": "0.3.18", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "4.5.0", + "webpack-dev-middleware": "1.12.0", + "yargs": "6.6.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.9", + "websocket-extensions": "0.1.2" + } + }, + "websocket-extensions": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.2.tgz", + "integrity": "sha1-Dhh4HeYpoYMIzhSBZQ9n/6JpOl0=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.0.tgz", + "integrity": "sha512-DHRiUggxtbruaTwnLDm2/BRDKZIoOYvrgYUj5Bam4fU6Gtvc0FaEyoswFPBjMXAweGW2H4BDNIpy//1yXXuaqQ==", + "dev": true, + "requires": { + "errno": "0.1.4", + "xtend": "4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xstream": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.0.0.tgz", + "integrity": "sha1-IBjDxOVz92tiuc+WoXpGh2qxIOA=", + "requires": { + "symbol-observable": "1.0.4" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} From 0f8999b749631a27e621093e49cfb0385389cd8e Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:40:53 +0530 Subject: [PATCH 11/59] Update webpack configuration --- webpack.config.js | 141 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 18 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index c4e9473..3742862 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,21 +1,126 @@ -var webpack = require('webpack'); -module.exports = { - entry: './src/app.ts', - output: { - filename: './dist/app.js' - }, - // Turn on sourcemaps +var argv = require('yargs').argv; +var webpack = require('webpack'); +var path = require('path'); +var debug = require('debug')('app:config:webpack'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); +var CleanupPlugin = require('webpack-cleanup-plugin'); +var UglifyJSPlugin = require('uglifyjs-webpack-plugin'); + +// Environment Constants +var NODE_ENV = process.env.NODE_ENV; +var API_ENDPOINT = JSON.stringify(process.env.API_ENDPOINT); +var APP_URL = JSON.stringify(process.env.APP_URL); +var __DEV__ = NODE_ENV === 'development'; +var __PROD__ = NODE_ENV === 'production'; +var __TEST__ = NODE_ENV === 'test'; +var __COVERAGE__ = !argv.watch && __TEST__; +var __BASENAME__ = JSON.stringify(process.env.BASENAME || ''); +var GLOBALS = { + 'process.env': { NODE_ENV: JSON.stringify(NODE_ENV) }, + NODE_ENV: NODE_ENV, + __DEV__: __DEV__, + __PROD__: __PROD__, + __TEST__: __TEST__, + __COVERAGE__: __COVERAGE__, + __BASENAME__: __BASENAME__ +}; + +// Constants +var ROOT = path.resolve(__dirname); +var DIST = path.join(ROOT, 'docs'); +var SRC = path.join(ROOT, 'src'); +var PROJECT_PUBLIC_PATH = '/'; + +// Base Configuration +var webpackConfig = { + name: 'client', + target: 'web', devtool: 'source-map', resolve: { - extensions: ['', '.webpack.js', '.web.js', '.ts', '.js'] + extensions: ['.ts', '.js', '.json'] }, - // Add minification - plugins: [ - new webpack.optimize.UglifyJsPlugin() - ], - module: { - loaders: [ - { test: /\.ts$/, loader: 'ts' } - ] - } -} \ No newline at end of file + module: { rules: [] } +}; + +// Entry +var APP_ENTRY = path.join(SRC, 'app.ts'); +var WEBPACK_DEV_SERVER = `webpack-dev-server/client?path=${PROJECT_PUBLIC_PATH}` +webpackConfig.entry = { + app: __DEV__ + ? [WEBPACK_DEV_SERVER, APP_ENTRY] + : [APP_ENTRY], + vendor: [ + '@cycle/run', + '@cycle/history', + '@cycle/isolate', + '@cycle/dom', + 'xstream', + 'typestyle', + 'ramda' + ] +}; + +// Output +webpackConfig.output = { + filename: `[name].[hash].js`, + path: DIST, + publicPath: PROJECT_PUBLIC_PATH +}; + +// Plugins +webpackConfig.plugins = [ + new webpack.DefinePlugin(GLOBALS), + new CleanupPlugin(), + new HtmlWebpackPlugin({ + template: path.join(SRC, 'index.html'), + hash: false, + favicon: path.join(SRC, 'favicon.ico'), + filename: 'index.html', + inject: 'body', + minify: { collapseWhitespace: true } + }) +]; + +if (__DEV__) { + debug('Enabling plugins for live development (HMR, NoErrors).') + webpackConfig.plugins.push( + new webpack.HotModuleReplacementPlugin(), + new webpack.NoEmitOnErrorsPlugin() + ) +} else if (__PROD__) { + debug('Enabling plugins for production (OccurrenceOrder & UglifyJS).') + webpackConfig.plugins.push( + new webpack.optimize.OccurrenceOrderPlugin(), + new UglifyJSPlugin({ + uglifyOptions: { + compress: { + unused: true, + dead_code: true, + warnings: false + } + } + }), + new webpack.optimize.AggressiveMergingPlugin() + ) +} + +// Don't split bundles during testing, since we only want import one bundle +if (!__TEST__) { + webpackConfig.plugins.push( + new webpack.optimize.CommonsChunkPlugin({ + names: ['vendor'] + }) + ) +} + +// Rules +function addRules(rules) { + webpackConfig.module.rules = webpackConfig.module.rules.concat(rules); +} +// TypeScript and source maps +addRules([ + { test: /\.ts$/, loader: 'ts-loader' }, + { test: /\.js$/, loader: 'source-map-loader', enforce: 'pre', exclude: [path.join(ROOT, 'node_modules')] } +]); + +module.exports = webpackConfig; From 40bdacb1c0942220082e0f49e6044c68a063657d Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:51:14 +0530 Subject: [PATCH 12/59] Add @cycle/http and switch-path to vendor --- webpack.config.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webpack.config.js b/webpack.config.js index 3742862..1172916 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -51,11 +51,13 @@ webpackConfig.entry = { : [APP_ENTRY], vendor: [ '@cycle/run', + '@cycle/http', '@cycle/history', '@cycle/isolate', '@cycle/dom', 'xstream', 'typestyle', + 'switch-path', 'ramda' ] }; From 065b0af259e31c9c211f343020cf9f091cbe191e Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 14:51:23 +0530 Subject: [PATCH 13/59] Update tsconfig.json --- tsconfig.json | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index b4a81f9..faa4b3a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,18 @@ { - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "sourceMap": true - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file + "compilerOptions": { + "outDir": "./dist/", + "target": "es5", + "module": "esnext", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "lib": [ "dom", "es6", "es5" ] + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "./src/**/*.spec.ts" + ], + "compileOnSave": false +} From 1e184efe3a6748b97ecc192eaa0421bd82bbd0ff Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 15:22:41 +0530 Subject: [PATCH 14/59] Update README --- README.md | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 25b652e..05e50b7 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,29 @@ # typescript-starter-cycle -A simple project for getting started with TypeScript in cycle.js, using Webpack. +An opinionated starter for Cycle.js projects powered by TypeScript. -## Patterns -* Simple Starter - this branch -* [Model-View-Intent (MVI) Starter](https://github.com/cyclejs-community/typescript-starter-cycle/tree/add-model-view-intent-pattern) -* [MVI with Reducers Starter](https://github.com/cyclejs-community/typescript-starter-cycle/tree/add-reducer-pattern) -* [MVI with Property Streams Starter](https://github.com/cyclejs-community/typescript-starter-cycle/tree/add-property-stream-pattern) - -
-
-
-
-
+## Features +* TypeScript +* Webpack +* Visual Studio Code integrations +* Hot Module Reloading +* TypeStyle for styles +* Unit testing with Mocha and Chai +* UI Integration tests with Cypress +* Async imports and dynamic routing +* Simple routing with layouts ##### Visual Studio Code Specifics -This repository has workspace settings and launch configuration for [Visual Studio Code](https://code.visualstudio.com/) as candy. The launch configuration will only work when the [Debugger for Chrome extension](https://code.visualstudio.com/blogs/2016/02/23/introducing-chrome-debugger-for-vs-code) is installed. The [npm Script Runner extension](https://marketplace.visualstudio.com/items?itemName=eg2.vscode-npm-script) for Visual Studio Code is also recommended. +This repository is optimized for [Visual Studio Code](https://code.visualstudio.com/). + +We have +* launch configurations +* editor config file +* workspace settings -For a quickstart guide/tutorial, see [here](https://journal.artfuldev.com/cycle-js-quick-start-with-typescript-and-webpack-in-visual-studio-code-e562a009e9d6#.qpn2b7vkl) +To make full use of these, you need the following extensions: +* [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) +* [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) ##### Notes -> If hosting on github-pages, you need to remove `dist` entry in the `.gitignore` file. +* If using on Windows machines, make sure you have the [build tools](https://github.com/felixrieseberg/windows-build-tools) ready before doing an `npm install`. +* If hosting on a subdirectory, you need to change the `PROJECT_PUBLIC_PATH` in `webpack.config.js` only for production. You can do this by changing line #32 of the file to `var PROJECT_PUBLIC_PATH = __PROD__ ? '' : '/';` From 1238ea5724267dcead935f738a266de4683f9777 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 15:55:31 +0530 Subject: [PATCH 15/59] Simplify VS Code part of README --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 05e50b7..d94118f 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,7 @@ An opinionated starter for Cycle.js projects powered by TypeScript. ##### Visual Studio Code Specifics This repository is optimized for [Visual Studio Code](https://code.visualstudio.com/). - -We have -* launch configurations -* editor config file -* workspace settings +We have launch configurations, an editor config file, and workspace settings. To make full use of these, you need the following extensions: * [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) From 61db540ef352830e5ed8d61aefce98dd149f17b0 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 15:57:57 +0530 Subject: [PATCH 16/59] Copy images and fonts upon compilation --- src/fonts/.gitkeep | 0 src/images/.gitkeep | 0 webpack.config.js | 7 ++++++- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 src/fonts/.gitkeep create mode 100644 src/images/.gitkeep diff --git a/src/fonts/.gitkeep b/src/fonts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/images/.gitkeep b/src/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/webpack.config.js b/webpack.config.js index 1172916..9d8a4b4 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -5,6 +5,7 @@ var debug = require('debug')('app:config:webpack'); var HtmlWebpackPlugin = require('html-webpack-plugin'); var CleanupPlugin = require('webpack-cleanup-plugin'); var UglifyJSPlugin = require('uglifyjs-webpack-plugin'); +var CopyWebpackPlugin = require('copy-webpack-plugin'); // Environment Constants var NODE_ENV = process.env.NODE_ENV; @@ -80,7 +81,11 @@ webpackConfig.plugins = [ filename: 'index.html', inject: 'body', minify: { collapseWhitespace: true } - }) + }), + new CopyWebpackPlugin([ + { from: 'src/images', to: 'images' }, + { from: 'src/fonts', to: 'fonts' } + ]) ]; if (__DEV__) { From 6ec61bcbbbd1e269c5cd35c58ef3c09819505413 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 15:58:22 +0530 Subject: [PATCH 17/59] Add missing packages --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 7897874..abcb06b 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,9 @@ }, "homepage": "https://github.com/cyclejs-community/typescript-starter-cycle", "devDependencies": { + "copy-webpack-plugin": "^4.1.1", "cross-env": "^5.1.0", + "html-webpack-plugin": "^2.30.1", "source-map-loader": "^0.2.2", "ts-loader": "^3.0.2", "typescript": "^2.5.3", From 55f888606873908f6f366fb6fec54a8cd3436c50 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 15:58:36 +0530 Subject: [PATCH 18/59] Update lockfile --- package-lock.json | 391 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 390 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 859d0ee..fc57a68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "typescript-starter-cycle", - "version": "1.0.0", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -334,6 +334,12 @@ "multicast-dns-service-types": "1.1.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -493,6 +499,16 @@ "y18n": "3.2.1" } }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", @@ -570,6 +586,23 @@ "safe-buffer": "5.1.1" } }, + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -738,6 +771,39 @@ "run-queue": "1.0.3" } }, + "copy-webpack-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.1.1.tgz", + "integrity": "sha512-qcjV9uj5PFuKo9GDr0xYAZ3DwFA3ugwDcfbLHfiDrvnUx66Z7C4r00/ds856GaGb2cGHqLTwrGxwfvW+lgAQew==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "fs-extra": "4.0.2", + "glob": "7.1.2", + "is-glob": "4.0.0", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "node-dir": "0.1.17" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -818,6 +884,24 @@ "randombytes": "2.0.5" } }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, "cssauron": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", @@ -977,12 +1061,72 @@ "buffer-indexof": "1.1.1" } }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, "domain-browser": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", "dev": true }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, "duplexify": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", @@ -1049,6 +1193,12 @@ "tapable": "0.2.8" } }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", @@ -1477,6 +1627,17 @@ "readable-stream": "2.3.3" } }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -1611,6 +1772,12 @@ "minimalistic-assert": "1.0.0" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "history": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/history/-/history-4.6.3.tgz", @@ -1658,6 +1825,101 @@ "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "dev": true }, + "html-minifier": { + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz", + "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.9", + "commander": "2.11.0", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.4.tgz", + "integrity": "sha512-DcbkPg11Lw2lAWpwCmQDX+qoR4JiII6ypsQmF6tscZtlxGPFAmSRUGuMoVT3/0EHqypVik/TpkH4ITiMJeQqQA==", + "dev": true, + "requires": { + "commander": "2.11.0", + "source-map": "0.6.1" + } + } + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "html-minifier": "3.5.6", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "pretty-error": "2.1.1", + "toposort": "1.0.6" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -2068,6 +2330,15 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -2180,6 +2451,12 @@ "signal-exit": "3.0.2" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", @@ -2506,12 +2783,39 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, "node-forge": { "version": "0.6.33", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", @@ -2587,6 +2891,15 @@ "path-key": "2.0.1" } }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -2736,6 +3049,15 @@ "readable-stream": "2.3.3" } }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, "parse-asn1": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", @@ -2889,6 +3211,16 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "2.0.1", + "utila": "0.4.0" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3136,12 +3468,39 @@ "is-equal-shallow": "0.1.3" } }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", @@ -3704,6 +4063,12 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -3837,12 +4202,24 @@ "imurmurhash": "0.1.4" } }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -3901,6 +4278,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -4444,6 +4827,12 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, "xstream": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.0.0.tgz", From ff05704a2b67d2f8998c1b260349775fa47855ff Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 15:59:22 +0530 Subject: [PATCH 19/59] Move devDependencies to bottom as is the usual location --- package.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index abcb06b..7746c63 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,17 @@ "url": "https://github.com/cyclejs-community/typescript-starter-cycle/issues" }, "homepage": "https://github.com/cyclejs-community/typescript-starter-cycle", + "dependencies": { + "@cycle/dom": "^18.3.0", + "@cycle/history": "^6.4.0", + "@cycle/http": "^14.5.0", + "@cycle/isolate": "^3.1.0", + "@cycle/run": "^3.3.0", + "ramda": "^0.25.0", + "switch-path": "^1.2.0", + "typestyle": "^1.4.3", + "xstream": "^11.0.0" + }, "devDependencies": { "copy-webpack-plugin": "^4.1.1", "cross-env": "^5.1.0", @@ -36,16 +47,5 @@ "webpack-cleanup-plugin": "^0.5.1", "webpack-dev-server": "^2.9.2", "yargs": "^9.0.1" - }, - "dependencies": { - "@cycle/dom": "^18.3.0", - "@cycle/history": "^6.4.0", - "@cycle/http": "^14.5.0", - "@cycle/isolate": "^3.1.0", - "@cycle/run": "^3.3.0", - "ramda": "^0.25.0", - "switch-path": "^1.2.0", - "typestyle": "^1.4.3", - "xstream": "^11.0.0" } } From 381ed7e1c1b903a5a08d0dd5370b74a2d97340d3 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:04:11 +0530 Subject: [PATCH 20/59] Fix dist path --- package.json | 2 +- webpack.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7746c63..9b3cbf3 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "An opinionated starter for Cycle.js projects powered by TypeScript", "scripts": { "build": "cross-env NODE_ENV=production webpack", - "dev": "cross-env NODE_ENV=development webpack-dev-server --content-base ./docs --hot --inline --colors --port 3030 --open --history-api-fallback", + "dev": "cross-env NODE_ENV=development webpack-dev-server --content-base ./dist --hot --inline --colors --port 3030 --open --history-api-fallback", "start": "npm run dev" }, "repository": { diff --git a/webpack.config.js b/webpack.config.js index 9d8a4b4..9639b0f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -28,7 +28,7 @@ var GLOBALS = { // Constants var ROOT = path.resolve(__dirname); -var DIST = path.join(ROOT, 'docs'); +var DIST = path.join(ROOT, 'dist'); var SRC = path.join(ROOT, 'src'); var PROJECT_PUBLIC_PATH = '/'; From 90eda174b524c4c2cd8a12fad9d1cb25f3f716ab Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:04:21 +0530 Subject: [PATCH 21/59] Add a basic app --- src/app.ts | 37 +++++-------------------------------- src/components/App.ts | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 32 deletions(-) create mode 100644 src/components/App.ts diff --git a/src/app.ts b/src/app.ts index 295c7f3..d5aa23d 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,34 +1,7 @@ -import { Stream } from 'xstream'; -import { div, label, input, hr, h1, makeDOMDriver, VNode } from '@cycle/dom'; -import { DOMSource } from '@cycle/dom/xstream-typings'; -import { run } from '@cycle/xstream-run'; +import { run } from '@cycle/run'; +import { App } from './components/App'; +import { makeDOMDriver } from '@cycle/dom'; -interface ISources { - dom: DOMSource; -} - -interface ISinks { - dom: Stream; -} - -function main(sources: ISources): ISinks { - const dom = sources.dom; - const sinks: ISinks = { - dom: dom.select('.field').events('input') - .map(ev => (ev.target as HTMLInputElement).value) - .startWith('') - .map(name => - div('#root', [ - label('Name:'), - input('.field', { attrs: { type: 'text', value: name } }), - hr(), - h1(name ? `Hello, ${name}!` : 'Hello! Please enter your name...'), - ]) - ) - }; - return sinks; -} - -run(main, { +run(App, { dom: makeDOMDriver('#app') -}) +}); diff --git a/src/components/App.ts b/src/components/App.ts new file mode 100644 index 0000000..6c0ecfb --- /dev/null +++ b/src/components/App.ts @@ -0,0 +1,18 @@ +import { Stream } from 'xstream'; +import { DOMSource, VNode, div } from '@cycle/dom'; + +export interface Sources { + dom: DOMSource; +} + +export interface Sinks { + dom: Stream; +} + +const xs = Stream; + +export const App = (sources: Sources): Sinks => { + return { + dom: xs.of(div('.app')) + }; +}; From f0f2f43d616275272bc7ebe5b278ffaa831ad8a0 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:10:38 +0530 Subject: [PATCH 22/59] Add history --- src/app.ts | 4 +++- src/components/App.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app.ts b/src/app.ts index d5aa23d..df057a5 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,7 +1,9 @@ import { run } from '@cycle/run'; import { App } from './components/App'; import { makeDOMDriver } from '@cycle/dom'; +import { makeHashHistoryDriver } from '@cycle/history'; run(App, { - dom: makeDOMDriver('#app') + dom: makeDOMDriver('#app'), + history: makeHashHistoryDriver() }); diff --git a/src/components/App.ts b/src/components/App.ts index 6c0ecfb..6a75076 100644 --- a/src/components/App.ts +++ b/src/components/App.ts @@ -1,18 +1,22 @@ -import { Stream } from 'xstream'; +import { Stream, MemoryStream } from 'xstream'; import { DOMSource, VNode, div } from '@cycle/dom'; +import { HistoryInput, Location } from '@cycle/history'; export interface Sources { dom: DOMSource; + history: MemoryStream; } export interface Sinks { dom: Stream; + history: Stream; } const xs = Stream; export const App = (sources: Sources): Sinks => { return { - dom: xs.of(div('.app')) + dom: xs.of(div('.app', ['Hello from Cycle.js!'])), + history: xs.of('') }; }; From c5963f1f5bc9b6ef5ad184ba2f2cd559d209f865 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:57:43 +0530 Subject: [PATCH 23/59] Allow relative resolution of project sources --- tsconfig.json | 3 ++- webpack.config.js | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index faa4b3a..55cc550 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "moduleResolution": "node", "sourceMap": true, "experimentalDecorators": true, - "lib": [ "dom", "es6", "es5" ] + "lib": [ "dom", "es6", "es5" ], + "baseUrl": "./src" }, "include": [ "./src/**/*" diff --git a/webpack.config.js b/webpack.config.js index 9639b0f..15b52dc 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -38,6 +38,7 @@ var webpackConfig = { target: 'web', devtool: 'source-map', resolve: { + modules: [ SRC, 'node_modules' ], extensions: ['.ts', '.js', '.json'] }, module: { rules: [] } From 8136c8f0d20fd194f33c40bdfbf416bd923ddeb2 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:57:59 +0530 Subject: [PATCH 24/59] Simplify layouts --- src/layouts/HeaderLayout.ts | 29 +++++++++++++++++++++++++++++ src/layouts/index.ts | 10 ++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/layouts/HeaderLayout.ts create mode 100644 src/layouts/index.ts diff --git a/src/layouts/HeaderLayout.ts b/src/layouts/HeaderLayout.ts new file mode 100644 index 0000000..e497698 --- /dev/null +++ b/src/layouts/HeaderLayout.ts @@ -0,0 +1,29 @@ +import { pluck } from './utils'; +import { Layout } from './'; +import { Header } from '../components/Header'; +import { Stream } from 'xstream'; +import { header, div, main } from '@cycle/dom'; +import { style } from 'typestyle'; + +const className = style({ + background: 'white' +}); + +const xs = Stream; + +export const HeaderLayout: Layout = sources => { + const headerDom$ = Header().dom; + const componentDom$ = pluck(sources.component$, c => c.dom); + const vdom$ = + xs.combine(headerDom$, componentDom$) + .map(([ headerDom, component ]) => + div(`.header.layout.${className}`, [ + header(headerDom), + main(component) + ]) + ); + return { + dom: vdom$, + history: pluck(sources.component$, c => c.history) + }; +}; diff --git a/src/layouts/index.ts b/src/layouts/index.ts new file mode 100644 index 0000000..2cebfc7 --- /dev/null +++ b/src/layouts/index.ts @@ -0,0 +1,10 @@ +import { Stream } from 'xstream'; +import { Sources, Sinks } from 'components/App'; + +interface LayoutSources extends Sources { + component$: Stream; +} + +export interface Layout { + (sources: LayoutSources): Sinks; +} From 5fa1a2deaa180340fbf79647b0d90db37b530120 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:58:07 +0530 Subject: [PATCH 25/59] Add header --- src/components/Header.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/components/Header.ts diff --git a/src/components/Header.ts b/src/components/Header.ts new file mode 100644 index 0000000..c6bbe6c --- /dev/null +++ b/src/components/Header.ts @@ -0,0 +1,19 @@ +import { Stream } from 'xstream'; +import { VNode, div, h1, em } from '@cycle/dom'; + +interface Sinks { + dom: Stream; +} + +const xs = Stream; + +export const Header = () => ({ + dom: xs.of( + div('.header', [ + h1([ + 'TypeScript Starter Cycle', + em('An opinionated starter for Cycle.js projects powered by TypeScript') + ]) + ]) + ) +}); From 6c238cc2a3ca48d1052335fb1dfa0c02b37fdd34 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:58:17 +0530 Subject: [PATCH 26/59] Add pluck --- src/layouts/utils.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/layouts/utils.ts diff --git a/src/layouts/utils.ts b/src/layouts/utils.ts new file mode 100644 index 0000000..2c4cbf5 --- /dev/null +++ b/src/layouts/utils.ts @@ -0,0 +1,4 @@ +import { Stream } from 'xstream'; + +export const pluck = (stream: Stream, getter: (single: T) => Stream): Stream => + stream.map(str => getter(str) || Stream.empty()).flatten(); From 4cc697ca66c913ad63dd5bab88f4c3602d7bffe1 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 16:58:26 +0530 Subject: [PATCH 27/59] Add a home route --- src/routes/Home/index.ts | 10 ++++++++++ src/routes/index.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 src/routes/Home/index.ts create mode 100644 src/routes/index.ts diff --git a/src/routes/Home/index.ts b/src/routes/Home/index.ts new file mode 100644 index 0000000..8e0a88c --- /dev/null +++ b/src/routes/Home/index.ts @@ -0,0 +1,10 @@ +import { RouteComponent } from 'routes'; +import { Stream } from 'xstream'; +import { div } from '@cycle/dom'; + +const xs = Stream; + +export const Home: RouteComponent = sources => ({ + dom: xs.of(div(['Home'])), + history: xs.empty() +}); diff --git a/src/routes/index.ts b/src/routes/index.ts new file mode 100644 index 0000000..fb71aa9 --- /dev/null +++ b/src/routes/index.ts @@ -0,0 +1,29 @@ +import { Stream } from 'xstream'; +import { Home } from './Home'; +import { Sources, Sinks } from 'components/App'; +import { Layout } from 'layouts'; + +export interface RouteComponent { + (sources: Sources): Sinks; +} + +export interface RouteResolution { + path?: string; + getComponent: () => Promise; + getLayout: () => Promise; + sources?: T +} + +export interface RouteDefinitions { + [path: string]: RouteResolution; +} + +export const routes: RouteDefinitions = { + '/': { + getComponent: async () => await Promise.resolve(Home), + getLayout: async () => { + const { HeaderLayout } = await import(/* webpackChunkName: "HeaderLayout" */'layouts/HeaderLayout'); + return HeaderLayout; + } + } +}; From 9d1d35175d85e15f1829b0b2b796104c2654a2a0 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 17:34:15 +0530 Subject: [PATCH 28/59] Fix routing --- src/components/App.ts | 19 ++++++++++++++++--- src/layouts/HeaderLayout.ts | 11 +++++------ src/layouts/index.ts | 2 +- src/routes/index.ts | 15 ++++++++++++++- src/{layouts/utils.ts => utils/pluck.ts} | 0 5 files changed, 36 insertions(+), 11 deletions(-) rename src/{layouts/utils.ts => utils/pluck.ts} (100%) diff --git a/src/components/App.ts b/src/components/App.ts index 6a75076..83dcc1a 100644 --- a/src/components/App.ts +++ b/src/components/App.ts @@ -1,6 +1,8 @@ import { Stream, MemoryStream } from 'xstream'; import { DOMSource, VNode, div } from '@cycle/dom'; import { HistoryInput, Location } from '@cycle/history'; +import { resolve } from 'routes'; +import { pluck } from 'utils/pluck'; export interface Sources { dom: DOMSource; @@ -15,8 +17,19 @@ export interface Sinks { const xs = Stream; export const App = (sources: Sources): Sinks => { + const app$ = + sources.history + .map(location => resolve(location.pathname)) + .map(({ getComponent, getLayout, ...resolution }) => + xs.fromPromise(Promise.all([getComponent(), getLayout()])) + .map(([Component, Layout]) => { + const layoutSources = { ...sources, component: Component({ ...sources, ...(resolution.sources || {}) }) }; + return Layout(layoutSources); + }) + ) + .flatten(); return { - dom: xs.of(div('.app', ['Hello from Cycle.js!'])), - history: xs.of('') - }; + dom: pluck(app$, app$ => app$.dom), + history: pluck(app$, app$ => app$.history) + } }; diff --git a/src/layouts/HeaderLayout.ts b/src/layouts/HeaderLayout.ts index e497698..7185f2c 100644 --- a/src/layouts/HeaderLayout.ts +++ b/src/layouts/HeaderLayout.ts @@ -1,6 +1,6 @@ -import { pluck } from './utils'; +import { pluck } from 'utils/pluck'; import { Layout } from './'; -import { Header } from '../components/Header'; +import { Header } from 'components/Header'; import { Stream } from 'xstream'; import { header, div, main } from '@cycle/dom'; import { style } from 'typestyle'; @@ -11,11 +11,10 @@ const className = style({ const xs = Stream; -export const HeaderLayout: Layout = sources => { +export const HeaderLayout: Layout = ({ component: { dom, history } }) => { const headerDom$ = Header().dom; - const componentDom$ = pluck(sources.component$, c => c.dom); const vdom$ = - xs.combine(headerDom$, componentDom$) + xs.combine(headerDom$, dom) .map(([ headerDom, component ]) => div(`.header.layout.${className}`, [ header(headerDom), @@ -24,6 +23,6 @@ export const HeaderLayout: Layout = sources => { ); return { dom: vdom$, - history: pluck(sources.component$, c => c.history) + history }; }; diff --git a/src/layouts/index.ts b/src/layouts/index.ts index 2cebfc7..b5f2b0f 100644 --- a/src/layouts/index.ts +++ b/src/layouts/index.ts @@ -2,7 +2,7 @@ import { Stream } from 'xstream'; import { Sources, Sinks } from 'components/App'; interface LayoutSources extends Sources { - component$: Stream; + component: Sinks; } export interface Layout { diff --git a/src/routes/index.ts b/src/routes/index.ts index fb71aa9..a51e0f4 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -2,6 +2,7 @@ import { Stream } from 'xstream'; import { Home } from './Home'; import { Sources, Sinks } from 'components/App'; import { Layout } from 'layouts'; +import switchPath from 'switch-path'; export interface RouteComponent { (sources: Sources): Sinks; @@ -18,7 +19,7 @@ export interface RouteDefinitions { [path: string]: RouteResolution; } -export const routes: RouteDefinitions = { +const routes: RouteDefinitions = { '/': { getComponent: async () => await Promise.resolve(Home), getLayout: async () => { @@ -27,3 +28,15 @@ export const routes: RouteDefinitions = { } } }; + +const resolveImplementation = (routes: RouteDefinitions, route: string): RouteResolution => { + const { path, value: { getComponent, getLayout, sources } } = switchPath(route, routes); + return { + path, + getComponent, + getLayout, + sources + }; +} + +export const resolve = (route: string) => resolveImplementation(routes, route); diff --git a/src/layouts/utils.ts b/src/utils/pluck.ts similarity index 100% rename from src/layouts/utils.ts rename to src/utils/pluck.ts From b9b0231d8e885121ddb61b6ef6f6c56e1c060c42 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 17:44:21 +0530 Subject: [PATCH 29/59] Make layouts optional --- src/components/App.ts | 31 +++++++++++++++++++++---------- src/routes/index.ts | 2 +- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/components/App.ts b/src/components/App.ts index 83dcc1a..6d55dd7 100644 --- a/src/components/App.ts +++ b/src/components/App.ts @@ -17,17 +17,28 @@ export interface Sinks { const xs = Stream; export const App = (sources: Sources): Sinks => { - const app$ = + const resolution$ = sources.history - .map(location => resolve(location.pathname)) - .map(({ getComponent, getLayout, ...resolution }) => - xs.fromPromise(Promise.all([getComponent(), getLayout()])) - .map(([Component, Layout]) => { - const layoutSources = { ...sources, component: Component({ ...sources, ...(resolution.sources || {}) }) }; - return Layout(layoutSources); - }) - ) - .flatten(); + .map(location => resolve(location.pathname)); + const app$ = + xs.merge( + resolution$ + .filter(resolution => !!resolution.getLayout) + .map(({ getComponent, getLayout, ...resolution }) => + xs.fromPromise(Promise.all([getComponent(), getLayout()])) + .map(([Component, Layout]) => { + const component = Component({ ...sources, ...(resolution.sources || {}) }); + const layoutSources = { ...sources, component }; + return Layout(layoutSources); + }) + ), + resolution$ + .filter(resolution => !resolution.getLayout) + .map(({ getComponent, ...resolution }) => + xs.fromPromise(getComponent().then(Component => Component({ ...sources, ...(resolution.sources || {}) }))) + ) + ) + .flatten(); return { dom: pluck(app$, app$ => app$.dom), history: pluck(app$, app$ => app$.history) diff --git a/src/routes/index.ts b/src/routes/index.ts index a51e0f4..8ab53c2 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -11,7 +11,7 @@ export interface RouteComponent { export interface RouteResolution { path?: string; getComponent: () => Promise; - getLayout: () => Promise; + getLayout?: () => Promise; sources?: T } From 0093c8a5ce84beb2dba0b874a65da8a31ca606fd Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 17:44:52 +0530 Subject: [PATCH 30/59] Fix chunkfile names --- webpack.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/webpack.config.js b/webpack.config.js index 15b52dc..6d31952 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -67,6 +67,7 @@ webpackConfig.entry = { // Output webpackConfig.output = { filename: `[name].[hash].js`, + chunkFilename: '[name].[chunkhash].js', path: DIST, publicPath: PROJECT_PUBLIC_PATH }; From 85bf32c636e91bb4f2ac78903b5cf9cce8673ce4 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 17:52:11 +0530 Subject: [PATCH 31/59] Simplify layout resolution logic --- src/components/App.ts | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/components/App.ts b/src/components/App.ts index 6d55dd7..0873d85 100644 --- a/src/components/App.ts +++ b/src/components/App.ts @@ -17,30 +17,23 @@ export interface Sinks { const xs = Stream; export const App = (sources: Sources): Sinks => { - const resolution$ = - sources.history - .map(location => resolve(location.pathname)); const app$ = - xs.merge( - resolution$ - .filter(resolution => !!resolution.getLayout) - .map(({ getComponent, getLayout, ...resolution }) => - xs.fromPromise(Promise.all([getComponent(), getLayout()])) - .map(([Component, Layout]) => { - const component = Component({ ...sources, ...(resolution.sources || {}) }); - const layoutSources = { ...sources, component }; - return Layout(layoutSources); - }) - ), - resolution$ - .filter(resolution => !resolution.getLayout) - .map(({ getComponent, ...resolution }) => - xs.fromPromise(getComponent().then(Component => Component({ ...sources, ...(resolution.sources || {}) }))) + sources.history + .map(location => resolve(location.pathname)) + .map(({ getComponent, getLayout, ...resolution }) => + xs.fromPromise( + getComponent() + .then(Component => Component({ ...sources, ...(resolution.sources || {}) })) + .then(component => + !getLayout + ? component + : getLayout().then(Layout => Layout({ ...sources, component })) + ) ) - ) - .flatten(); + ) + .flatten(); return { dom: pluck(app$, app$ => app$.dom), history: pluck(app$, app$ => app$.history) - } + }; }; From 318f966dbd397339e8b5f7a289a0e118e0e649d6 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:11:36 +0530 Subject: [PATCH 32/59] Add css utilities for typestyle --- package-lock.json | 10 ++++++++++ package.json | 2 ++ 2 files changed, 12 insertions(+) diff --git a/package-lock.json b/package-lock.json index fc57a68..e1c2720 100644 --- a/package-lock.json +++ b/package-lock.json @@ -910,6 +910,16 @@ "through": "2.3.8" } }, + "csstips": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/csstips/-/csstips-0.2.2.tgz", + "integrity": "sha1-uOClGUqkOr4WCuZuyykTYoON9oM=" + }, + "csx": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/csx/-/csx-8.5.0.tgz", + "integrity": "sha512-eSlD5gAfRztU64a5u6Rt6agNYcNti3Bv0c5weLXyQZRKhE1/hBGKIAZSw6mXcFhoPZIv2xlrTPpYdXmU9A6U2A==" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", diff --git a/package.json b/package.json index 9b3cbf3..de1f6fc 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ "@cycle/http": "^14.5.0", "@cycle/isolate": "^3.1.0", "@cycle/run": "^3.3.0", + "csstips": "^0.2.2", + "csx": "^8.5.0", "ramda": "^0.25.0", "switch-path": "^1.2.0", "typestyle": "^1.4.3", From b1ed27c2f50bc3dd092ad8359aa73309a3e739cf Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:11:44 +0530 Subject: [PATCH 33/59] Add a splash of style --- src/app.ts | 25 +++++++++++++++++++++++++ src/components/Header.ts | 15 +++++++++++++-- src/layouts/HeaderLayout.ts | 13 +++++++++++-- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/app.ts b/src/app.ts index df057a5..5b746fe 100644 --- a/src/app.ts +++ b/src/app.ts @@ -2,6 +2,31 @@ import { run } from '@cycle/run'; import { App } from './components/App'; import { makeDOMDriver } from '@cycle/dom'; import { makeHashHistoryDriver } from '@cycle/history'; +import { cssRaw } from 'typestyle'; +import { normalize, setupPage } from 'csstips'; + +normalize(); +setupPage('#app'); + +cssRaw(` + #app { + font-family: medium-content-sans-serif-font,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Geneva,Arial,sans-serif; + background: #9c27b0; + color: white; + display: flex; + } + + .layout { + display: flex; + flex: 1; + flex-direction: column; + } + + h1, h2, h3, h4, h5, h6 { + font-family: medium-ui-sans-serif-text-font,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif; + font-weight: 100; + } +`); run(App, { dom: makeDOMDriver('#app'), diff --git a/src/components/Header.ts b/src/components/Header.ts index c6bbe6c..0965835 100644 --- a/src/components/Header.ts +++ b/src/components/Header.ts @@ -1,5 +1,7 @@ import { Stream } from 'xstream'; -import { VNode, div, h1, em } from '@cycle/dom'; +import { VNode, div, h1, em, br } from '@cycle/dom'; +import { style } from 'typestyle'; +import { rem } from 'csx'; interface Sinks { dom: Stream; @@ -7,11 +9,20 @@ interface Sinks { const xs = Stream; +const className = style({ + $nest: { + '& em': { + fontSize: rem(1) + } + } +}); + export const Header = () => ({ dom: xs.of( - div('.header', [ + div(`.${className}`, [ h1([ 'TypeScript Starter Cycle', + br(), em('An opinionated starter for Cycle.js projects powered by TypeScript') ]) ]) diff --git a/src/layouts/HeaderLayout.ts b/src/layouts/HeaderLayout.ts index 7185f2c..c1a11af 100644 --- a/src/layouts/HeaderLayout.ts +++ b/src/layouts/HeaderLayout.ts @@ -2,11 +2,19 @@ import { pluck } from 'utils/pluck'; import { Layout } from './'; import { Header } from 'components/Header'; import { Stream } from 'xstream'; -import { header, div, main } from '@cycle/dom'; +import { header, div, hr, main } from '@cycle/dom'; import { style } from 'typestyle'; +import { rem } from 'csx'; const className = style({ - background: 'white' + $nest: { + '&>header': { + padding: rem(1), + }, + '&>main': { + padding: rem(1) + } + } }); const xs = Stream; @@ -18,6 +26,7 @@ export const HeaderLayout: Layout = ({ component: { dom, history } }) => { .map(([ headerDom, component ]) => div(`.header.layout.${className}`, [ header(headerDom), + hr(), main(component) ]) ); From 4e85cf3d15bf037378456631b4bac4c149788c59 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:13:12 +0530 Subject: [PATCH 34/59] Fix bottom margin for header --- src/components/Header.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/Header.ts b/src/components/Header.ts index 0965835..4743b68 100644 --- a/src/components/Header.ts +++ b/src/components/Header.ts @@ -11,6 +11,9 @@ const xs = Stream; const className = style({ $nest: { + '& h1': { + marginBottom: 0 + }, '& em': { fontSize: rem(1) } From b83e0e5f38f5f55bd2f39cf2269a794f13746c21 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:21:35 +0530 Subject: [PATCH 35/59] Add about route --- src/routes/About/index.ts | 10 ++++++++++ src/routes/index.ts | 24 +++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 src/routes/About/index.ts diff --git a/src/routes/About/index.ts b/src/routes/About/index.ts new file mode 100644 index 0000000..13ffe4e --- /dev/null +++ b/src/routes/About/index.ts @@ -0,0 +1,10 @@ +import { RouteComponent } from 'routes'; +import { Stream } from 'xstream'; +import { div } from '@cycle/dom'; + +const xs = Stream; + +export const About: RouteComponent = sources => ({ + dom: xs.of(div(['About'])), + history: xs.empty() +}); diff --git a/src/routes/index.ts b/src/routes/index.ts index 8ab53c2..0b53933 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -19,13 +19,27 @@ export interface RouteDefinitions { [path: string]: RouteResolution; } +// Example of async layout loading +const getHeaderLayout = async () => { + const { HeaderLayout } = await import(/* webpackChunkName: "HeaderLayout" */'layouts/HeaderLayout'); + return HeaderLayout; +}; + +// Helper to directly load components and layouts +const getComponent = (component: T) => async () => await Promise.resolve(component); + const routes: RouteDefinitions = { '/': { - getComponent: async () => await Promise.resolve(Home), - getLayout: async () => { - const { HeaderLayout } = await import(/* webpackChunkName: "HeaderLayout" */'layouts/HeaderLayout'); - return HeaderLayout; - } + getComponent: getComponent(Home), + getLayout: getHeaderLayout + }, + '/about': { + // Example of async component loading + getComponent: async () => { + const { About } = await import(/* webpackChunkName: "About" */'./About'); + return About; + }, + getLayout: getHeaderLayout } }; From 11cab42073d55540ccd338a266bad63270d4a49c Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:29:30 +0530 Subject: [PATCH 36/59] Add a NavMenu component --- src/components/Header/NavMenu.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/components/Header/NavMenu.ts diff --git a/src/components/Header/NavMenu.ts b/src/components/Header/NavMenu.ts new file mode 100644 index 0000000..8d1965c --- /dev/null +++ b/src/components/Header/NavMenu.ts @@ -0,0 +1,31 @@ +import { Stream } from 'xstream'; +import { DOMSource, VNode, nav, a } from '@cycle/dom'; +import isolate from '@cycle/isolate'; + +interface Sources { + dom: DOMSource; +} + +interface Sinks { + dom: Stream; + history: Stream; +} +const xs = Stream; + +const NavMenuComponent = ({ dom }: Sources): Sinks => { + const navigateTo$ = + dom.select('a') + .events('click', { preventDefault: true }) + .map(ev => (ev.target as HTMLAnchorElement).href); + const vdom$ = + xs.of(nav([ + a({ attrs: { href: '#/', title: 'Home' } }, ['Home']), + a({ attrs: { href: '#/about', title: 'About' } }, ['About']), + ])); + return { + dom: vdom$, + history: navigateTo$ + }; +}; + +export const NavMenu = (sources: Sources): Sinks => isolate(NavMenuComponent)(sources); From 32b512f50b9e6f8808bd2882a9c51a5142e799e3 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:29:38 +0530 Subject: [PATCH 37/59] Move Header into folder --- src/components/{Header.ts => Header/index.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/components/{Header.ts => Header/index.ts} (100%) diff --git a/src/components/Header.ts b/src/components/Header/index.ts similarity index 100% rename from src/components/Header.ts rename to src/components/Header/index.ts From be579d4e517a5fe4dc53665c75a2cfd44b88aac8 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 18:48:19 +0530 Subject: [PATCH 38/59] Add a nav menu to header --- src/components/Header/NavMenu.ts | 46 +++++++++++++++++++++++++++++--- src/components/Header/index.ts | 35 +++++++++++++++++------- src/layouts/HeaderLayout.ts | 8 +++--- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/src/components/Header/NavMenu.ts b/src/components/Header/NavMenu.ts index 8d1965c..0c1f3b3 100644 --- a/src/components/Header/NavMenu.ts +++ b/src/components/Header/NavMenu.ts @@ -1,6 +1,8 @@ import { Stream } from 'xstream'; import { DOMSource, VNode, nav, a } from '@cycle/dom'; import isolate from '@cycle/isolate'; +import { style } from 'typestyle'; +import { rem } from 'csx'; interface Sources { dom: DOMSource; @@ -10,6 +12,40 @@ interface Sinks { dom: Stream; history: Stream; } + +const whiteColor = { color: 'white' }; +const noTextDecoration = { textDecoration: 'none' }; +const cursorPointer = { cursor: 'pointer' }; +const navLink = { + ...whiteColor, + ...noTextDecoration +}; +const navLinkHover = { + ...navLink, + ...cursorPointer +}; + +const className = style({ + display: 'flex', + alignContent: 'flex-end', + $nest: { + '& > a': { + ...navLink, + marginRight: rem(1), + $nest: { + '&:first-child': { + marginLeft: 'auto' + }, + '&:link': navLink, + '&&:visited': navLink, + '&&&:hover': navLinkHover, + '&&&&:active': navLink, + '&&&&&:focus': navLink + } + } + } +}); + const xs = Stream; const NavMenuComponent = ({ dom }: Sources): Sinks => { @@ -18,10 +54,12 @@ const NavMenuComponent = ({ dom }: Sources): Sinks => { .events('click', { preventDefault: true }) .map(ev => (ev.target as HTMLAnchorElement).href); const vdom$ = - xs.of(nav([ - a({ attrs: { href: '#/', title: 'Home' } }, ['Home']), - a({ attrs: { href: '#/about', title: 'About' } }, ['About']), - ])); + xs.of( + nav(`.${className}`, [ + a({ attrs: { href: '#/', title: 'Home' } }, ['Home']), + a({ attrs: { href: '#/about', title: 'About' } }, ['About']), + ]) + ); return { dom: vdom$, history: navigateTo$ diff --git a/src/components/Header/index.ts b/src/components/Header/index.ts index 4743b68..39093dd 100644 --- a/src/components/Header/index.ts +++ b/src/components/Header/index.ts @@ -1,33 +1,50 @@ import { Stream } from 'xstream'; -import { VNode, div, h1, em, br } from '@cycle/dom'; +import { DOMSource, VNode, div, h1, em, br } from '@cycle/dom'; import { style } from 'typestyle'; import { rem } from 'csx'; +import { NavMenu } from './NavMenu'; + +interface Sources { + dom: DOMSource; +} interface Sinks { dom: Stream; + history: Stream; } -const xs = Stream; - const className = style({ + display: 'flex', $nest: { '& h1': { - marginBottom: 0 + marginBottom: 0, + flex: '1 0 60%', }, '& em': { fontSize: rem(1) + }, + '& nav': { + flex: 1 } } }); -export const Header = () => ({ - dom: xs.of( +const xs = Stream; + +export const Header = ({ dom }: Sources): Sinks => { + const navMenu = NavMenu({ dom }); + const vdom$ = navMenu.dom.map(navMenu => div(`.${className}`, [ h1([ 'TypeScript Starter Cycle', br(), em('An opinionated starter for Cycle.js projects powered by TypeScript') - ]) + ]), + navMenu ]) - ) -}); + ); + return { + dom: vdom$, + history: navMenu.history + }; +}; diff --git a/src/layouts/HeaderLayout.ts b/src/layouts/HeaderLayout.ts index c1a11af..a5156cc 100644 --- a/src/layouts/HeaderLayout.ts +++ b/src/layouts/HeaderLayout.ts @@ -19,11 +19,11 @@ const className = style({ const xs = Stream; -export const HeaderLayout: Layout = ({ component: { dom, history } }) => { - const headerDom$ = Header().dom; +export const HeaderLayout: Layout = ({ dom, component: { dom: componentDom, history } }) => { + const headerDom$ = Header({ dom }).dom; const vdom$ = - xs.combine(headerDom$, dom) - .map(([ headerDom, component ]) => + xs.combine(headerDom$, componentDom) + .map(([headerDom, component]) => div(`.header.layout.${className}`, [ header(headerDom), hr(), From 12e249ffef5f97974e941075a46d590be5d0948e Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 19:06:01 +0530 Subject: [PATCH 39/59] Simplify styles for clarity --- src/app.ts | 4 ++-- src/components/Header/NavMenu.ts | 20 ++++++++------------ src/components/Header/index.ts | 2 ++ src/routes/About/index.ts | 4 ++-- src/routes/Home/index.ts | 4 ++-- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/app.ts b/src/app.ts index 5b746fe..efa003c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -11,8 +11,8 @@ setupPage('#app'); cssRaw(` #app { font-family: medium-content-sans-serif-font,Lucida Grande,Lucida Sans Unicode,Lucida Sans,Geneva,Arial,sans-serif; - background: #9c27b0; - color: white; + background: white; + color: #333; display: flex; } diff --git a/src/components/Header/NavMenu.ts b/src/components/Header/NavMenu.ts index 0c1f3b3..5e41ec1 100644 --- a/src/components/Header/NavMenu.ts +++ b/src/components/Header/NavMenu.ts @@ -13,16 +13,16 @@ interface Sinks { history: Stream; } -const whiteColor = { color: 'white' }; -const noTextDecoration = { textDecoration: 'none' }; -const cursorPointer = { cursor: 'pointer' }; const navLink = { - ...whiteColor, - ...noTextDecoration + color: '#333', + fontSize: rem(1), + fontWeight: 700, + marginRight: rem(1), + textDecoration: 'none', }; const navLinkHover = { ...navLink, - ...cursorPointer + cursor: 'pointer' }; const className = style({ @@ -31,16 +31,12 @@ const className = style({ $nest: { '& > a': { ...navLink, - marginRight: rem(1), + textTransform: 'uppercase', $nest: { '&:first-child': { marginLeft: 'auto' }, - '&:link': navLink, - '&&:visited': navLink, - '&&&:hover': navLinkHover, - '&&&&:active': navLink, - '&&&&&:focus': navLink + '&&:hover': navLinkHover, } } } diff --git a/src/components/Header/index.ts b/src/components/Header/index.ts index 39093dd..31fc272 100644 --- a/src/components/Header/index.ts +++ b/src/components/Header/index.ts @@ -18,7 +18,9 @@ const className = style({ $nest: { '& h1': { marginBottom: 0, + marginTop: 0, flex: '1 0 60%', + lineHeight: 1 }, '& em': { fontSize: rem(1) diff --git a/src/routes/About/index.ts b/src/routes/About/index.ts index 13ffe4e..5e6f4af 100644 --- a/src/routes/About/index.ts +++ b/src/routes/About/index.ts @@ -1,10 +1,10 @@ import { RouteComponent } from 'routes'; import { Stream } from 'xstream'; -import { div } from '@cycle/dom'; +import { h2 } from '@cycle/dom'; const xs = Stream; export const About: RouteComponent = sources => ({ - dom: xs.of(div(['About'])), + dom: xs.of(h2(['About'])), history: xs.empty() }); diff --git a/src/routes/Home/index.ts b/src/routes/Home/index.ts index 8e0a88c..d4c9739 100644 --- a/src/routes/Home/index.ts +++ b/src/routes/Home/index.ts @@ -1,10 +1,10 @@ import { RouteComponent } from 'routes'; import { Stream } from 'xstream'; -import { div } from '@cycle/dom'; +import { h2 } from '@cycle/dom'; const xs = Stream; export const Home: RouteComponent = sources => ({ - dom: xs.of(div(['Home'])), + dom: xs.of(h2(['Home'])), history: xs.empty() }); From 74af61d1081634010394be2c5f3057efa3207f16 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 19:40:27 +0530 Subject: [PATCH 40/59] Add an example of loading route definitions from sub-route --- src/components/Header/NavMenu.ts | 4 ++- src/routes/Commits/index.ts | 31 ++++++++++++++++++++++ src/routes/Commits/routes/Details/index.ts | 10 +++++++ src/routes/Commits/routes/List/index.ts | 10 +++++++ src/routes/index.ts | 21 +++++++++++---- 5 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 src/routes/Commits/index.ts create mode 100644 src/routes/Commits/routes/Details/index.ts create mode 100644 src/routes/Commits/routes/List/index.ts diff --git a/src/components/Header/NavMenu.ts b/src/components/Header/NavMenu.ts index 5e41ec1..06f4435 100644 --- a/src/components/Header/NavMenu.ts +++ b/src/components/Header/NavMenu.ts @@ -48,11 +48,13 @@ const NavMenuComponent = ({ dom }: Sources): Sinks => { const navigateTo$ = dom.select('a') .events('click', { preventDefault: true }) - .map(ev => (ev.target as HTMLAnchorElement).href); + .map(ev => (ev.target as HTMLAnchorElement).href) + .debug(); const vdom$ = xs.of( nav(`.${className}`, [ a({ attrs: { href: '#/', title: 'Home' } }, ['Home']), + a({ attrs: { href: '#/commits', title: 'Commits' } }, ['Commits']), a({ attrs: { href: '#/about', title: 'About' } }, ['About']), ]) ); diff --git a/src/routes/Commits/index.ts b/src/routes/Commits/index.ts new file mode 100644 index 0000000..d2a5f64 --- /dev/null +++ b/src/routes/Commits/index.ts @@ -0,0 +1,31 @@ +import { RouteDefinitions } from 'routes'; +import { Stream } from 'xstream'; + +// Example of async layout loading +// This could be shared between the top level routes and this file +const getHeaderLayout = async () => { + const { HeaderLayout } = await import(/* webpackChunkName: "HeaderLayout" */'layouts/HeaderLayout'); + return HeaderLayout; +}; + +const xs = Stream; + +export const Commits: RouteDefinitions = { + '/': { + getComponent: async () => { + const { List } = await import(/* webpackChunkName: "CommitsList" */'./routes/List'); + return List; + }, + getLayout: getHeaderLayout + }, + '/:id': id => ({ + getComponent: async () => { + const { Details } = await import(/* webpackChunkName: "CommitDetails" */'./routes/Details'); + return Details; + }, + sources: { + id$: xs.of(id) + }, + getLayout: getHeaderLayout + }) +}; diff --git a/src/routes/Commits/routes/Details/index.ts b/src/routes/Commits/routes/Details/index.ts new file mode 100644 index 0000000..d138e6e --- /dev/null +++ b/src/routes/Commits/routes/Details/index.ts @@ -0,0 +1,10 @@ +import { RouteComponent } from 'routes'; +import { Stream } from 'xstream'; +import { h2 } from '@cycle/dom'; + +const xs = Stream; + +export const Details: RouteComponent = sources => ({ + dom: xs.of(h2(['Details'])), + history: xs.empty() +}); diff --git a/src/routes/Commits/routes/List/index.ts b/src/routes/Commits/routes/List/index.ts new file mode 100644 index 0000000..b24993f --- /dev/null +++ b/src/routes/Commits/routes/List/index.ts @@ -0,0 +1,10 @@ +import { RouteComponent } from 'routes'; +import { Stream } from 'xstream'; +import { h2 } from '@cycle/dom'; + +const xs = Stream; + +export const List: RouteComponent = sources => ({ + dom: xs.of(h2(['List'])), + history: xs.empty() +}); diff --git a/src/routes/index.ts b/src/routes/index.ts index 0b53933..b069276 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -3,20 +3,25 @@ import { Home } from './Home'; import { Sources, Sinks } from 'components/App'; import { Layout } from 'layouts'; import switchPath from 'switch-path'; +import { Commits } from './Commits'; export interface RouteComponent { (sources: Sources): Sinks; } -export interface RouteResolution { +interface RouteResolution { path?: string; getComponent: () => Promise; getLayout?: () => Promise; - sources?: T + sources?: any; +} + +interface ParameterizedRouteResolution { + (a: string, b?:string, c?: string, d?: string): RouteResolution; } export interface RouteDefinitions { - [path: string]: RouteResolution; + [path: string]: RouteResolution | ParameterizedRouteResolution | RouteDefinitions; } // Example of async layout loading @@ -35,15 +40,21 @@ const routes: RouteDefinitions = { }, '/about': { // Example of async component loading + // The component does not expose its own async loader because the requiring component + // should have the power to decide on async loading. getComponent: async () => { const { About } = await import(/* webpackChunkName: "About" */'./About'); return About; }, getLayout: getHeaderLayout - } + }, + // Example of loading route definitions (and nested routes) + // The synchronous sub routes are instantly loaded, the async sub routes + // are loaded asynchronously on demand. + '/commits': Commits }; -const resolveImplementation = (routes: RouteDefinitions, route: string): RouteResolution => { +const resolveImplementation = (routes: RouteDefinitions, route: string): RouteResolution => { const { path, value: { getComponent, getLayout, sources } } = switchPath(route, routes); return { path, From ddd2c57b360dcb5e99623acbf7fbbd30e55bc510 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 20:37:17 +0530 Subject: [PATCH 41/59] Add a NavLink with click capturing --- src/app.ts | 4 ++-- src/components/Header/NavMenu.ts | 41 ++++++++++++++++++-------------- src/components/Header/index.ts | 12 +++++----- src/components/NavLink.ts | 35 +++++++++++++++++++++++++++ src/layouts/HeaderLayout.ts | 8 +++---- 5 files changed, 70 insertions(+), 30 deletions(-) create mode 100644 src/components/NavLink.ts diff --git a/src/app.ts b/src/app.ts index efa003c..327fc20 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,7 +1,7 @@ import { run } from '@cycle/run'; import { App } from './components/App'; import { makeDOMDriver } from '@cycle/dom'; -import { makeHashHistoryDriver } from '@cycle/history'; +import { captureClicks, makeHashHistoryDriver } from '@cycle/history'; import { cssRaw } from 'typestyle'; import { normalize, setupPage } from 'csstips'; @@ -30,5 +30,5 @@ cssRaw(` run(App, { dom: makeDOMDriver('#app'), - history: makeHashHistoryDriver() + history: captureClicks(makeHashHistoryDriver()) }); diff --git a/src/components/Header/NavMenu.ts b/src/components/Header/NavMenu.ts index 06f4435..a077cb7 100644 --- a/src/components/Header/NavMenu.ts +++ b/src/components/Header/NavMenu.ts @@ -1,16 +1,18 @@ -import { Stream } from 'xstream'; +import { Stream, MemoryStream } from 'xstream'; import { DOMSource, VNode, nav, a } from '@cycle/dom'; import isolate from '@cycle/isolate'; import { style } from 'typestyle'; import { rem } from 'csx'; +import { NavLink } from '../NavLink'; +import { Location } from '@cycle/history'; interface Sources { dom: DOMSource; + history: MemoryStream; } interface Sinks { dom: Stream; - history: Stream; } const navLink = { @@ -43,24 +45,27 @@ const className = style({ }); const xs = Stream; +const menuItems = [ + { + href: '/', + title: 'Home' + }, + { + href: '/commits', + title: 'Commits' + }, + { + href: '/about', + title: 'About' + } +]; -const NavMenuComponent = ({ dom }: Sources): Sinks => { - const navigateTo$ = - dom.select('a') - .events('click', { preventDefault: true }) - .map(ev => (ev.target as HTMLAnchorElement).href) - .debug(); - const vdom$ = - xs.of( - nav(`.${className}`, [ - a({ attrs: { href: '#/', title: 'Home' } }, ['Home']), - a({ attrs: { href: '#/commits', title: 'Commits' } }, ['Commits']), - a({ attrs: { href: '#/about', title: 'About' } }, ['About']), - ]) - ); +const NavMenuComponent = ({ dom, history }: Sources): Sinks => { + const navLinks = menuItems.map(({ href, title }) => NavLink({ dom, history, href$: xs.of(href), title$: xs.of(title) })); + const navLinksDom$ = xs.combine(...navLinks.map(navLink => navLink.dom)) + const vdom$ = navLinksDom$.map(navLinks => nav(`.${className}`, navLinks)); return { - dom: vdom$, - history: navigateTo$ + dom: vdom$ }; }; diff --git a/src/components/Header/index.ts b/src/components/Header/index.ts index 31fc272..a11b87b 100644 --- a/src/components/Header/index.ts +++ b/src/components/Header/index.ts @@ -1,16 +1,17 @@ -import { Stream } from 'xstream'; +import { Stream, MemoryStream } from 'xstream'; import { DOMSource, VNode, div, h1, em, br } from '@cycle/dom'; import { style } from 'typestyle'; import { rem } from 'csx'; import { NavMenu } from './NavMenu'; +import { Location } from '@cycle/history'; interface Sources { dom: DOMSource; + history: MemoryStream; } interface Sinks { dom: Stream; - history: Stream; } const className = style({ @@ -33,8 +34,8 @@ const className = style({ const xs = Stream; -export const Header = ({ dom }: Sources): Sinks => { - const navMenu = NavMenu({ dom }); +export const Header = ({ dom, history }: Sources): Sinks => { + const navMenu = NavMenu({ dom, history }); const vdom$ = navMenu.dom.map(navMenu => div(`.${className}`, [ h1([ @@ -46,7 +47,6 @@ export const Header = ({ dom }: Sources): Sinks => { ]) ); return { - dom: vdom$, - history: navMenu.history + dom: vdom$ }; }; diff --git a/src/components/NavLink.ts b/src/components/NavLink.ts new file mode 100644 index 0000000..0b5f36c --- /dev/null +++ b/src/components/NavLink.ts @@ -0,0 +1,35 @@ +import { Stream, MemoryStream } from 'xstream'; +import { DOMSource, VNode, a } from '@cycle/dom'; +import { Location } from '@cycle/history'; +import isolate from '@cycle/isolate'; + +interface Sources { + dom: DOMSource; + history: MemoryStream; + href$: Stream; + title$: Stream; +} + +interface Sinks { + dom: Stream; + history: Stream; +} + +const xs = Stream; + +const NavLinkComponent = ({ dom, history, href$, title$ }: Sources): Sinks => { + const currentHref$ = history.map(location => location.pathname); + const active$ = + currentHref$ + .map(href => href$.debug().map(h => href === h)) + .flatten(); + const vdom$ = + xs.combine(href$, active$, title$) + .map(([ href, active, title ]) => a(`${!!active ? '.active' : ''}`, { attrs: { href, title } }, [title])); + return { + dom: vdom$, + history: xs.empty() + }; +}; + +export const NavLink = (sources: Sources): Sinks => isolate(NavLinkComponent)(sources); diff --git a/src/layouts/HeaderLayout.ts b/src/layouts/HeaderLayout.ts index a5156cc..d9445b4 100644 --- a/src/layouts/HeaderLayout.ts +++ b/src/layouts/HeaderLayout.ts @@ -19,10 +19,10 @@ const className = style({ const xs = Stream; -export const HeaderLayout: Layout = ({ dom, component: { dom: componentDom, history } }) => { - const headerDom$ = Header({ dom }).dom; +export const HeaderLayout: Layout = ({ dom, history, component: { dom: componentDom, history: componentHistory } }) => { + const headerComponent = Header({ dom, history }); const vdom$ = - xs.combine(headerDom$, componentDom) + xs.combine(headerComponent.dom, componentDom) .map(([headerDom, component]) => div(`.header.layout.${className}`, [ header(headerDom), @@ -32,6 +32,6 @@ export const HeaderLayout: Layout = ({ dom, component: { dom: componentDom, hist ); return { dom: vdom$, - history + history: componentHistory }; }; From 32edece72596189d233de8bb4ade59e7d1b44283 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 20:39:50 +0530 Subject: [PATCH 42/59] Style the nav menu a bit --- src/components/Header/NavMenu.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/Header/NavMenu.ts b/src/components/Header/NavMenu.ts index a077cb7..9652b8b 100644 --- a/src/components/Header/NavMenu.ts +++ b/src/components/Header/NavMenu.ts @@ -16,15 +16,17 @@ interface Sinks { } const navLink = { - color: '#333', + color: '#999', fontSize: rem(1), fontWeight: 700, marginRight: rem(1), textDecoration: 'none', + transition: 'color .3s' }; const navLinkHover = { ...navLink, - cursor: 'pointer' + cursor: 'pointer', + color: '#666' }; const className = style({ @@ -38,7 +40,10 @@ const className = style({ '&:first-child': { marginLeft: 'auto' }, - '&&:hover': navLinkHover, + '&:hover': navLinkHover, + '&.active': { + color: '#333' + } } } } From c009724bf05ba7b5ca8747e4e153a7cc0401db34 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 20:41:44 +0530 Subject: [PATCH 43/59] Remove debugging handler --- src/components/NavLink.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/NavLink.ts b/src/components/NavLink.ts index 0b5f36c..0fb2e21 100644 --- a/src/components/NavLink.ts +++ b/src/components/NavLink.ts @@ -21,7 +21,7 @@ const NavLinkComponent = ({ dom, history, href$, title$ }: Sources): Sinks => { const currentHref$ = history.map(location => location.pathname); const active$ = currentHref$ - .map(href => href$.debug().map(h => href === h)) + .map(href => href$.map(h => href === h)) .flatten(); const vdom$ = xs.combine(href$, active$, title$) From 671380998c288d64bf51050251a20190819cb98f Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 22:07:00 +0530 Subject: [PATCH 44/59] Add a github driver --- src/drivers/github.ts | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/drivers/github.ts diff --git a/src/drivers/github.ts b/src/drivers/github.ts new file mode 100644 index 0000000..72b0cc4 --- /dev/null +++ b/src/drivers/github.ts @@ -0,0 +1,61 @@ +import { Stream } from 'xstream'; +import { HTTPSource, RequestOptions, Response, makeHTTPDriver } from '@cycle/http'; + +const toRequestOptions = (sha: string): RequestOptions => { + const single = !!sha; + const url = + 'https://api.github.com/repos/cyclejs-community/typescript-starter-cycle/commits' + + (single ? `/${sha}` : ''); + const category = single ? `commit-by-sha-${sha}` : 'commits'; + return { + url, + method: 'GET', + category, + accept: 'application/vnd.github.v3+json' + }; +}; + +export interface Commit { + sha: string; + commit: { + message: string; + author: { + name: string; + email: string; + date: Date; + } + } +} + +const xs = Stream; + +export class GithubSource { + http: HTTPSource; + commits(): Stream; + commits(sha: string): Stream; + commits(sha?: string) { + return !!sha + ? this.__commitBySha(sha) + : this.__commits(); + } + constructor(commitsRequest$: Stream) { + const request$ = commitsRequest$.map(sha => toRequestOptions(sha)); + this.http = makeHTTPDriver()(request$, 'githubHttp'); + } + private __commits() { + const response$$: Stream> = this.http.select('commits'); + return response$$ + .map(response$ => response$.replaceError(() => xs.of({ status: 500, body: [] } as Response))) + .flatten() + .map(response => response.body as Commit[]).debug(); + } + private __commitBySha(sha: string) { + const response$$: Stream> = this.http.select(`commit-by-sha-${sha}`); + return response$$ + .map(response$ => response$.replaceError(() => xs.of({ status: 500, body: {} } as Response))) + .flatten() + .map(response => response.body as Commit); + } +} + +export const makeGithubDriver = () => (commitsRequest$: Stream) => new GithubSource(commitsRequest$); From b00f62891988ff1908630fd89ff7acc9000a1d71 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 22:07:51 +0530 Subject: [PATCH 45/59] Allow components and layouts to return partial sinks --- src/components/App.ts | 8 ++++++-- src/layouts/HeaderLayout.ts | 6 +++--- src/layouts/index.ts | 4 ++-- src/routes/index.ts | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/components/App.ts b/src/components/App.ts index 0873d85..82073f2 100644 --- a/src/components/App.ts +++ b/src/components/App.ts @@ -3,15 +3,18 @@ import { DOMSource, VNode, div } from '@cycle/dom'; import { HistoryInput, Location } from '@cycle/history'; import { resolve } from 'routes'; import { pluck } from 'utils/pluck'; +import { GithubSource } from 'drivers/github'; export interface Sources { dom: DOMSource; history: MemoryStream; + github: GithubSource; } export interface Sinks { dom: Stream; history: Stream; + github: Stream; } const xs = Stream; @@ -26,7 +29,7 @@ export const App = (sources: Sources): Sinks => { .then(Component => Component({ ...sources, ...(resolution.sources || {}) })) .then(component => !getLayout - ? component + ? Promise.resolve(component) : getLayout().then(Layout => Layout({ ...sources, component })) ) ) @@ -34,6 +37,7 @@ export const App = (sources: Sources): Sinks => { .flatten(); return { dom: pluck(app$, app$ => app$.dom), - history: pluck(app$, app$ => app$.history) + history: pluck(app$, app$ => app$.history), + github: pluck(app$, app$ => app$.github) }; }; diff --git a/src/layouts/HeaderLayout.ts b/src/layouts/HeaderLayout.ts index d9445b4..357bdc6 100644 --- a/src/layouts/HeaderLayout.ts +++ b/src/layouts/HeaderLayout.ts @@ -19,10 +19,10 @@ const className = style({ const xs = Stream; -export const HeaderLayout: Layout = ({ dom, history, component: { dom: componentDom, history: componentHistory } }) => { +export const HeaderLayout: Layout = ({ dom, history, github, component: { dom: componentDom, ...component } }) => { const headerComponent = Header({ dom, history }); const vdom$ = - xs.combine(headerComponent.dom, componentDom) + xs.combine(headerComponent.dom, componentDom || xs.empty()) .map(([headerDom, component]) => div(`.header.layout.${className}`, [ header(headerDom), @@ -32,6 +32,6 @@ export const HeaderLayout: Layout = ({ dom, history, component: { dom: component ); return { dom: vdom$, - history: componentHistory + ...component }; }; diff --git a/src/layouts/index.ts b/src/layouts/index.ts index b5f2b0f..da3d354 100644 --- a/src/layouts/index.ts +++ b/src/layouts/index.ts @@ -2,9 +2,9 @@ import { Stream } from 'xstream'; import { Sources, Sinks } from 'components/App'; interface LayoutSources extends Sources { - component: Sinks; + component: Partial; } export interface Layout { - (sources: LayoutSources): Sinks; + (sources: LayoutSources): Partial; } diff --git a/src/routes/index.ts b/src/routes/index.ts index b069276..fa80988 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -6,7 +6,7 @@ import switchPath from 'switch-path'; import { Commits } from './Commits'; export interface RouteComponent { - (sources: Sources): Sinks; + (sources: Sources): Partial; } interface RouteResolution { From 5f27abb4473bd922cd7816d326eca4863105d000 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 22:08:03 +0530 Subject: [PATCH 46/59] Add github driver to app --- src/app.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app.ts b/src/app.ts index 327fc20..1186412 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,9 +1,10 @@ import { run } from '@cycle/run'; -import { App } from './components/App'; +import { App } from 'components/App'; import { makeDOMDriver } from '@cycle/dom'; import { captureClicks, makeHashHistoryDriver } from '@cycle/history'; import { cssRaw } from 'typestyle'; import { normalize, setupPage } from 'csstips'; +import { makeGithubDriver } from 'drivers/github'; normalize(); setupPage('#app'); @@ -30,5 +31,6 @@ cssRaw(` run(App, { dom: makeDOMDriver('#app'), - history: captureClicks(makeHashHistoryDriver()) + history: captureClicks(makeHashHistoryDriver()), + github: makeGithubDriver() }); From 65c22b5e9025589be254f18c5d0653bf66cf3504 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Wed, 18 Oct 2017 22:08:36 +0530 Subject: [PATCH 47/59] Load commits list --- src/routes/Commits/routes/List/index.ts | 27 ++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/routes/Commits/routes/List/index.ts b/src/routes/Commits/routes/List/index.ts index b24993f..7dc5c14 100644 --- a/src/routes/Commits/routes/List/index.ts +++ b/src/routes/Commits/routes/List/index.ts @@ -1,10 +1,27 @@ import { RouteComponent } from 'routes'; import { Stream } from 'xstream'; -import { h2 } from '@cycle/dom'; +import { div, h2, ul, li } from '@cycle/dom'; +import { Commit } from 'drivers/github'; const xs = Stream; -export const List: RouteComponent = sources => ({ - dom: xs.of(h2(['List'])), - history: xs.empty() -}); +export const List: RouteComponent = ({ dom, history, github }) => { + const commits$ = github.commits(); + const commitListItems$ = + commits$.map(commits => + commits.map(commit => li({ attrs: { 'data-sha': commit.sha } }, [commit.commit.message])) + ); + const vdom$ = commitListItems$.map(commits => + div([ + h2('Commits List'), + ul(commits) + ]) + ); + const navigateTo$ = xs.empty(); + const request$ = xs.of(''); + return { + dom: vdom$, + history: navigateTo$, + github: request$ + }; +}; From fadde586a728ec05438094d29062ec5d0b53b3d0 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 18:53:59 +0530 Subject: [PATCH 48/59] Add a list item component for commits --- .../routes/List/components/CommitListItem.ts | 32 +++++++++++++++++++ src/routes/Commits/routes/List/index.ts | 17 +++++++--- 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/routes/Commits/routes/List/components/CommitListItem.ts diff --git a/src/routes/Commits/routes/List/components/CommitListItem.ts b/src/routes/Commits/routes/List/components/CommitListItem.ts new file mode 100644 index 0000000..853a7f4 --- /dev/null +++ b/src/routes/Commits/routes/List/components/CommitListItem.ts @@ -0,0 +1,32 @@ +import { Stream } from 'xstream'; +import { DOMSource, VNode, li } from '@cycle/dom'; +import isolate from '@cycle/isolate'; +import { Commit } from 'drivers/github'; + +interface Sources { + dom: DOMSource; + commit$: Stream; +} + +interface Sinks { + dom: Stream; + history: Stream; +} + +const CommitListItemComponent = ({ dom, commit$ }: Sources): Sinks => { + const navigateTo$ = + commit$ + .map(({ sha }) => dom.select('li').events('click', { preventDefault: true }).map(ev => `/commits/s${sha}`)) + .flatten(); + const vdom$ = + commit$ + .map(({ sha, commit: { message, author: { name, email, date } } }) => + li([ message ]) + ); + return { + dom: vdom$, + history: navigateTo$ + }; +} + +export const CommitListItem = (sources: Sources): Sinks => isolate(CommitListItemComponent)(sources); diff --git a/src/routes/Commits/routes/List/index.ts b/src/routes/Commits/routes/List/index.ts index 7dc5c14..ee5dacd 100644 --- a/src/routes/Commits/routes/List/index.ts +++ b/src/routes/Commits/routes/List/index.ts @@ -1,7 +1,8 @@ import { RouteComponent } from 'routes'; import { Stream } from 'xstream'; -import { div, h2, ul, li } from '@cycle/dom'; +import { div, h2, ul, li, VNode } from '@cycle/dom'; import { Commit } from 'drivers/github'; +import { CommitListItem } from './components/CommitListItem'; const xs = Stream; @@ -9,15 +10,23 @@ export const List: RouteComponent = ({ dom, history, github }) => { const commits$ = github.commits(); const commitListItems$ = commits$.map(commits => - commits.map(commit => li({ attrs: { 'data-sha': commit.sha } }, [commit.commit.message])) + commits + .map(commit => CommitListItem({ dom, commit$: xs.of(commit) })) ); - const vdom$ = commitListItems$.map(commits => + const commitListItemDoms$ = + commitListItems$ + .map(clis => xs.combine(...clis.map(cli => cli.dom))) + .flatten(); + const vdom$ = commitListItemDoms$.map(commits => div([ h2('Commits List'), ul(commits) ]) ); - const navigateTo$ = xs.empty(); + const navigateTo$ = + commitListItems$ + .map(clis => xs.merge(...clis.map(cli => cli.history))) + .flatten();; const request$ = xs.of(''); return { dom: vdom$, From 06405102febcd847aab64411bb0bc327eef2c536 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 18:54:34 +0530 Subject: [PATCH 49/59] Filter out merge commits --- src/routes/Commits/routes/List/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/Commits/routes/List/index.ts b/src/routes/Commits/routes/List/index.ts index ee5dacd..4d31d86 100644 --- a/src/routes/Commits/routes/List/index.ts +++ b/src/routes/Commits/routes/List/index.ts @@ -11,6 +11,7 @@ export const List: RouteComponent = ({ dom, history, github }) => { const commitListItems$ = commits$.map(commits => commits + .filter(commit => !commit.commit.message.startsWith('Merge')) .map(commit => CommitListItem({ dom, commit$: xs.of(commit) })) ); const commitListItemDoms$ = From 68127ec2f7f570229a984989acdea0232f6f497c Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 18:56:09 +0530 Subject: [PATCH 50/59] Fix type signature --- src/routes/Commits/routes/List/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/Commits/routes/List/index.ts b/src/routes/Commits/routes/List/index.ts index 4d31d86..d63afb1 100644 --- a/src/routes/Commits/routes/List/index.ts +++ b/src/routes/Commits/routes/List/index.ts @@ -16,7 +16,7 @@ export const List: RouteComponent = ({ dom, history, github }) => { ); const commitListItemDoms$ = commitListItems$ - .map(clis => xs.combine(...clis.map(cli => cli.dom))) + .map>(clis => xs.combine(...clis.map(cli => cli.dom))) .flatten(); const vdom$ = commitListItemDoms$.map(commits => div([ From 8d38bc0d5bd4a5ff0f0c9f180d5951543094d3bb Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 18:56:38 +0530 Subject: [PATCH 51/59] Capture navigation intent first --- src/routes/Commits/routes/List/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/Commits/routes/List/index.ts b/src/routes/Commits/routes/List/index.ts index d63afb1..7d44afa 100644 --- a/src/routes/Commits/routes/List/index.ts +++ b/src/routes/Commits/routes/List/index.ts @@ -14,6 +14,10 @@ export const List: RouteComponent = ({ dom, history, github }) => { .filter(commit => !commit.commit.message.startsWith('Merge')) .map(commit => CommitListItem({ dom, commit$: xs.of(commit) })) ); + const navigateTo$ = + commitListItems$ + .map(clis => xs.merge(...clis.map(cli => cli.history))) + .flatten(); const commitListItemDoms$ = commitListItems$ .map>(clis => xs.combine(...clis.map(cli => cli.dom))) @@ -24,10 +28,6 @@ export const List: RouteComponent = ({ dom, history, github }) => { ul(commits) ]) ); - const navigateTo$ = - commitListItems$ - .map(clis => xs.merge(...clis.map(cli => cli.history))) - .flatten();; const request$ = xs.of(''); return { dom: vdom$, From 5a9f2ec36dacec80e24d4c7e91626923eea173e6 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 22:41:34 +0530 Subject: [PATCH 52/59] Add a back button --- src/components/BackButton.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/components/BackButton.ts diff --git a/src/components/BackButton.ts b/src/components/BackButton.ts new file mode 100644 index 0000000..88266d7 --- /dev/null +++ b/src/components/BackButton.ts @@ -0,0 +1,32 @@ +import { Stream } from 'xstream'; +import { HistoryInput } from '@cycle/history'; +import { DOMSource, VNode, button } from '@cycle/dom'; +import isolate from '@cycle/isolate'; + +interface Sources { + dom: DOMSource; + class$?: Stream; +} + +interface Sinks { + dom: Stream; + history: Stream; +} + +const xs = Stream; + +const BackButtonComponent = ({ dom, class$ }: Sources): Sinks => { + const goBack$ = + dom.select('button') + .events('click', { preventDefault: true }) + .mapTo({ type: 'goBack' }); + const vdom$ = + (class$ || xs.of('')) + .map(className => button(`.back-button.${className}`, ['Back'])); + return { + dom: vdom$, + history: goBack$ + } +}; + +export const BackButton = (sources: Sources): Sinks => isolate(BackButtonComponent)(sources); From 456d4ba335ad4d08f38fb7db989b547f0e572841 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 22:49:13 +0530 Subject: [PATCH 53/59] Add a back button to details page --- src/routes/Commits/routes/Details/index.ts | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/routes/Commits/routes/Details/index.ts b/src/routes/Commits/routes/Details/index.ts index d138e6e..64a6838 100644 --- a/src/routes/Commits/routes/Details/index.ts +++ b/src/routes/Commits/routes/Details/index.ts @@ -1,10 +1,26 @@ import { RouteComponent } from 'routes'; import { Stream } from 'xstream'; -import { h2 } from '@cycle/dom'; +import { div, h2 } from '@cycle/dom'; +import { BackButton } from 'components/BackButton'; +import { style } from 'typestyle'; +import { rem } from 'csx'; -const xs = Stream; - -export const Details: RouteComponent = sources => ({ - dom: xs.of(h2(['Details'])), - history: xs.empty() +const className = style({ + display: 'inline', + marginLeft: rem(1) }); + +export const Details: RouteComponent = ({ dom, history, github }) => { + const backButton = BackButton({ dom }); + const vdom$ = + backButton.dom.map(button => + div([ + button, + h2(`.${className}`, ['Details']) + ]) + ); + return { + dom: vdom$, + history: backButton.history + }; +}; From aaff2422b42a41d8beb7dd73469eb6b81def5c35 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 23:18:14 +0530 Subject: [PATCH 54/59] Complete details --- src/routes/Commits/index.ts | 5 +- src/routes/Commits/routes/Details/index.ts | 51 +++++++++++++++---- .../routes/List/components/CommitListItem.ts | 2 +- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/routes/Commits/index.ts b/src/routes/Commits/index.ts index d2a5f64..2cfb35f 100644 --- a/src/routes/Commits/index.ts +++ b/src/routes/Commits/index.ts @@ -18,13 +18,14 @@ export const Commits: RouteDefinitions = { }, getLayout: getHeaderLayout }, - '/:id': id => ({ + // Example of providing additional sources based on route parameters + '/:sha': sha => ({ getComponent: async () => { const { Details } = await import(/* webpackChunkName: "CommitDetails" */'./routes/Details'); return Details; }, sources: { - id$: xs.of(id) + sha$: xs.of(sha) }, getLayout: getHeaderLayout }) diff --git a/src/routes/Commits/routes/Details/index.ts b/src/routes/Commits/routes/Details/index.ts index 64a6838..d250f02 100644 --- a/src/routes/Commits/routes/Details/index.ts +++ b/src/routes/Commits/routes/Details/index.ts @@ -1,26 +1,57 @@ -import { RouteComponent } from 'routes'; +import { Sources as RouteComponentSources, Sinks } from 'components/App'; import { Stream } from 'xstream'; -import { div, h2 } from '@cycle/dom'; +import { div, h2, h3, hr, p, h4, strong, em } from '@cycle/dom'; import { BackButton } from 'components/BackButton'; import { style } from 'typestyle'; import { rem } from 'csx'; +import { Commit } from 'drivers/github'; + +interface Sources extends RouteComponentSources { + sha$: Stream; +} const className = style({ display: 'inline', marginLeft: rem(1) }); -export const Details: RouteComponent = ({ dom, history, github }) => { +const xs = Stream; + +const initialCommit: Commit = { + sha: '', + commit: { + author: { + name: 'Loading...', + email: 'Loading...', + date: undefined + }, + message: 'Loading...' + } +}; + +export const Details: (sources: Sources) => Partial = ({ dom, github, sha$ }) => { const backButton = BackButton({ dom }); + const details$ = + sha$ + .map(sha => github.commits(sha).startWith(initialCommit)) + .flatten(); const vdom$ = - backButton.dom.map(button => - div([ - button, - h2(`.${className}`, ['Details']) - ]) - ); + xs.combine(backButton.dom, details$) + .map(([backButton, { sha, commit: { message, author: { name, email, date } } }]) => + div([ + backButton, + h2(`.${className}`, ['Details']), + hr(), + h3([message.split('\n\n')[0]]), + h4([strong([name])]), + h4([email]), + h4([em([date])]), + p([message.split('\n\n')[1] || '']) + ]) + ); return { dom: vdom$, - history: backButton.history + history: backButton.history, + github: sha$ }; }; diff --git a/src/routes/Commits/routes/List/components/CommitListItem.ts b/src/routes/Commits/routes/List/components/CommitListItem.ts index 853a7f4..0e41669 100644 --- a/src/routes/Commits/routes/List/components/CommitListItem.ts +++ b/src/routes/Commits/routes/List/components/CommitListItem.ts @@ -16,7 +16,7 @@ interface Sinks { const CommitListItemComponent = ({ dom, commit$ }: Sources): Sinks => { const navigateTo$ = commit$ - .map(({ sha }) => dom.select('li').events('click', { preventDefault: true }).map(ev => `/commits/s${sha}`)) + .map(({ sha }) => dom.select('li').events('click', { preventDefault: true }).map(ev => `/commits/${sha}`)) .flatten(); const vdom$ = commit$ From 57c095b8625f79e37a396f5fd29ae602cfabafd7 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 23:24:57 +0530 Subject: [PATCH 55/59] Add styling and details to commit list items --- .../routes/List/components/CommitListItem.ts | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/routes/Commits/routes/List/components/CommitListItem.ts b/src/routes/Commits/routes/List/components/CommitListItem.ts index 0e41669..d9110f8 100644 --- a/src/routes/Commits/routes/List/components/CommitListItem.ts +++ b/src/routes/Commits/routes/List/components/CommitListItem.ts @@ -1,7 +1,9 @@ import { Stream } from 'xstream'; -import { DOMSource, VNode, li } from '@cycle/dom'; +import { DOMSource, VNode, li, h4, h5, strong, em } from '@cycle/dom'; import isolate from '@cycle/isolate'; import { Commit } from 'drivers/github'; +import { style } from 'typestyle'; +import { rem } from 'csx'; interface Sources { dom: DOMSource; @@ -13,6 +15,23 @@ interface Sinks { history: Stream; } +const className = style({ + marginBottom: rem(1), + border: `${rem(.1)} solid #ddd`, + padding: rem(1), + listStyle: 'none', + borderRadius: rem(.5), + $nest: { + 'h4, h5': { + marginTop: 0, + marginBottom: rem(.5) + }, + h5: { + marginBottom: 0 + } + } +}); + const CommitListItemComponent = ({ dom, commit$ }: Sources): Sinks => { const navigateTo$ = commit$ @@ -21,7 +40,15 @@ const CommitListItemComponent = ({ dom, commit$ }: Sources): Sinks => { const vdom$ = commit$ .map(({ sha, commit: { message, author: { name, email, date } } }) => - li([ message ]) + li(`.${className}`, [ + h4([strong([message.split('\n\n')[0]])]), + h5([ + 'by ', + strong([name]), + ' at ', + em([date]) + ]) + ]) ); return { dom: vdom$, From 67bc33cdb2db9600035009f2ba809259c6c0aa94 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 23:29:15 +0530 Subject: [PATCH 56/59] Update README --- README.md | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d94118f..13e4933 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,28 @@ # typescript-starter-cycle An opinionated starter for Cycle.js projects powered by TypeScript. +## Opinions +* TypeScript rocks. We use TypeScript as much as possible. +* Visual Studio Code rocks. We use Visual Studio Code as the recommended editor. +* Webpack rocks. We use webpack only. + ## Features * TypeScript * Webpack -* Visual Studio Code integrations -* Hot Module Reloading * TypeStyle for styles +* Simple routing with layouts +* Hot Module Reloading +* Async imports and dynamic routing +* Visual Studio Code integrations + +### Planned * Unit testing with Mocha and Chai * UI Integration tests with Cypress -* Async imports and dynamic routing -* Simple routing with layouts +* Better README (duh!) + +## Notes -##### Visual Studio Code Specifics +### Visual Studio Code Specifics This repository is optimized for [Visual Studio Code](https://code.visualstudio.com/). We have launch configurations, an editor config file, and workspace settings. @@ -20,6 +30,6 @@ To make full use of these, you need the following extensions: * [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) * [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) -##### Notes +### Troubleshooting / Tips * If using on Windows machines, make sure you have the [build tools](https://github.com/felixrieseberg/windows-build-tools) ready before doing an `npm install`. * If hosting on a subdirectory, you need to change the `PROJECT_PUBLIC_PATH` in `webpack.config.js` only for production. You can do this by changing line #32 of the file to `var PROJECT_PUBLIC_PATH = __PROD__ ? '' : '/';` From ac79d24fea77edf245524930afc0f9395f7aa6be Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Thu, 19 Oct 2017 23:30:20 +0530 Subject: [PATCH 57/59] Add more planned features --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 13e4933..6fe7451 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ An opinionated starter for Cycle.js projects powered by TypeScript. ### Planned * Unit testing with Mocha and Chai * UI Integration tests with Cypress +* Explanation of folder structure +* Wiki section on recommended practices * Better README (duh!) ## Notes From 82d3727f7a5f3b212e558c938342640d41795837 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 20 Oct 2017 00:48:25 +0530 Subject: [PATCH 58/59] Add launch configuration for Google Chrome --- .vscode/launch.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..991a5bd --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "Launch Chrome against localhost", + "url": "http://localhost:3030", + "webRoot": "${workspaceRoot}" + } + ] +} From 7f2d57af0dfeecbfd64f5a576a8b95c00a947820 Mon Sep 17 00:00:00 2001 From: Sudarsan Balaji Date: Fri, 20 Oct 2017 00:52:02 +0530 Subject: [PATCH 59/59] Update README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fe7451..1bda5e2 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ An opinionated starter for Cycle.js projects powered by TypeScript. * Unit testing with Mocha and Chai * UI Integration tests with Cypress * Explanation of folder structure -* Wiki section on recommended practices +* Wiki section on recommended/best practices * Better README (duh!) ## Notes @@ -35,3 +35,4 @@ To make full use of these, you need the following extensions: ### Troubleshooting / Tips * If using on Windows machines, make sure you have the [build tools](https://github.com/felixrieseberg/windows-build-tools) ready before doing an `npm install`. * If hosting on a subdirectory, you need to change the `PROJECT_PUBLIC_PATH` in `webpack.config.js` only for production. You can do this by changing line #32 of the file to `var PROJECT_PUBLIC_PATH = __PROD__ ? '' : '/';` +* If you need help with something, or have feedback, suggestions, feel free to open an issue on this repository.