diff --git a/source/nodejs/README.md b/source/nodejs/README.md index 7a6f0cba1b..1cd3671520 100644 --- a/source/nodejs/README.md +++ b/source/nodejs/README.md @@ -4,6 +4,8 @@ This directory contains all the JS packages for adaptive cards: * `adaptivecards` - The renderer library * `adaptivecards-controls` - A controls library useful for the designer +* `adaptivecards-fabric` - A set of Fabric UI extensions for the Adaptive Cards JS renderer +* `adaptivecards-templating` - A JSON-to-JSON templating and data binding library for use with Adaptive Cards * `adaptivecards-designer` - The drag-drop designer component * `adaptivecards-designer-app` - The designer app that consumes the designer component * `adaptivecards-site` - The generated website that is currently hosted at adaptivecards.io @@ -21,18 +23,19 @@ We use lerna to manage package linking and building. `npx lerna run build` -## Start the Designer or Visualizer +## Start the Designer -1. `cd adaptivecards-designer` (or `adaptivecards-visualizer`) +1. `cd adaptivecards-designer` 2. `npm start` +3. OR to test preview features: `npm run start:preview` # Start the documentation site (http://adaptivecards.io) 1. `cd adaptivecards-site` -2. `npm install hexo-cli -g` -3. `hexo generate` -4. `hexo server` -5. `Open up the browser to point to localhost:[portnumber] printed after the command above returns under "Hexo is running at".` +2. `npx lerna run release` +3. `npm install hexo-cli -g` +5. `npm start` +6. Open up the browser to point to: `localhost:[portnumber]` printed after the command above returns under "Hexo is running at". ## Adding a new package diff --git a/source/nodejs/adaptivecards-controls/package-lock.json b/source/nodejs/adaptivecards-controls/package-lock.json index c0ee3af64c..498765c826 100644 --- a/source/nodejs/adaptivecards-controls/package-lock.json +++ b/source/nodejs/adaptivecards-controls/package-lock.json @@ -353,7 +353,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -562,7 +562,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -599,7 +599,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -633,7 +633,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -999,7 +999,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1012,7 +1012,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1193,7 +1193,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -1358,7 +1358,7 @@ }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, @@ -1784,12 +1784,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1802,17 +1804,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1927,7 +1932,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1939,6 +1945,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1953,6 +1960,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2063,7 +2071,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2075,6 +2084,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2195,6 +2205,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2258,7 +2269,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, @@ -2637,7 +2648,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -2672,7 +2683,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -3098,6 +3109,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3107,7 +3119,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "dev": true, + "optional": true } } }, @@ -3162,7 +3175,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -3535,7 +3548,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { @@ -3560,7 +3573,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -3578,7 +3591,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -3949,7 +3962,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -4090,7 +4103,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -4444,7 +4457,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { @@ -4707,7 +4720,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -4728,9 +4741,9 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "union-value": { @@ -4928,7 +4941,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { diff --git a/source/nodejs/adaptivecards-controls/src/adaptivecards-controls.css b/source/nodejs/adaptivecards-controls/src/adaptivecards-controls.css index f12eb2ff90..933fc185bc 100644 --- a/source/nodejs/adaptivecards-controls/src/adaptivecards-controls.css +++ b/source/nodejs/adaptivecards-controls/src/adaptivecards-controls.css @@ -1,363 +1,450 @@ .ms-ctrl-overlay { - position: absolute; - left: 0; - top: 0; } + position: absolute; + left: 0; + top: 0; + z-index: 10000; +} @keyframes fadeIn { - 0% { - opacity: 0; } } + 0% { + opacity: 0; + } +} @keyframes slideTopToBottom { - 0% { - transform: translate(0, -20px); } } + 0% { + transform: translate(0, -20px); + } +} @keyframes slideBottomToTop { - 0% { - transform: translate(0, 20px); } } + 0% { + transform: translate(0, 20px); + } +} @keyframes slideLeftToRight { - 0% { - transform: translate(-20px, 0); } } + 0% { + transform: translate(-20px, 0); + } +} @keyframes slideRightToLeft { - 0% { - transform: translate(20px, 0); } } + 0% { + transform: translate(20px, 0); + } +} .ms-ctrl-slide { - animation-duration: 0.5s; - animation-timing-function: cubic-bezier(0.1, 0.9, 0.2, 1); } + animation-duration: 0.5s; + animation-timing-function: cubic-bezier(0.1, 0.9, 0.2, 1); +} .ms-ctrl-slide.ms-ctrl-slideTopToBottom { - animation-name: fadeIn,slideTopToBottom; } + animation-name: fadeIn, slideTopToBottom; +} .ms-ctrl-slide.ms-ctrl-slideBottomToTop { - animation-name: fadeIn,slideBottomToTop; } + animation-name: fadeIn, slideBottomToTop; +} .ms-ctrl-slide.ms-ctrl-slideLeftToRight { - animation-name: fadeIn,slideLeftToRight; } + animation-name: fadeIn, slideLeftToRight; +} .ms-ctrl-slide.ms-ctrl-slideRightToLeft { - animation-name: fadeIn,slideRightToLeft; } + animation-name: fadeIn, slideRightToLeft; +} @font-face { - font-family: 'FabricMDL2Icons'; - src: url("https://static2.sharepointonline.com/files/fabric/assets/icons/fabricmdl2icons.woff2?2.21") format("woff2"), url("https://static2.sharepointonline.com/files/fabric/assets/icons/fabricmdl2icons.woff?2.21") format("woff"), url("https://static2.sharepointonline.com/files/fabric/assets/icons/fabricmdl2icons.ttf?2.21") format("truetype"); - font-weight: normal; - font-style: normal; } + font-family: 'FabricMDL2Icons'; + src: url("https://static2.sharepointonline.com/files/fabric/assets/icons/fabricmdl2icons.woff2?2.21") format("woff2"), url("https://static2.sharepointonline.com/files/fabric/assets/icons/fabricmdl2icons.woff?2.21") format("woff"), url("https://static2.sharepointonline.com/files/fabric/assets/icons/fabricmdl2icons.ttf?2.21") format("truetype"); + font-weight: normal; + font-style: normal; +} .ms-icon { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-family: 'FabricMDL2Icons'; - font-style: normal; - font-weight: normal; } + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: inline-block; + font-family: 'FabricMDL2Icons'; + font-style: normal; + font-weight: normal; +} + +.ms-icon-close::before { + content: '\E8BB'; +} .ms-icon-chevronDown::before { - content: '\E70D'; } + content: '\E70D'; +} .ms-icon-chevronLeft::before { - content: "\E76B"; } + content: "\E76B"; +} .ms-icon-chevronRight::before { - content: "\E76C"; } + content: "\E76C"; +} .ms-icon-calendar::before { - content: "\E787"; } + content: "\E787"; +} .ms-icon-radioOff::before { - content: "\ECCA"; } + content: "\ECCA"; +} .ms-icon-radioOn::before { - content: "\ECCB"; } + content: "\ECCB"; +} .ms-icon-checkboxOff::before { - content: "\E739"; } + content: "\E739"; +} .ms-icon-checkboxOn::before { - content: "\E73A"; } + content: "\E73A"; +} .ms-icon-checkboxOn-reversed::before { - content: "\E73D"; } + content: "\E73D"; +} .ms-icon-checkMark::before { - content: "\E73E"; } + content: "\E73E"; +} .ms-ctrl { - box-sizing: border-box; - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - font-size: 14px; - font-weight: normal; } + box-sizing: border-box; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + font-size: 14px; + font-weight: normal; +} .ms-ctrl-dropdown { - border: 1px solid #EEEEEE; - background-color: white; - height: 32px; - display: flex; - padding-left: 12px; - padding-right: 12px; - cursor: pointer; } + border: 1px solid #EEEEEE; + background-color: white; + height: 32px; + display: flex; + padding-left: 12px; + padding-right: 12px; + cursor: pointer; +} .ms-ctrl-dropdown:hover { - border: 1px solid #0078D7; } + border: 1px solid #0078D7; +} .ms-ctrl-dropdown:focus { - border: 1px solid #0078D7; - outline: 0; } + border: 1px solid #0078D7; + outline: 0; +} .ms-dropdown-label { - line-height: 30px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - height: 100%; - width: 100%; - color: #333333; - flex: 1 1 100%; - padding-right: 12px; } + line-height: 30px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + height: 100%; + width: 100%; + color: #333333; + flex: 1 1 100%; + padding-right: 12px; +} .ms-dropdown-label.placeholder { - color: gray; } + color: gray; +} .ms-ctrl-dropdown-button { - line-height: 32px; - flex: 0 0 auto; } + line-height: 32px; + flex: 0 0 auto; +} .ms-ctrl-dropdown-button:hover { - color: #0078D7; } + color: #0078D7; +} .ms-ctrl-dropdown-item { - width: 100%; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - display: block; - padding: 0px 12px 0px 12px; - line-height: 30px; - cursor: pointer; } + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + display: block; + padding: 0px 12px 0px 12px; + line-height: 30px; + cursor: pointer; +} .ms-ctrl-dropdown-item:hover { - background-color: #EEEEEE; } + background-color: #EEEEEE; +} .ms-ctrl-dropdown-item:focus { - outline: 0; - background-color: #CCCCCC; } + outline: 0; + background-color: #CCCCCC; +} .ms-ctrl-popup-container { - border: 1px solid #EEEEEE; - background-color: white; - position: absolute; - box-shadow: 0 0 15px -5px rgba(0, 0, 0, 0.4); - overflow-y: auto; } + border: 1px solid #EEEEEE; + background-color: white; + position: absolute; + box-shadow: 0 0 15px -5px rgba(0, 0, 0, 0.4); + overflow-y: auto; +} .ms-ctrl-popup-container:focus { - outline: 0; } + outline: 0; +} .ms-ctrl-calendar { - display: inline-block; } + display: inline-block; +} .ms-ctrl-calendarHeader { - font-size: 18px; - color: gray; - padding-left: 4px; - line-height: 34px; } + font-size: 18px; + color: gray; + padding-left: 4px; + line-height: 34px; +} .ms-ctrl-calendarNavButton { - text-align: center; - line-height: 34px; - width: 30px; - cursor: pointer; } + text-align: center; + line-height: 34px; + width: 30px; + cursor: pointer; +} .ms-ctrl-calendarNavButton:hover { - background-color: #EEEEEE; } + background-color: #EEEEEE; +} .ms-ctrl-calendarDayHeader { - font-size: 12px; - text-align: center; - padding: 6px 8px 6px 8px; - color: #333333; } + font-size: 12px; + text-align: center; + padding: 6px 8px 6px 8px; + color: #333333; +} .ms-ctrl-calendarDay { - font-size: 12px; - text-align: center; - padding: 6px 8px 6px 8px; - color: #333333; - cursor: pointer; } + font-size: 12px; + text-align: center; + padding: 6px 8px 6px 8px; + color: #333333; + cursor: pointer; +} .ms-ctrl-calendarDay:hover { - background-color: #EEEEEE; } + background-color: #EEEEEE; +} .ms-ctrl-calendarDay.subdued { - color: gray; } + color: gray; +} .ms-ctrl-calendarDay.selected { - color: white; - background-color: #0078D7; } + color: white; + background-color: #0078D7; +} .ms-calendarPopup { - padding: 6px; - overflow: hidden; } + padding: 6px; + overflow: hidden; +} .ms-ctrl-datePicker { - border: 1px solid #EEEEEE; - height: 32px; - display: flex; - padding-left: 12px; - padding-right: 12px; - cursor: pointer; } + border: 1px solid #EEEEEE; + height: 32px; + display: flex; + padding-left: 12px; + padding-right: 12px; + cursor: pointer; +} .ms-ctrl-datePicker:hover { - border: 1px solid #0078D7; } + border: 1px solid #0078D7; +} .ms-ctrl-datePicker:focus { - border: 1px solid #0078D7; - outline: 0; } + border: 1px solid #0078D7; + outline: 0; +} .ms-ctrl-checkbox { - outline: 0; - cursor: pointer; } + outline: 0; + cursor: pointer; +} .ms-ctrl-checkbox input[type=checkbox] { - visibility: hidden; } + visibility: hidden; +} .ms-ctrl-checkbox label { - display: inline-block; - box-sizing: border-box; - position: relative; } + display: inline-block; + box-sizing: border-box; + position: relative; +} .ms-ctrl-checkbox label span { - margin-left: 24px; - line-height: 18px; - color: #333333; - display: inline-block; } + margin-left: 24px; + line-height: 18px; + color: #333333; + display: inline-block; +} .ms-ctrl-checkbox label span:hover { - color: black; } + color: black; +} .ms-ctrl-checkbox label::before { - box-sizing: border-box; - display: inline-block; - position: absolute; - border: 1px solid #A6A6A6; - content: ""; - width: 18px; - height: 18px; - transition-property: background,border,border-color; - transition-duration: .2s; - transition-timing-function: cubic-bezier(0.4, 0, 0.23, 1); } + box-sizing: border-box; + display: inline-block; + position: absolute; + border: 1px solid #A6A6A6; + content: ""; + width: 18px; + height: 18px; + transition-property: background, border, border-color; + transition-duration: .2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.23, 1); +} .ms-ctrl-checkbox label:hover::before { - border: 1px solid #767676; } - -.ms-ctrl-checkbox input[type=checkbox]:checked + label::before { - content: ""; - border: 1px solid #0078D7; - background-color: #0078D7; } - -.ms-ctrl-checkbox input[type=checkbox]:checked + label::after { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - font-family: 'FabricMDL2Icons'; - font-style: normal; - font-weight: bold; - content: "\E73E"; - color: white; - position: absolute; - width: 18px; - line-height: 18px; - left: 0; - top: 0; - text-align: center; - transition-property: background,border,border-color; - transition-duration: .2s; - transition-timing-function: cubic-bezier(0.4, 0, 0.23, 1); } + border: 1px solid #767676; +} + +.ms-ctrl-checkbox input[type=checkbox]:checked+label::before { + content: ""; + border: 1px solid #0078D7; + background-color: #0078D7; +} + +.ms-ctrl-checkbox input[type=checkbox]:checked+label::after { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: 'FabricMDL2Icons'; + font-style: normal; + font-weight: bold; + content: "\E73E"; + color: white; + position: absolute; + width: 18px; + line-height: 18px; + left: 0; + top: 0; + text-align: center; + transition-property: background, border, border-color; + transition-duration: .2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.23, 1); +} .ms-ctrl-radiobutton { - outline: 0; - cursor: pointer; } + outline: 0; + cursor: pointer; +} .ms-ctrl-radiobutton input[type=radio] { - visibility: hidden; } + visibility: hidden; +} .ms-ctrl-radiobutton label { - display: inline-block; - box-sizing: border-box; - position: relative; } + display: inline-block; + box-sizing: border-box; + position: relative; +} .ms-ctrl-radiobutton label span { - margin-left: 22px; - line-height: 16px; - color: #333333; - display: inline-block; - vertical-align: top; } + margin-left: 22px; + line-height: 16px; + color: #333333; + display: inline-block; + vertical-align: top; +} .ms-ctrl-radiobutton label span:hover { - color: black; } + color: black; +} .ms-ctrl-radiobutton label::before { - content: ""; - box-sizing: border-box; - display: inline-block; - position: absolute; - border: 1px solid #A6A6A6; - width: 16px; - height: 16px; - border-radius: 50%; } + content: ""; + box-sizing: border-box; + display: inline-block; + position: absolute; + border: 1px solid #A6A6A6; + width: 16px; + height: 16px; + border-radius: 50%; +} .ms-ctrl-radiobutton label:hover::before { - border: 1px solid #767676; } - -.ms-ctrl-radiobutton input[type=radio]:checked + label::before { - border: 1px solid #0078D7; } - -.ms-ctrl-radiobutton input[type=radio] + label::after { - content: ""; - box-sizing: border-box; - display: inline-block; - position: absolute; - top: 8px; - left: 8px; - width: 0; - height: 0; } - -.ms-ctrl-radiobutton input[type=radio]:checked + label::after { - top: 4px; - left: 4px; - width: 8px; - height: 8px; - background-color: #0078D7; - border-radius: 50%; - transition-property: top,left,right,width,height; - transition-duration: 150ms; - transition-timing-function: cubic-bezier(0.4, 0, 0.23, 1); } + border: 1px solid #767676; +} + +.ms-ctrl-radiobutton input[type=radio]:checked+label::before { + border: 1px solid #0078D7; +} + +.ms-ctrl-radiobutton input[type=radio]+label::after { + content: ""; + box-sizing: border-box; + display: inline-block; + position: absolute; + top: 8px; + left: 8px; + width: 0; + height: 0; +} + +.ms-ctrl-radiobutton input[type=radio]:checked+label::after { + top: 4px; + left: 4px; + width: 8px; + height: 8px; + background-color: #0078D7; + border-radius: 50%; + transition-property: top, left, right, width, height; + transition-duration: 150ms; + transition-timing-function: cubic-bezier(0.4, 0, 0.23, 1); +} .ms-ctrl-textbox { - border: 1px solid #EEEEEE; - color: #333333; - outline: 0; - resize: none; - padding: 4px 8px; } + border: 1px solid #EEEEEE; + color: #333333; + outline: 0; + resize: none; + padding: 4px 8px; +} .ms-ctrl-textbox-multiline { - overflow: auto; } + overflow: auto; +} .ms-ctrl-textbox:-moz-placeholder { - color: gray; } + color: gray; +} .ms-ctrl-textbox::-moz-placeholder { - color: gray; } + color: gray; +} .ms-ctrl-textbox:-ms-input-placeholder { - color: gray; } + color: gray; +} .ms-ctrl-textbox::-ms-input-placeholder { - color: gray; } + color: gray; +} .ms-ctrl-textbox::-webkit-input-placeholder { - color: gray; } + color: gray; +} .ms-ctrl-textbox:hover { - border: 1px solid #0078D7; } + border: 1px solid #0078D7; +} .ms-ctrl-textbox:focus, .ms-ctrl-textbox:active { - border: 1px solid #0078D7; } + border: 1px solid #0078D7; +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-controls/src/popupmenu.ts b/source/nodejs/adaptivecards-controls/src/popupmenu.ts index eb5a5cb839..71ffab2c95 100644 --- a/source/nodejs/adaptivecards-controls/src/popupmenu.ts +++ b/source/nodejs/adaptivecards-controls/src/popupmenu.ts @@ -100,7 +100,6 @@ export class PopupMenu extends PopupControl { this._overlayElement = document.createElement("div"); this._overlayElement.className = "ms-ctrl-overlay"; this._overlayElement.tabIndex = 0; - this._overlayElement.style.zIndex = "1000"; this._overlayElement.style.width = document.documentElement.scrollWidth + "px"; this._overlayElement.style.height = document.documentElement.scrollHeight + "px"; this._overlayElement.onfocus = (e) => { this.closePopup(); }; diff --git a/source/nodejs/adaptivecards-designer-app/package-lock.json b/source/nodejs/adaptivecards-designer-app/package-lock.json index 914212a566..cc5f3c07e7 100644 --- a/source/nodejs/adaptivecards-designer-app/package-lock.json +++ b/source/nodejs/adaptivecards-designer-app/package-lock.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-designer-app", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -254,25 +254,10 @@ } }, "adaptivecards": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.0.tgz", - "integrity": "sha512-rfB3dr2/yNMgJHiGCFH247RtLXkKcNwhGbI1GrXSITfyqfo12esTWDLkRLe62b0oGZxPKJZo5187BY9xORZYsg==" - }, - "adaptivecards-controls": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/adaptivecards-controls/-/adaptivecards-controls-0.2.0.tgz", - "integrity": "sha512-LfmE76Chi6hfNnxp7olyEF25t2Jmbm7b9pqVa+RXrTR48Klj4KHGrMrXsVQKhEznAVordYiwLliBMDlbsiJ7Fw==" - }, - "adaptivecards-designer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/adaptivecards-designer/-/adaptivecards-designer-0.6.0.tgz", - "integrity": "sha512-PC/bnwnjT9YxUZAvUlGI0x4t9ytgED+mpJZRhK4TpjkzCZu7MvxDRgRu9tkZK0qsNRafMFQAK9vvbLt2RP9lNA==", - "requires": { - "adaptivecards": "^1.2.0", - "adaptivecards-controls": "^0.2.0", - "clipboard": "^2.0.1", - "monaco-editor": "^0.15.6" - } + "version": "1.3.0-alpha1", + "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.3.0-alpha1.tgz", + "integrity": "sha512-V6dOox+Kzpu0NUb14FErW5JGBDLtxL3JimdA9D2scIP5O2g9t5eO/auD2RTFaag2pzBLGKBKbe06koeh1ml9RA==", + "dev": true }, "ajv": { "version": "6.6.2", @@ -345,6 +330,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -439,7 +425,7 @@ }, "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -866,16 +852,6 @@ } } }, - "clipboard": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -1001,7 +977,7 @@ }, "content-disposition": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "resolved": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", "dev": true }, @@ -1222,11 +1198,6 @@ "rimraf": "^2.2.8" } }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1365,7 +1336,8 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true }, "errno": { "version": "0.1.7", @@ -1540,7 +1512,7 @@ "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true } @@ -1684,7 +1656,7 @@ }, "finalhandler": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { @@ -1832,7 +1804,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1853,12 +1826,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1871,17 +1846,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1996,7 +1974,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2008,6 +1987,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2022,6 +2002,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2132,7 +2113,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2144,6 +2126,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2264,6 +2247,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2283,6 +2267,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2311,7 +2296,8 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", @@ -2399,14 +2385,6 @@ } } }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "requires": { - "delegate": "^3.1.2" - } - }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", @@ -2897,6 +2875,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "dev": true, "requires": { "uc.micro": "^1.0.1" } @@ -2993,6 +2972,7 @@ "version": "8.4.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.1.tgz", "integrity": "sha512-CzzqSSNkFRUf9vlWvhK1awpJreMRqdCrBvZ8DIoDWTOkESMIF741UPAhuAmbyWmdiFPA6WARNhnu2M6Nrhwa+A==", + "dev": true, "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", @@ -3015,7 +2995,8 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true }, "media-typer": { "version": "0.3.0", @@ -3146,6 +3127,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3155,7 +3137,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "dev": true, + "optional": true } } }, @@ -3220,7 +3203,8 @@ "monaco-editor": { "version": "0.15.6", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.15.6.tgz", - "integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg==" + "integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg==", + "dev": true }, "monaco-editor-webpack-plugin": { "version": "1.7.0", @@ -4004,11 +3988,6 @@ "ajv-keywords": "^3.1.0" } }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" - }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -4444,7 +4423,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "6.0.1", @@ -4660,11 +4640,6 @@ "setimmediate": "^1.0.4" } }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -4742,15 +4717,16 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "uc.micro": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", + "dev": true }, "union-value": { "version": "1.0.0", diff --git a/source/nodejs/adaptivecards-designer-app/package.json b/source/nodejs/adaptivecards-designer-app/package.json index af969bc9d0..30c96ddd6f 100644 --- a/source/nodejs/adaptivecards-designer-app/package.json +++ b/source/nodejs/adaptivecards-designer-app/package.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-designer-app", - "version": "0.2.0", + "version": "0.2.1", "description": "Adaptive Card designer app", "author": "AdaptiveCards", "license": "MIT", @@ -11,17 +11,20 @@ "start": "webpack-dev-server --open", "release": "npm run build" }, - "dependencies": { - "adaptivecards-designer": "^0.6.0", - "markdown-it": "^8.4.0", - "monaco-editor": "^0.15.6" - }, "devDependencies": { + "adaptivecards": "^1.3.0-alpha1", + "adaptivecards-controls": "^0.3.0", + "adaptivecards-designer": "^0.7.0", + "markdown-it": "^8.4.0", + "monaco-editor": "^0.15.6", "monaco-editor-webpack-plugin": "^1.7.0", "rimraf": "^2.6.2", "typescript": "^3.2.2", "webpack": "^4.27.1", "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.14" + }, + "dependencies": { + "adaptivecards-templating": "^0.1.0-alpha.0" } } diff --git a/source/nodejs/adaptivecards-designer-app/sample-catalogue.json b/source/nodejs/adaptivecards-designer-app/sample-catalogue.json new file mode 100644 index 0000000000..6730be078b --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/sample-catalogue.json @@ -0,0 +1,21 @@ +[ + { + "displayName": "Social update", + "cardPayloadUrl": "samples/Default.json" + }, + { + "displayName": "Flight update", + "cardPayloadUrl": "samples/FlightUpdate.json", + "dataSampleUrl": "samples/FlightUpdate.data.json" + }, + { + "displayName": "Restaurant", + "cardPayloadUrl": "samples/Restaurant.json", + "dataSampleUrl": "samples/Restaurant.data.json" + }, + { + "displayName": "Stock update", + "cardPayloadUrl": "samples/StockUpdate.json", + "dataSampleUrl": "samples/StockUpdate.data.json" + } +] diff --git a/source/nodejs/adaptivecards-designer-app/samples/Default.json b/source/nodejs/adaptivecards-designer-app/samples/Default.json new file mode 100644 index 0000000000..a865e2b5e7 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/Default.json @@ -0,0 +1,109 @@ +{ + "type": "AdaptiveCard", + "body": [ + { + "type": "TextBlock", + "size": "medium", + "weight": "bolder", + "text": "Publish Adaptive Card schema" + }, + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "Image", + "style": "Person", + "url": "https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg", + "size": "Small" + } + ], + "width": "auto" + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "weight": "Bolder", + "text": "Matt Hidinger", + "wrap": true + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Created {{DATE(2017-02-14T06:08:39Z,SHORT)}}", + "isSubtle": true, + "wrap": true + } + ], + "width": "stretch" + } + ] + }, + { + "type": "TextBlock", + "text": "Now that we have defined the main rules and features of the format, we need to produce a schema and publish it to GitHub. The schema will be the starting point of our reference documentation.", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Board:", + "value": "Adaptive Card" + }, + { + "title": "List:", + "value": "Backlog" + }, + { + "title": "Assigned to:", + "value": "Matt Hidinger" + }, + { + "title": "Due date:", + "value": "Not set" + } + ] + } + ], + "actions": [ + { + "type": "Action.ShowCard", + "title": "Set due date", + "card": { + "type": "AdaptiveCard", + "body": [ + { + "type": "Input.Date", + "id": "dueDate" + }, + { + "type": "Input.Text", + "id": "comment", + "placeholder": "Add a comment", + "isMultiline": true + } + ], + "actions": [ + { + "type": "Action.OpenUrl", + "title": "OK", + "url": "http://adaptivecards.io" + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json" + } + }, + { + "type": "Action.OpenUrl", + "title": "View", + "url": "http://adaptivecards.io" + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0" +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/samples/FlightUpdate.data.json b/source/nodejs/adaptivecards-designer-app/samples/FlightUpdate.data.json new file mode 100644 index 0000000000..bcfb259e6d --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/FlightUpdate.data.json @@ -0,0 +1,40 @@ +{ + "@context": "http://schema.org", + "@type": "FlightReservation", + "reservationId": "RXJ34P", + "reservationStatus": "http://schema.org/ReservationConfirmed", + "passengerPriorityStatus": "Fast Track", + "passengerSequenceNumber": "ABC123", + "securityScreening": "TSA PreCheck", + "underName": { + "@type": "Person", + "name": "Eva Green" + }, + "reservationFor": { + "@type": "Flight", + "flightNumber": "UA110", + "provider": { + "@type": "Airline", + "name": "Continental", + "iataCode": "CO", + "boardingPolicy": "http://schema.org/ZoneBoardingPolicy" + }, + "seller": { + "@type": "Airline", + "name": "United", + "iataCode": "UA" + }, + "departureAirport": { + "@type": "Airport", + "name": "San Francisco Airport", + "iataCode": "SFO" + }, + "departureTime": "2017-03-04T20:15:00-08:00", + "arrivalAirport": { + "@type": "Airport", + "name": "John F. Kennedy International Airport", + "iataCode": "JFK" + }, + "arrivalTime": "2017-03-05T06:30:00-05:00" + } + } \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/samples/FlightUpdate.json b/source/nodejs/adaptivecards-designer-app/samples/FlightUpdate.json new file mode 100644 index 0000000000..6cb0ecbfb5 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/FlightUpdate.json @@ -0,0 +1,235 @@ +{ + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "type": "AdaptiveCard", + "version": "1.0", + "speak": "Flight KL0605 to San Fransisco has been delayed.It will not leave until 10:10 AM.", + "body": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "width": "auto", + "items": [ + { + "type": "Image", + "size": "small", + "url": "http://adaptivecards.io/content/airplane.png" + } + ] + }, + { + "type": "Column", + "width": "stretch", + "items": [ + { + "type": "TextBlock", + "text": "Flight Status", + "horizontalAlignment": "right", + "isSubtle": true + }, + { + "type": "TextBlock", + "text": "DELAYED", + "horizontalAlignment": "right", + "spacing": "none", + "size": "large", + "color": "attention" + } + ] + } + ] + }, + { + "type": "ColumnSet", + "separator": true, + "spacing": "medium", + "columns": [ + { + "type": "Column", + "width": "stretch", + "items": [ + { + "type": "TextBlock", + "text": "Passengers", + "isSubtle": true, + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "Sarah Hum", + "spacing": "small" + }, + { + "type": "TextBlock", + "text": "Jeremy Goldberg", + "spacing": "small" + }, + { + "type": "TextBlock", + "text": "Evan Litvak", + "spacing": "small" + } + ] + }, + { + "type": "Column", + "width": "auto", + "items": [ + { + "type": "TextBlock", + "text": "Seat", + "horizontalAlignment": "right", + "isSubtle": true, + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "14A", + "horizontalAlignment": "right", + "spacing": "small" + }, + { + "type": "TextBlock", + "text": "14B", + "horizontalAlignment": "right", + "spacing": "small" + }, + { + "type": "TextBlock", + "text": "14C", + "horizontalAlignment": "right", + "spacing": "small" + } + ] + } + ] + }, + { + "type": "ColumnSet", + "spacing": "medium", + "separator": true, + "columns": [ + { + "type": "Column", + "width": 1, + "items": [ + { + "type": "TextBlock", + "text": "Flight", + "isSubtle": true, + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "KL0605", + "spacing": "small" + } + ] + }, + { + "type": "Column", + "width": 1, + "items": [ + { + "type": "TextBlock", + "text": "Departs", + "isSubtle": true, + "horizontalAlignment": "center", + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "10:10 AM", + "color": "attention", + "weight": "bolder", + "horizontalAlignment": "center", + "spacing": "small" + } + ] + }, + { + "type": "Column", + "width": 1, + "items": [ + { + "type": "TextBlock", + "text": "Arrives", + "isSubtle": true, + "horizontalAlignment": "right", + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "12:00 AM", + "color": "attention", + "horizontalAlignment": "right", + "weight": "bolder", + "spacing": "small" + } + ] + } + ] + }, + { + "type": "ColumnSet", + "spacing": "medium", + "separator": true, + "columns": [ + { + "type": "Column", + "width": 1, + "items": [ + { + "type": "TextBlock", + "text": "Amsterdam", + "isSubtle": true + }, + { + "type": "TextBlock", + "text": "AMS", + "size": "extraLarge", + "color": "accent", + "spacing": "none" + } + ] + }, + { + "type": "Column", + "width": "auto", + "items": [ + { + "type": "TextBlock", + "text": " " + }, + { + "type": "Image", + "url": "http://adaptivecards.io/content/airplane.png", + "size": "small" + } + ] + }, + { + "type": "Column", + "width": 1, + "items": [ + { + "type": "TextBlock", + "text": "San Francisco", + "isSubtle": true, + "horizontalAlignment": "right" + }, + { + "type": "TextBlock", + "text": "SFO", + "horizontalAlignment": "right", + "size": "extraLarge", + "color": "accent", + "spacing": "none" + } + ] + } + ] + } + ] + } \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/samples/Restaurant.data.json b/source/nodejs/adaptivecards-designer-app/samples/Restaurant.data.json new file mode 100644 index 0000000000..078140dcc0 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/Restaurant.data.json @@ -0,0 +1,29 @@ +{ + "@context": "http://schema.org/", + "@type": "LocalBusiness", + "name": "Malt \u0026 Vine", + "url": "https://www.yelp.com/biz/malt-and-vine-redmond", + "address": { + "addressLocality": "Redmond", + "addressRegion": "WA", + "streetAddress": "16851 Redmond Way", + "postalCode": "98052", + "addressCountry": "US" + }, + "image": "https://s3-media1.fl.yelpcdn.com/bphoto/HD_NsxwaCTwKRxvOZs2Shw/ls.jpg", + "telephone": "+14258816461", + "aggregateRating": { + "reviewCount": 176, + "@type": "AggregateRating", + "ratingValue": 4.5 + }, + "review": [{ + "reviewRating": { + "ratingValue": 4 + }, + "datePublished": "2014-11-28", + "description": "Great concept and a wide selection of beers both on tap and bottled! Smaller wine selection than I wanted, but the variety of beers certainly made up for that. Although I didn't order anything, my boyfriend got a beer and he loved it. Their prices are fair too. \n\nThe concept is really awesome. It's a bar/store that you can bring outside food into. The place was pretty packed tonight. I wish we had stayed for more than one drink. I would have loved to sample everything!", + "author": "Blaire S." + }], + "priceRange": "$$" +} diff --git a/source/nodejs/adaptivecards-designer-app/samples/Restaurant.json b/source/nodejs/adaptivecards-designer-app/samples/Restaurant.json new file mode 100644 index 0000000000..5873465510 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/Restaurant.json @@ -0,0 +1,61 @@ +{ + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "speak": "Tom's Pie is a Pizza restaurant which is rated 9.3 by customers.", + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "width": 2, + "items": [ + { + "type": "TextBlock", + "text": "{address.addressLocality}, {address.addressRegion}" + }, + { + "type": "TextBlock", + "text": "{name}", + "weight": "Bolder", + "size": "ExtraLarge", + "spacing": "None" + }, + { + "type": "TextBlock", + "text": "{aggregateRating.ratingValue} ★★★☆ ({aggregateRating.reviewCount}) · {priceRange}", + "isSubtle": true, + "spacing": "None" + }, + { + "type": "TextBlock", + "text": "**{review[0].author}** said \"{review[0].description}\"", + "size": "Small", + "wrap": true, + "maxLines": 3 + } + ] + }, + { + "type": "Column", + "width": 1, + "items": [ + { + "type": "Image", + "url": "{image}", + "size": "auto" + } + ] + } + ] + } + ], + "actions": [ + { + "type": "Action.OpenUrl", + "title": "More Info", + "url": "{url}" + } + ] +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/samples/StockUpdate.data.json b/source/nodejs/adaptivecards-designer-app/samples/StockUpdate.data.json new file mode 100644 index 0000000000..91d26b2341 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/StockUpdate.data.json @@ -0,0 +1,26 @@ +{ + "symbol": "MSFT", + "exchange": "NASDAQ", + "company": "Microsoft Corp", + "date": "2019-02-12T18:34:00Z", + "price": "106.70", + "arrow": "up", + "change": "1.45", + "difference": "1.37", + "changeFormatted": "▲ USD 1.45 (1.37%) ", + "changeColor": "attention", + "stages": [ + { + "title": "Open", + "value": "106.14" + }, + { + "title": "High", + "value": "107.14" + }, + { + "title": "Low", + "value": "105.48" + } + ] +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/samples/StockUpdate.json b/source/nodejs/adaptivecards-designer-app/samples/StockUpdate.json new file mode 100644 index 0000000000..458c7b9c30 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/StockUpdate.json @@ -0,0 +1,62 @@ +{ + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "type": "AdaptiveCard", + "version": "1.0", + "speak": "{company} stock is trading at {price} a share, which is {arrow} {difference}", + "body": [ + { + "type": "Container", + "items": [ + { + "type": "TextBlock", + "text": "{company} ({exchange}: {symbol})", + "size": "medium", + "isSubtle": true + }, + { + "type": "TextBlock", + "text": "{{DATE({date}, LONG)}} {{TIME({date})}}", + "isSubtle": true + } + ] + }, + { + "type": "Container", + "spacing": "None", + "items": [ + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "width": "stretch", + "items": [ + { + "type": "TextBlock", + "text": "{price}", + "size": "ExtraLarge" + }, + { + "type": "TextBlock", + "text": "{changeFormatted}", + "color": "{changeColor}", + "spacing": "None" + } + ] + }, + { + "type": "Column", + "width": "auto", + "items": [ + { + "type": "FactSet", + "facts": "{stages}" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/samples/Symphony.bond.json b/source/nodejs/adaptivecards-designer-app/samples/Symphony.bond.json new file mode 100644 index 0000000000..53190caab3 --- /dev/null +++ b/source/nodejs/adaptivecards-designer-app/samples/Symphony.bond.json @@ -0,0 +1,56 @@ +{ + "type": "org.symphonyoss.fin.rfq.request.bond", + "version": "0.1", + "id": [ + { + "type": "com.factset.portware.ticket.id", + "value": "123456789" + } + ], + "side": "BUY", + "info": { + "description": "IBM 1.25 02/08/2018", + "assetType": "Corporate Bond/Note", + "accruedInterest": 0, + "coupon": 1.25, + "maturityDate": "2018-08-02", + "currency": "USD", + "issuer": [ + { + "type": "com.factset.symbology.id", + "value": "ibm-us" + } + ], + "ratings": [ + { + "type": "org.symphonyoss.fin.rating.agent.sandp", + "value": "AA-" + }, + { + "type": "org.symphonyoss.fin.rating.agent.moody", + "value": "Aa3" + }, + { + "type": "org.symphonyoss.fin.rating.agent.fitch", + "value": "A+" + } + ] + }, + "tradeDate": "2017-11-12", + "settlementDate": "2017-11-14", + "faceValue": 1000000, + "instrument":[ + { + "type": "org.symphonyoss.fin.security.id.isin", + "value": "US459200HK05" + }, + { + "type": "org.symphonyoss.fin.security.id.cusip", + "value": "459200HK0" + }, + { + "type": "org.symphonyoss.fin.security.id.sedol", + "value": "B90NK89" + } + ] +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer-app/src/app.ts b/source/nodejs/adaptivecards-designer-app/src/app.ts index 26d370c489..020327736b 100644 --- a/source/nodejs/adaptivecards-designer-app/src/app.ts +++ b/source/nodejs/adaptivecards-designer-app/src/app.ts @@ -6,10 +6,13 @@ import * as ACDesigner from "adaptivecards-designer"; import "adaptivecards-designer/dist/adaptivecards-designer.css"; import "./app.css"; -// UNCOMMENT below if you plan to use an empty hostContainers array -//import "adaptivecards-designer/dist/adaptivecards-defaulthost.css"; +// Uncomment below if you plan to use an empty hostContainers array +// import "adaptivecards-designer/dist/adaptivecards-defaulthost.css"; + +window.onload = function() { + // Uncomment to enabled preview features such as data binding + // ACDesigner.GlobalSettings.previewFeaturesEnabled = true; -window.onload = function () { ACDesigner.CardDesigner.onProcessMarkdown = (text: string, result: { didProcess: boolean, outputHtml: string }) => { result.outputHtml = new markdownit().render(text); result.didProcess = true; @@ -29,7 +32,76 @@ window.onload = function () { hostContainers.push(new ACDesigner.BotFrameworkContainer("Bot Framework Other Channels (Image render)", "containers/bf-image-container.css")); hostContainers.push(new ACDesigner.ToastContainer("Windows Notifications (Preview)", "containers/toast-container.css")); - let designer = new ACDesigner.CardDesigner(hostContainers); - designer.attachTo(document.getElementById("designerRootHost")); + let designer = new ACDesigner.CardDesigner(hostContainers); + designer.sampleCatalogueUrl = window.location.origin + "/sample-catalogue.json"; + designer.attachTo(document.getElementById("designerRootHost")); + + /* Uncomment to test a custom palette item example + let exampleSnippet = new ACDesigner.SnippetPaletteItem("Custom", "Example"); + exampleSnippet.snippet = { + type: "ColumnSet", + columns: [ + { + width: "auto", + items: [ + { + type: "Image", + size: "Small", + style: "Person", + url: "https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg" + } + ] + }, + { + width: "stretch", + items: [ + { + type: "TextBlock", + text: "John Doe", + weight: "Bolder", + wrap: true + }, + { + type: "TextBlock", + spacing: "None", + text: "Additional information", + wrap: true + } + ] + } + ] + }; + + designer.customPaletteItems = [ exampleSnippet ]; + */ + designer.monacoModuleLoaded(monaco); -}; + + let sampleData = { + firstName: "John", + lastName: "Doe", + age: 45, + isMarried: true, + address: { + street: "1234 555th Ave NE", + city: "Redmond", + state: "WA", + countryOrRegion: "USA" + }, + children: [ + { + firstName: "Jennifer", + lastName: "Doe", + age: 9 + }, + { + firstName: "James", + lastName: "Doe", + age: 13 + } + ] + }; + + designer.dataStructure = ACDesigner.FieldDefinition.create(sampleData); + designer.sampleData = sampleData; +} diff --git a/source/nodejs/adaptivecards-designer/index.html b/source/nodejs/adaptivecards-designer/index.html index 68ac3d78ec..8729f550de 100644 --- a/source/nodejs/adaptivecards-designer/index.html +++ b/source/nodejs/adaptivecards-designer/index.html @@ -18,7 +18,9 @@ + + + + + + + + +
+
+
+ + + \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/package-lock.json b/source/nodejs/adaptivecards-designer/package-lock.json index a19acd3836..2103589fb9 100644 --- a/source/nodejs/adaptivecards-designer/package-lock.json +++ b/source/nodejs/adaptivecards-designer/package-lock.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-designer", - "version": "0.6.0", + "version": "0.7.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -265,12 +265,6 @@ "integrity": "sha512-rfB3dr2/yNMgJHiGCFH247RtLXkKcNwhGbI1GrXSITfyqfo12esTWDLkRLe62b0oGZxPKJZo5187BY9xORZYsg==", "dev": true }, - "adaptivecards-controls": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/adaptivecards-controls/-/adaptivecards-controls-0.3.0.tgz", - "integrity": "sha512-mVN97FSF1sOgNOw7hGtAStfM+y/d1IcFGd1DbYFhIM/T3c2XEyErFvWbmhN6wRegZvGapr/YjKFawmlLZ5aV9w==", - "dev": true - }, "ajv": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", @@ -452,7 +446,7 @@ }, "async": { "version": "1.5.2", - "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -652,7 +646,7 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -689,7 +683,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -723,7 +717,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -833,9 +827,9 @@ "dev": true }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "camelcase-keys": { @@ -847,14 +841,6 @@ "camelcase": "^4.1.0", "map-obj": "^2.0.0", "quick-lru": "^1.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 - } } }, "chalk": { @@ -1172,16 +1158,6 @@ "safe-buffer": "^5.0.1" }, "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -1200,51 +1176,6 @@ "cp-file": "^6.1.0", "globby": "^9.2.0", "nested-error-stacks": "^2.1.0" - }, - "dependencies": { - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } } }, "cpy-cli": { @@ -1269,7 +1200,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1282,7 +1213,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1458,6 +1389,27 @@ "rimraf": "^2.6.3" }, "dependencies": { + "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.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", @@ -1517,7 +1469,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -1829,7 +1781,7 @@ "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true } @@ -2012,12 +1964,12 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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": "^3.0.0" + "locate-path": "^2.0.0" } }, "findup-sync": { @@ -2143,7 +2095,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2164,12 +2117,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2184,17 +2139,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2311,7 +2269,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2323,6 +2282,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2337,6 +2297,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2344,12 +2305,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -2368,6 +2331,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2448,7 +2412,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2460,6 +2425,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2545,7 +2511,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2581,6 +2548,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2600,6 +2568,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2643,12 +2612,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -2750,22 +2721,46 @@ } }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" }, "dependencies": { + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true } } @@ -2780,9 +2775,9 @@ } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", "dev": true }, "handle-thing": { @@ -3060,7 +3055,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -3101,7 +3096,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -3338,12 +3333,12 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -3485,23 +3480,6 @@ "redent": "^2.0.0", "trim-newlines": "^2.0.0", "yargs-parser": "^10.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 - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } } }, "merge-descriptors": { @@ -3658,7 +3636,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -3982,21 +3960,21 @@ "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -4015,9 +3993,9 @@ } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "pako": { @@ -4099,7 +4077,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -4177,6 +4155,51 @@ "dev": true, "requires": { "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } } }, "portfinder": { @@ -4377,56 +4400,11 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "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-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } } }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -4607,7 +4585,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -4652,9 +4630,9 @@ } }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "send": { @@ -4782,7 +4760,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -5224,7 +5202,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -5248,7 +5226,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -5274,9 +5252,9 @@ "dev": true }, "terser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.1.tgz", - "integrity": "sha512-27+kdMOAwb9HMtSfSL1wYDwbh+zKTSFrnT76g5M0LS14XFBEqBWvFuBCLXr0Ceoxp+nlBjCBF6GAma/aoj7COA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.2.tgz", + "integrity": "sha512-IWLuJqTvx97KP3uTYkFVn93cXO+EtlzJu8TdJylq+H0VBDlPMIfQA9MBS5Vc5t3xTEUG1q0hIfHMpAP2R+gWTw==", "dev": true, "requires": { "commander": "^2.19.0", @@ -5428,7 +5406,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -5449,9 +5427,9 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "uglify-es": { @@ -5708,9 +5686,9 @@ } }, "webpack": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.0.tgz", - "integrity": "sha512-M5hL3qpVvtr8d4YaJANbAQBc4uT01G33eDpl/psRTBCfjxFTihdhin1NtAKB1ruDwzeVdcsHHV3NX+QsAgOosw==", + "version": "4.35.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.35.2.tgz", + "integrity": "sha512-TZAmorNymV4q66gAM/h90cEjG+N3627Q2MnkSgKlX/z3DlNVKUtqy57lz1WmZU2+FUZwzM+qm7cGaO95PyrX5A==", "dev": true, "requires": { "@webassemblyjs/ast": "1.8.5", @@ -5866,6 +5844,12 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", @@ -5903,18 +5887,61 @@ "ms": "^2.1.1" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -5933,9 +5960,9 @@ } }, "semver": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.2.tgz", - "integrity": "sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", + "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", "dev": true }, "string-width": { @@ -5967,7 +5994,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -6159,16 +6186,76 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^4.1.0" } } } diff --git a/source/nodejs/adaptivecards-designer/package.json b/source/nodejs/adaptivecards-designer/package.json index c2d1ee2b55..a9375a64f8 100644 --- a/source/nodejs/adaptivecards-designer/package.json +++ b/source/nodejs/adaptivecards-designer/package.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-designer", - "version": "0.6.0", + "version": "0.7.0", "description": "Adaptive Card designer embeddable control", "author": "AdaptiveCards", "license": "MIT", @@ -18,6 +18,8 @@ "build": "webpack", "watch": "webpack --watch", "start": "webpack-dev-server --open", + "start:preview": "webpack-dev-server --open-page previewFeatures.html", + "start:nohosts": "webpack-dev-server --open-page noHosts.html", "dts": "dts-generator --name adaptivecards-designer --project . --out dist/adaptivecards-designer.d.ts", "lint": "tslint -c tslint.json 'src/**/*.{ts,tsx}'", "release": "npm run build && webpack --mode=production && npm run dts" @@ -26,8 +28,9 @@ "monaco-editor": "^0.15.6" }, "devDependencies": { - "adaptivecards": "^1.2.0", - "adaptivecards-controls": "^0.3.0", + "adaptivecards": "^1.3.0-alpha1", + "adaptivecards-controls": "^0.3.0", + "adaptivecards-templating": "0.1.0-alpha.0", "clipboard": "^2.0.1", "cpy-cli": "^2.0.0", "monaco-editor": "^0.17.1", diff --git a/source/nodejs/adaptivecards-designer/previewFeatures.html b/source/nodejs/adaptivecards-designer/previewFeatures.html new file mode 100644 index 0000000000..8014373da6 --- /dev/null +++ b/source/nodejs/adaptivecards-designer/previewFeatures.html @@ -0,0 +1,61 @@ + + + + + Adaptive Cards Designer + + + + + + + + + +
+
+
+ + + \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/adaptivecards-designer-standalone.ts b/source/nodejs/adaptivecards-designer/src/adaptivecards-designer-standalone.ts index 1b494b06ff..35d5c90902 100644 --- a/source/nodejs/adaptivecards-designer/src/adaptivecards-designer-standalone.ts +++ b/source/nodejs/adaptivecards-designer/src/adaptivecards-designer-standalone.ts @@ -1,5 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +export * from "./shared"; export * from "./containers/host-container"; export * from "./containers/default/default-container"; export * from "./card-designer-surface"; @@ -10,8 +11,14 @@ export * from "./designer-peers"; export * from "./peer-command"; export * from "./miscellaneous"; export * from "./settings-manager"; -export * from "./side-pane"; +export * from "./side-panel"; +export * from "./tool-box"; export * from "./toolbar"; export * from "./tool-palette"; export * from "./splitter"; -export * from "./treeitem"; +export * from "./base-tree-item"; +export * from "./designer-peer-treeitem"; +export * from "./data"; +export * from "./catalogue"; +export * from "./containers/host-container"; +export * from "./containers/default/default-container"; \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.css b/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.css index 6320cfdb8f..c27854b218 100644 --- a/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.css +++ b/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.css @@ -1,24 +1,3 @@ -/* * { - box-sizing: border-box; -} - -html { - overflow: hidden !important; -} - -body { - font-family: 'Segoe UI', sans-serif; - font-size: 14px; - font-weight: normal; - height: 100vh; - margin: 0; - padding: 0; -} */ - -/* - Miscellaneous -*/ - @font-face { font-family: 'FabricMDL2Icons'; src: url("https://appsforoffice.microsoft.com/fabric/fonts/icons/FabricMDL2Icons.woff") format("woff"), url("https://appsforoffice.microsoft.com/fabric/fonts/icons/FabricMDL2Icons.ttf") format("truetype"); @@ -26,6 +5,14 @@ body { font-style: normal; } +.acd-designer-cardArea { + flex: 1 1 70%; + background-color: #F6F6F6; + display: flex; + flex-direction: column; + overflow: auto; +} + .acd-designersurface { outline: none; } @@ -34,12 +21,20 @@ body { display: none !important; } +.acd-toolPalette-pane { + display: flex; + flex: 0 0 auto; + flex-direction: column; + background-color: white; + border-right: 1px solid #D2D2D2; +} + .acd-treeView-pane { display: flex; flex: 0 0 auto; flex-direction: column; width: 360px; - height: 100%; + background-color: white; } .acd-treeView-host { @@ -55,7 +50,6 @@ body { flex: 0 0 auto; flex-direction: column; width: 360px; - height: 100%; background-color: #F9F9F9; } @@ -143,6 +137,35 @@ body { color: black !important; } +.acd-dialog-overlay { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.1); + display: flex; + align-items: center; + justify-content: center; + z-index: 10000; +} + +.acd-dialog-frame { + background-color: white; + display: flex; + flex-direction: column; + box-shadow: 0 0 50px -5px rgba(0, 0, 0, 0.4); +} + +.acd-sample-picker-message { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + word-wrap: break-word; +} + /* Icons */ @@ -154,6 +177,14 @@ body { font-weight: normal; } +.acd-toolPalette-icon { + color: #3a96dd; +} + +.acd-treeView-icon { + color: #3a96dd; +} + .acd-icon-bolt::before { content: "\E945"; } @@ -306,6 +337,26 @@ body { content: "\EB1C"; } +.acd-icon-dot::before { + content: "\E915"; +} + +.acd-icon-dataStructure::before { + content: "\EC8D"; +} + +.acd-icon-preview::before { + content: "\E8A1"; +} + +.acd-icon-open::before { + content: "\ED25"; +} + +.acd-icon-customPaletteItem::before { + content: "\ECAA"; +} + /* Side panes */ @@ -315,61 +366,83 @@ body { overflow-x: hidden; } -.acd-sidePane-header { - height: 32px; - background-color: #EEEEEE; - cursor: default; +.acd-horizontalCollapsedTabContainer { + display: flex; + flex: 0 0 auto; +} + +.acd-horizontalCollapsedTabContainer > .acd-toolbox-header { + border-right: 1px solid #D2D2D2; } -.acd-sidePane-header.rotated90DegreesClockwise { +.acd-verticalCollapsedTabContainer.acd-dockedLeft > .acd-toolbox-header { width: 32px; height: 170px; border-bottom: 1px solid #D2D2D2; } -.acd-sidePane-header.rotated90DegreesCounterClockwise { +.acd-verticalCollapsedTabContainer.acd-dockedLeft .acd-toolbox-header-content { + width: 170px; + height: 32px; + transform-origin: 0 0; + transform: rotate(-90deg) translate(-170px, 0px); +} + + +.acd-verticalCollapsedTabContainer.acd-dockedRight > .acd-toolbox-header { width: 32px; height: 170px; border-bottom: 1px solid #D2D2D2; } -.acd-sidePane-header-content { - height: 100%; - padding: 4px 10px; - display: flex; - align-items: center; - justify-content: space-between; -} - -.acd-sidePane-header-content.rotated90DegreesClockwise { +.acd-verticalCollapsedTabContainer.acd-dockedRight .acd-toolbox-header-content { width: 170px; height: 32px; transform-origin: 0 100%; transform: rotate(90deg) translate(-32px, 0px); } -.acd-sidePane-header-content.rotated90DegreesCounterClockwise { - width: 170px; +.acd-toolbox-header { height: 32px; - transform-origin: 0 0; - transform: rotate(-90deg) translate(-170px, 0px); + background-color: #EEEEEE; + cursor: default; + flex: 0 0 auto; +} + +.acd-toolbox-header-content { + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; } -.acd-sidePane-header-title { +.acd-toolbox-header-title { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; + padding: 4px 8px; + font-weight: 500; } -.acd-sidePane-header-expandCollapseButton { +.acd-toolbox-header-commandButton { display: flex; align-items: center; cursor: pointer; - margin-left: 4px; + height: 100%; + padding: 4px 8px; } -.acd-sidePane-header-status { - margin-left: 4px; +.acd-toolbox-header-commandButton:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +.acd-toolbox-header-commandButton:active { + background-color: rgba(0, 0, 0, 0.3); +} + +.acd-toolbox-header-commandsHost { + display: flex; + height: 100%; } .acd-designersurface.dragging { @@ -412,8 +485,8 @@ body { background-color: none; } -.acd-peer.dragging:hover { - border: 1px solid green; +.acd-peer.dragging { + border: 1px solid red !important; } .acd-peerButton { @@ -468,8 +541,9 @@ body { cursor: move; display: flex; align-items: center; - justify-content: center; padding: 4px 16px 4px 16px; + overflow: hidden; + text-overflow: ellipsis; } .acd-palette-item-label { @@ -525,6 +599,11 @@ body { margin-left: 8px; } +.acd-data-tree-item-additionalText { + color: #3a96dd; + margin-left: 8px; +} + /* Toolbar */ @@ -583,6 +662,10 @@ body { background-color: transparent; } +.acd-toolbar-button.acd-toolbar-button-toggled { + background-color: rgba(0, 0, 0, 0.1); +} + .acd-toolbar-button-iconOnly::before { margin-right: 0 !important; } diff --git a/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.ts b/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.ts index 4613b6a85a..ff88708cba 100644 --- a/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.ts +++ b/source/nodejs/adaptivecards-designer/src/adaptivecards-designer.ts @@ -2,3 +2,4 @@ // Licensed under the MIT License. export * from "./adaptivecards-designer-standalone"; export * from "./containers/index"; + diff --git a/source/nodejs/adaptivecards-designer/src/base-tree-item.ts b/source/nodejs/adaptivecards-designer/src/base-tree-item.ts new file mode 100644 index 0000000000..cc077060f3 --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/base-tree-item.ts @@ -0,0 +1,170 @@ +import { DraggableElement } from "./draggable-element"; + +export abstract class BaseTreeItem extends DraggableElement { + private static collapsedIconClass = "acd-icon-chevronRight"; + private static expandedIconClass = "acd-icon-chevronDown"; + + private _isExpanded: boolean = true; + private _isSelected: boolean = false; + private _treeItemElement: HTMLElement; + private _expandCollapseElement: HTMLElement; + private _childContainerElement: HTMLElement; + + protected abstract getLabelText(): string; + + protected click(e: MouseEvent) { + super.click(e); + + this.selected(); + } + + protected getIconClass(): string { + return null; + } + + protected getAdditionalText(): string { + return null; + } + + protected getAdditionalTextClass(): string { + return "acd-tree-item-additionalText"; + } + + protected getIndentationLevelIncrement(): number { + return 8; + } + + protected getDragSourceElement(): HTMLElement { + return this._treeItemElement; + } + + protected selected() { + // Do nothing in base implementation + } + + protected internalRender(): HTMLElement { + let rootElement = document.createElement("div"); + + this._treeItemElement = document.createElement("div"); + this._treeItemElement.classList.add("acd-tree-item"); + this._treeItemElement.style.display = "flex"; + this._treeItemElement.style.alignItems = "center"; + this._treeItemElement.style.paddingLeft = this.getIndentationLevelIncrement() * (1 + this.level) + "px"; + + this._expandCollapseElement = document.createElement("div"); + this._expandCollapseElement.classList.add("acd-tree-item-expandCollapseButton"); + this._expandCollapseElement.style.flex = "0 0 auto"; + this._expandCollapseElement.style.visibility = this.getChildCount() > 0 ? "visible" : "hidden"; + this._expandCollapseElement.onclick = (e: MouseEvent) => { + this._isExpanded = !this._isExpanded; + + this.updateLayout(); + + e.cancelBubble = true; + e.preventDefault(); + } + + this._treeItemElement.appendChild(this._expandCollapseElement); + + let textElement = document.createElement("div"); + textElement.classList.add("acd-tree-item-text"); + textElement.style.flex = "1 1 auto"; + textElement.style.display = "flex"; + textElement.style.alignItems = "center"; + textElement.style.whiteSpace = "nowrap"; + textElement.style.textOverflow = "ellipsis"; + textElement.style.overflow = "hidden"; + + if (this.getIconClass()) { + let iconElement = document.createElement("div"); + iconElement.classList.add("acd-icon", "acd-treeView-icon", this.getIconClass()); + + textElement.appendChild(iconElement); + } + + let labelSpan = document.createElement("span"); + labelSpan.classList.add("acd-tree-item-typeName"); + labelSpan.innerText = this.getLabelText(); + + textElement.appendChild(labelSpan); + + let text = this.getAdditionalText(); + + if (text && text != "") { + let additionalTextSpan = document.createElement("span"); + additionalTextSpan.classList.add(this.getAdditionalTextClass()); + additionalTextSpan.innerText = " [" + text + "]"; + + textElement.appendChild(additionalTextSpan); + } + + this._treeItemElement.appendChild(textElement); + + rootElement.appendChild(this._treeItemElement); + + this._childContainerElement = document.createElement("div"); + + for (let i = 0; i < this.getChildCount(); i++) { + let renderedChildItem = this.getChildAt(i).render(); + + this._childContainerElement.appendChild(renderedChildItem); + } + + rootElement.appendChild(this._childContainerElement); + + this.updateLayout(); + + return rootElement; + } + + protected _level: number = 0; + + constructor() { + super(); + } + + abstract getChildCount(): number; + abstract getChildAt(index: number): BaseTreeItem; + + updateLayout() { + if (this._isExpanded) { + this._childContainerElement.classList.remove("acd-hidden"); + this._expandCollapseElement.classList.remove(BaseTreeItem.collapsedIconClass); + this._expandCollapseElement.classList.add(BaseTreeItem.expandedIconClass); + } + else { + this._childContainerElement.classList.add("acd-hidden"); + this._expandCollapseElement.classList.add(BaseTreeItem.collapsedIconClass); + this._expandCollapseElement.classList.remove(BaseTreeItem.expandedIconClass); + } + } + + expand() { + this._isExpanded = true; + + this.updateLayout(); + } + + isDraggable(): boolean { + return false; + } + + get level(): number { + return this._level; + } + + get isSelected(): boolean { + return this._isSelected; + } + + set isSelected(value: boolean) { + this._isSelected = value; + + if (this._isSelected) { + this._treeItemElement.classList.add("selected"); + } + else { + this._treeItemElement.classList.remove("selected"); + } + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/card-designer-surface.ts b/source/nodejs/adaptivecards-designer/src/card-designer-surface.ts index ebdc82588b..63b3f19071 100644 --- a/source/nodejs/adaptivecards-designer/src/card-designer-surface.ts +++ b/source/nodejs/adaptivecards-designer/src/card-designer-surface.ts @@ -5,11 +5,27 @@ import * as Controls from "adaptivecards-controls"; import { DraggableElement } from "./draggable-element"; import { IPoint } from "./miscellaneous"; import * as DesignerPeers from "./designer-peers"; +import * as ACData from "adaptivecards-templating"; +import * as Shared from "./shared"; export type CardElementType = { new(): Adaptive.CardElement }; export type ActionType = { new(): Adaptive.Action }; -export type CardElementPeerType = { new(designerSurface: CardDesignerSurface, registration: DesignerPeers.DesignerPeerRegistrationBase, cardElement: Adaptive.CardElement): DesignerPeers.CardElementPeer }; -export type ActionPeerType = { new(designerSurface: CardDesignerSurface, registration: DesignerPeers.DesignerPeerRegistrationBase, action: Adaptive.Action): DesignerPeers.ActionPeer }; +export type CardElementPeerType = { + new( + parent: DesignerPeers.DesignerPeer, + designerSurface: CardDesignerSurface, + registration: DesignerPeers.DesignerPeerRegistrationBase, + cardElement: Adaptive.CardElement + ): DesignerPeers.CardElementPeer +}; +export type ActionPeerType = { + new( + parent: DesignerPeers.DesignerPeer, + designerSurface: CardDesignerSurface, + registration: DesignerPeers.DesignerPeerRegistrationBase, + action: Adaptive.Action + ): DesignerPeers.ActionPeer +}; class DesignerPeerCategory { static Unknown = "Unknown"; @@ -98,22 +114,9 @@ export class CardElementPeerRegistry extends DesignerPeerRegistry = undefined; - - for (var i = 0; i < this._items.length; i++) { - if (cardElement instanceof this._items[i].sourceType) { - registrationInfo = this._items[i]; - - break; - } - } - */ - var registrationInfo = this.findTypeRegistration((cardElement).constructor); - var peer = registrationInfo ? new registrationInfo.peerType(designerSurface, registrationInfo, cardElement) : new DesignerPeers.CardElementPeer(designerSurface, this.defaultRegistration, cardElement); - peer.parent = parent; + var peer = registrationInfo ? new registrationInfo.peerType(parent, designerSurface, registrationInfo, cardElement) : new DesignerPeers.CardElementPeer(parent, designerSurface, this.defaultRegistration, cardElement); return peer; } @@ -133,8 +136,7 @@ export class ActionPeerRegistry extends DesignerPeerRegistryaction).constructor); - var peer = registrationInfo ? new registrationInfo.peerType(designerSurface, registrationInfo, action) : new DesignerPeers.ActionPeer(designerSurface, this.defaultRegistration, action); - peer.parent = parent; + var peer = registrationInfo ? new registrationInfo.peerType(parent, designerSurface, registrationInfo, action) : new DesignerPeers.ActionPeer(parent, designerSurface, this.defaultRegistration, action); return peer; } @@ -171,6 +173,8 @@ export class CardDesignerSurface { private _removeCommandElement: HTMLElement; private _peerCommandsHostElement: HTMLElement; private _lastParseErrors: Array = []; + private _isPreviewMode: boolean = false; + private _sampleData: any; private updatePeerCommandsLayout() { if (this._selectedPeer) { @@ -261,12 +265,45 @@ export class CardDesignerSurface { this.onCardValidated(this._lastParseErrors, this.card.validateProperties()); } - let renderedCard = this.card.render(); + let cardToRender: Adaptive.AdaptiveCard; + + if (this.isPreviewMode) { + if (Shared.GlobalSettings.previewFeaturesEnabled) { + let cardPayload = this.card.toJSON(); + + try { + let template = new ACData.Template(cardPayload); + + let context = new ACData.EvaluationContext(); + context.$root = this.sampleData; + + let expandedCardPayload = template.expand(context); + + cardToRender = new Adaptive.AdaptiveCard(); + cardToRender.hostConfig = this.card.hostConfig; + cardToRender.parse(expandedCardPayload); + } + catch (e) { + console.log("Template expansion error: " + e.message); + } + } + + if (!cardToRender) { + cardToRender = this.card; + cardToRender.designMode = false; + } + } + else { + cardToRender = this.card; + cardToRender.designMode = true; + } + + let renderedCard = cardToRender.render(); if (this.fixedHeightCard) { renderedCard.style.height = "100%"; - } + } this._cardHost.appendChild(renderedCard); } } @@ -370,7 +407,7 @@ export class CardDesignerSurface { if (!peer) { let registration = CardDesignerSurface.cardElementPeerRegistry.findTypeRegistration(Adaptive.AdaptiveCard); - peer = new registration.peerType(this, registration, action.card); + peer = new registration.peerType(peer, this, registration, action.card); let parentPeer = this.findActionPeer(action); @@ -436,7 +473,7 @@ export class CardDesignerSurface { this._designerSurface.style.width = "100%"; this._designerSurface.style.height = "100%"; - this._designerSurface.onkeydown = (e: KeyboardEvent) => { + this._designerSurface.onkeyup = (e: KeyboardEvent) => { if (this._selectedPeer) { switch (e.keyCode) { case Controls.KEY_ESCAPE: @@ -687,4 +724,41 @@ export class CardDesignerSurface { this.render(); } } + + get isPreviewMode(): boolean { + return this._isPreviewMode; + } + + set isPreviewMode(value: boolean) { + if (this._isPreviewMode != value) { + this._isPreviewMode = value; + + if (this._isPreviewMode) { + this._designerSurface.classList.add("acd-hidden"); + this._dragHandle.renderedElement.classList.add("acd-hidden"); + this._removeCommandElement.classList.add("acd-hidden"); + this._peerCommandsHostElement.classList.add("acd-hidden"); + } + else { + this._designerSurface.classList.remove("acd-hidden"); + this._dragHandle.renderedElement.classList.remove("acd-hidden"); + this._removeCommandElement.classList.remove("acd-hidden"); + this._peerCommandsHostElement.classList.remove("acd-hidden"); + } + + this.renderCard(); + } + } + + get sampleData(): any { + return this._sampleData; + } + + set sampleData(value: any) { + this._sampleData = value; + + if (this.isPreviewMode) { + this.renderCard(); + } + } } diff --git a/source/nodejs/adaptivecards-designer/src/card-designer.ts b/source/nodejs/adaptivecards-designer/src/card-designer.ts index 7bfcf3ca32..c5278c1aae 100644 --- a/source/nodejs/adaptivecards-designer/src/card-designer.ts +++ b/source/nodejs/adaptivecards-designer/src/card-designer.ts @@ -6,15 +6,20 @@ import * as monaco from "monaco-editor"; import * as Constants from "./constants"; import * as Designer from "./card-designer-surface"; import * as DesignerPeers from "./designer-peers"; +import { SamplePickerDialog } from "./sample-picker-dialog"; import { HostContainer } from "./containers/host-container"; import { adaptiveCardSchema } from "./adaptive-card-schema"; import { FullScreenHandler } from "./fullscreen-handler"; import { Toolbar, ToolbarButton, ToolbarChoicePicker, ToolbarElementAlignment } from "./toolbar"; -import { SidePane, SidePaneOrientation } from "./side-pane"; -import { Splitter } from "./splitter"; -import { IPoint, Utils } from "./miscellaneous"; -import { BasePaletteItem, ElementPaletteItem } from "./tool-palette"; +import { IPoint, Utils, defaultHostConfig } from "./miscellaneous"; +import { BasePaletteItem, ElementPaletteItem, DataPaletteItem, SnippetPaletteItem, CustomPaletteItem } from "./tool-palette"; import { DefaultContainer } from "./containers/default/default-container"; +import { SidePanel, SidePanelAlignment } from "./side-panel"; +import { Toolbox, IToolboxCommand } from "./tool-box"; +import { FieldDefinition } from "./data"; +import { DataTreeItem } from "./data-treeitem"; +import { BaseTreeItem } from "./base-tree-item"; +import * as Shared from "./shared"; export class CardDesigner { private static internalProcessMarkdown(text: string, result: Adaptive.IMarkdownProcessingResult) { @@ -33,11 +38,12 @@ export class CardDesigner { private static MAX_UNDO_STACK_SIZE = 50; - private _monacoEditor: monaco.editor.IStandaloneCodeEditor; + private _isAttached: boolean = false; + private _cardEditor: monaco.editor.IStandaloneCodeEditor; + private _sampleDataEditor: monaco.editor.IStandaloneCodeEditor; private _hostContainers: Array; private _isMonacoEditorLoaded: boolean = false; private _designerSurface: Designer.CardDesignerSurface; - private _propertySheetHostConfig: Adaptive.HostConfig; private _designerHostElement: HTMLElement; private _draggedPaletteItem: BasePaletteItem; private _draggedElement: HTMLElement; @@ -46,30 +52,91 @@ export class CardDesigner { private _activeHostContainer: HostContainer; private _undoStack: Array = []; private _undoStackIndex: number = -1; - private _toolPalettePane: SidePane; - private _jsonEditorPane: SidePane; - private _propertySheetPane: SidePane; - private _treeViewPane: SidePane; - private _assetPath: string; + private _toolPaletteToolbox: Toolbox; + private _propertySheetToolbox: Toolbox; + private _treeViewToolbox: Toolbox; + private _jsonEditorsPanel: SidePanel; + private _cardEditorToolbox: Toolbox; + private _sampleDataEditorToolbox: Toolbox; + private _dataToolbox: Toolbox; + private _assetPath: string; + private _dataStructure: FieldDefinition; + private _sampleData: any; + private _customPeletteItems: CustomPaletteItem[]; + + private togglePreview() { + this._designerSurface.isPreviewMode = !this._designerSurface.isPreviewMode; + + if (this._designerSurface.isPreviewMode) { + this._togglePreviewButton.toolTip = "Return to Design mode"; + } + else { + this._togglePreviewButton.toolTip = "Switch to Preview mode"; + this._designerSurface.updateLayout(); + } + + this.buildTreeView(); + } private buildTreeView() { - if (this._treeViewPane.content) { - this._treeViewPane.content.innerHTML = ""; - this._treeViewPane.content.appendChild(this.designerSurface.rootPeer.treeItem.render()); - } + if (this._treeViewToolbox.content) { + this._treeViewToolbox.content.innerHTML = ""; + + if (this.designerSurface.isPreviewMode) { + this.treeViewToolbox.content.innerHTML = + '
' + + '
The Card Structure isn\'t available in Preview mode.
' + + '
'; + } + else { + this._treeViewToolbox.content.appendChild(this.designerSurface.rootPeer.treeItem.render()); + } + } + } + + private setupDataTreeItemEvents(treeItem: DataTreeItem) { + treeItem.onStartDrag = (sender: BaseTreeItem) => { + this._draggedPaletteItem = new DataPaletteItem(treeItem.field); + + this._draggedElement = this._draggedPaletteItem.renderDragVisual(); + this._draggedElement.style.position = "absolute"; + this._draggedElement.style.left = this._currentMousePosition.x + "px"; + this._draggedElement.style.top = this._currentMousePosition.y + "px"; + + document.body.appendChild(this._draggedElement); + + treeItem.endDrag(); + } + + for (let i = 0; i < treeItem.getChildCount(); i++) { + this.setupDataTreeItemEvents(treeItem.getChildAt(i)); + } + } + + private buildDataExplorer() { + if (this._dataToolbox && this._dataToolbox.content) { + this._dataToolbox.content.innerHTML = ""; + + if (this._dataStructure) { + let treeItem = new DataTreeItem(this._dataStructure); + + this._dataToolbox.content.appendChild(treeItem.render()); + + this.setupDataTreeItemEvents(treeItem); + } + } } private buildPropertySheet(peer: DesignerPeers.DesignerPeer) { - if (this._propertySheetPane.content) { - this._propertySheetPane.content.innerHTML = ""; + if (this._propertySheetToolbox.content) { + this._propertySheetToolbox.content.innerHTML = ""; let card: Adaptive.AdaptiveCard; if (peer) { - card = peer.buildPropertySheetCard(); + card = peer.buildPropertySheetCard(this.currentTargetVersion); } else { - card = new Adaptive.AdaptiveCard(); card.parse( { @@ -97,9 +164,10 @@ export class CardDesigner { ) } - card.hostConfig = this._propertySheetHostConfig; + // card.hostConfig = this._propertySheetHostConfig; + card.hostConfig = defaultHostConfig; - this._propertySheetPane.content.appendChild(card.render()); + this._propertySheetToolbox.content.appendChild(card.render()); } } @@ -108,7 +176,7 @@ export class CardDesigner { paletteItem.onStartDrag = (sender: BasePaletteItem) => { this._draggedPaletteItem = sender; - this._draggedElement = sender.cloneElement(); + this._draggedElement = sender.renderDragVisual(); this._draggedElement.style.position = "absolute"; this._draggedElement.style.left = this._currentMousePosition.x + "px"; this._draggedElement.style.top = this._currentMousePosition.y + "px"; @@ -120,7 +188,11 @@ export class CardDesigner { } private buildPalette() { - this._toolPalettePane.content.innerHTML = ""; + if (!this._isAttached) { + return; + } + + this._toolPaletteToolbox.content.innerHTML = ""; let categorizedTypes: Object = {}; @@ -142,56 +214,27 @@ export class CardDesigner { } } + if (this.customPaletteItems) { + for (let item of this.customPaletteItems) { + if (!categorizedTypes.hasOwnProperty(item.category)) { + categorizedTypes[item.category] = []; + } + + categorizedTypes[item.category].push(item); + } + } + for (let category in categorizedTypes) { let node = document.createElement('li'); node.innerText = category; node.className = "acd-palette-category"; - this._toolPalettePane.content.appendChild(node); + this._toolPaletteToolbox.content.appendChild(node); for (var i = 0; i < categorizedTypes[category].length; i++) { - this.addPaletteItem(categorizedTypes[category][i], this._toolPalettePane.content); + this.addPaletteItem(categorizedTypes[category][i], this._toolPaletteToolbox.content); } } - - /* This is to test "snippet" support. Snippets are not yet fully baked - let personaHeaderSnippet = new SnippetPaletteItem("Persona header"); - personaHeaderSnippet.snippet = { - type: "ColumnSet", - columns: [ - { - width: "auto", - items: [ - { - type: "Image", - size: "Small", - style: "Person", - url: "https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg" - } - ] - }, - { - width: "stretch", - items: [ - { - type: "TextBlock", - text: "John Doe", - weight: "Bolder", - wrap: true - }, - { - type: "TextBlock", - spacing: "None", - text: "Additional information", - wrap: true - } - ] - } - ] - }; - - this.addPaletteItem(personaHeaderSnippet); - */ } private endDrag() { @@ -248,10 +291,10 @@ export class CardDesigner { styleSheetLinkElement.href = Utils.joinPaths(this._assetPath, this.activeHostContainer.styleSheet); } - let designerBackground = document.getElementById("designerBackground"); + let _cardArea = document.getElementById("cardArea"); - if (designerBackground) { - designerBackground.style.backgroundColor = this.activeHostContainer.getBackgroundColor(); + if (_cardArea) { + _cardArea.style.backgroundColor = this.activeHostContainer.getBackgroundColor(); } this.activeHostContainer.initialize(); @@ -259,6 +302,8 @@ export class CardDesigner { this._designerHostElement.innerHTML = ""; this.activeHostContainer.renderTo(this._designerHostElement); + let wasInPreviewMode = this._designerSurface ? this._designerSurface.isPreviewMode : false; + this._designerSurface = new Designer.CardDesignerSurface(this.activeHostContainer.cardHost); this._designerSurface.fixedHeightCard = this.activeHostContainer.isFixedHeight; this._designerSurface.onSelectedPeerChanged = (peer: DesignerPeers.DesignerPeer) => { @@ -313,28 +358,41 @@ export class CardDesigner { } this._designerSurface.card = this._card; + + this.updateSampleData(); + + this._designerSurface.isPreviewMode = wasInPreviewMode; } private activeHostContainerChanged() { this.recreateDesignerSurface(); } - public updateJsonEditorLayout() { + private updateToolboxLayout(toolbox: Toolbox, hostPanelRect: ClientRect | DOMRect) { + if (toolbox) { + let jsonEditorHeaderRect = toolbox.getHeaderBoundingRect(); + + toolbox.content.style.height = (hostPanelRect.height - jsonEditorHeaderRect.height) + "px"; + } + } + + public updateJsonEditorsLayout() { if (this._isMonacoEditorLoaded) { - // Monaco is very finicky. It will apparently only properly layout if - // its direct container has an explicit height. - let jsonEditorPaneRect = this._jsonEditorPane.attachedTo.getBoundingClientRect(); - let jsonEditorHeaderRect = this._jsonEditorPane.getHeaderBoundingRect(); + let jsonEditorsPaneRect = this._jsonEditorsPanel.contentHost.getBoundingClientRect(); - this._jsonEditorPane.content.style.height = (jsonEditorPaneRect.height - jsonEditorHeaderRect.height) + "px"; + this.updateToolboxLayout(this._cardEditorToolbox, jsonEditorsPaneRect); + this._cardEditor.layout(); - this._monacoEditor.layout(); + if (this._sampleDataEditorToolbox) { + this.updateToolboxLayout(this._sampleDataEditorToolbox, jsonEditorsPaneRect); + this._sampleDataEditor.layout(); + } } } private updateFullLayout() { this.scheduleLayoutUpdate(); - this.updateJsonEditorLayout(); + this.updateJsonEditorsLayout(); } private jsonUpdateTimer: any; @@ -342,9 +400,17 @@ export class CardDesigner { private updateLayoutTimer: any; private preventCardUpdate: boolean = false; + + private setCardPayload(payload: object) { + if (this._isMonacoEditorLoaded) { + this._cardEditor.setValue(JSON.stringify(payload, null, 4)); + } + } - private setJsonPayload(payload: object) { - this._monacoEditor.setValue(JSON.stringify(payload, null, 4)); + private setSampleDataPayload(payload: any) { + if (this._isMonacoEditorLoaded && this._sampleDataEditor) { + this._sampleDataEditor.setValue(JSON.stringify(payload, null, 4)); + } } private updateJsonFromCard(addToUndoStack: boolean = true) { @@ -357,8 +423,8 @@ export class CardDesigner { if (addToUndoStack) { this.addToUndoStack(cardPayload); } - - this.setJsonPayload(cardPayload); + + this.setCardPayload(cardPayload); } } finally { @@ -375,9 +441,13 @@ export class CardDesigner { } private preventJsonUpdate: boolean = false; + + private getCurrentCardEditorPayload(): string { + return this._isMonacoEditorLoaded ? this._cardEditor.getValue() : Constants.defaultPayload; + } - private getCurrentJsonPayload(): string { - return this._isMonacoEditorLoaded ? this._monacoEditor.getValue() : Constants.defaultPayload; + private getCurrentSampleDataEditorPayload(): string { + return this._isMonacoEditorLoaded && this._sampleDataEditor ? this._sampleDataEditor.getValue() : ""; } private updateCardFromJson() { @@ -385,7 +455,7 @@ export class CardDesigner { this.preventJsonUpdate = true; if (!this.preventCardUpdate) { - this.designerSurface.setCardPayloadAsString(this.getCurrentJsonPayload()); + this.designerSurface.setCardPayloadAsString(this.getCurrentCardEditorPayload()); } } finally { @@ -410,12 +480,32 @@ export class CardDesigner { private _fullScreenHandler = new FullScreenHandler(); private _fullScreenButton: ToolbarButton; private _hostContainerChoicePicker: ToolbarChoicePicker; + private _versionChoicePicker: ToolbarChoicePicker; private _undoButton: ToolbarButton; private _redoButton: ToolbarButton; private _newCardButton: ToolbarButton; private _copyJSONButton: ToolbarButton; + private _togglePreviewButton: ToolbarButton; private prepareToolbar() { + if (Shared.GlobalSettings.previewFeaturesEnabled) { + this._versionChoicePicker = new ToolbarChoicePicker(CardDesigner.ToolbarCommands.VersionPicker); + this._versionChoicePicker.label = "Target version:" + this._versionChoicePicker.width = 80; + this._versionChoicePicker.alignment = ToolbarElementAlignment.Right; + this._versionChoicePicker.separator = true; + + for (let i = 0; i < Shared.SupportedTargetVersions.length; i++) { + this._versionChoicePicker.choices.push( + { + name: Shared.SupportedTargetVersions[i].label, + value: i.toString() + }); + } + + this.toolbar.addElement(this._versionChoicePicker); + } + this._fullScreenButton = new ToolbarButton( CardDesigner.ToolbarCommands.FullScreen, "Enter Full Screen", @@ -427,6 +517,49 @@ export class CardDesigner { this.toolbar.addElement(this._fullScreenButton); + let openSampleButton = new ToolbarButton( + CardDesigner.ToolbarCommands.OpenPayload, + "Open Sample", + "acd-icon-open", + (sender: ToolbarButton) => { + let dialog = new SamplePickerDialog(); + dialog.title = "Pick a sample"; + dialog.width = "30%"; + dialog.height = "60%"; + dialog.catalogueUrl = this.sampleCatalogueUrl; + dialog.onClose = (d) => { + if (dialog.selectedSample) { + dialog.selectedSample.onDownloaded = () => { + try { + let cardPayload = JSON.parse(dialog.selectedSample.cardPayload); + + this.setCardPayload(cardPayload); + } + catch { + alert("The sample could not be loaded.") + } + + if (!Adaptive.isNullOrEmpty(dialog.selectedSample.sampleData)) { + try { + let sampleDataPayload = JSON.parse(dialog.selectedSample.sampleData); + + this.setSampleDataPayload(sampleDataPayload); + this.dataStructure = FieldDefinition.create(sampleDataPayload); + } + catch { + alert("The sample could not be loaded.") + } + } + }; + dialog.selectedSample.download(); + } + }; + dialog.open(); + } + ) + + this.toolbar.addElement(openSampleButton); + if (this._hostContainers && this._hostContainers.length > 0) { this._hostContainerChoicePicker = new ToolbarChoicePicker(CardDesigner.ToolbarCommands.HostAppPicker); this._hostContainerChoicePicker.separator = true; @@ -455,7 +588,7 @@ export class CardDesigner { CardDesigner.ToolbarCommands.Undo, "Undo", "acd-icon-undo", - (sender) => { this.undo(); }); + (sender: ToolbarButton) => { this.undo(); }); this._undoButton.separator = true; this._undoButton.toolTip = "Undo your last change"; this._undoButton.isEnabled = false; @@ -467,7 +600,7 @@ export class CardDesigner { CardDesigner.ToolbarCommands.Redo, "Redo", "acd-icon-redo", - (sender) => { this.redo(); }); + (sender: ToolbarButton) => { this.redo(); }); this._redoButton.toolTip = "Redo your last changes"; this._redoButton.isEnabled = false; this._redoButton.displayCaption = false; @@ -478,17 +611,26 @@ export class CardDesigner { CardDesigner.ToolbarCommands.NewCard, "New card", "acd-icon-newCard", - (sender) => { this.newCard(); }); - this._newCardButton.separator = true; + (sender: ToolbarButton) => { this.newCard(); }); + this._newCardButton.separator = true; this.toolbar.addElement(this._newCardButton); this._copyJSONButton = new ToolbarButton( CardDesigner.ToolbarCommands.CopyJSON, - "Copy JSON", + "Copy card JSON", "acd-icon-copy"); this.toolbar.addElement(this._copyJSONButton); + this._togglePreviewButton = new ToolbarButton( + CardDesigner.ToolbarCommands.TogglePreview, + "Preview mode", + "acd-icon-preview", + (sender: ToolbarButton) => { this.togglePreview(); }); + this._togglePreviewButton.separator = true; + this._togglePreviewButton.allowToggle = true; + this.toolbar.addElement(this._togglePreviewButton); + this._fullScreenHandler = new FullScreenHandler(); this._fullScreenHandler.onFullScreenChanged = (isFullScreen: boolean) => { this._fullScreenButton.toolTip = isFullScreen ? "Exit full screen" : "Enter full screen"; @@ -498,19 +640,21 @@ export class CardDesigner { } private onResize() { - this._monacoEditor.layout(); - } + this._cardEditor.layout(); - private loadMonaco(callback: () => void) { - // window["require"].config({ paths: { 'vs': './editor/monaco/min/vs' } }); - // window["require"]( - // ['vs/editor/editor.main'], - // function () { - // callback(); - // }); + if (this._sampleDataEditor) { + this._sampleDataEditor.layout(); + } + } - // If loaded using WebPack this should work, but it's not right now... - //callback(); + private updateSampleData() { + try { + this._sampleData = JSON.parse(this.getCurrentSampleDataEditorPayload()); + this.designerSurface.sampleData = this._sampleData; + } + catch { + // Swallow expression, the payload isn't a valid JSON document + } } public monacoModuleLoaded(monaco: any = null) { @@ -529,18 +673,18 @@ export class CardDesigner { validate: false, allowComments: true } - - this._jsonEditorPane.content = document.createElement("div"); - this._jsonEditorPane.content.style.overflow = "hidden"; - + // TODO: set this in our editor instead of defaults monaco.languages.json.jsonDefaults.setDiagnosticsOptions(monacoConfiguration); - this._monacoEditor = monaco.editor.create( - this._jsonEditorPane.content, + // Setup card JSON editor + this._cardEditorToolbox.content = document.createElement("div"); + this._cardEditorToolbox.content.style.overflow = "hidden"; + + this._cardEditor = monaco.editor.create( + this._cardEditorToolbox.content, { folding: true, - // validate: false, fontSize: 13.5, language: 'json', minimap: { @@ -548,14 +692,37 @@ export class CardDesigner { } } ); - - this._monacoEditor.onDidChangeModelContent(() => { this.scheduleUpdateCardFromJson(); }); + + this._cardEditor.onDidChangeModelContent(() => { this.scheduleUpdateCardFromJson(); }); + + if (this._sampleDataEditorToolbox) { + // Setup sample data JSON editor + this._sampleDataEditorToolbox.content = document.createElement("div"); + this._sampleDataEditorToolbox.content.style.overflow = "hidden"; + + this._sampleDataEditor = monaco.editor.create( + this._sampleDataEditorToolbox.content, + { + folding: true, + fontSize: 13.5, + language: 'json', + minimap: { + enabled: false + } + } + ); + + this._sampleDataEditor.onDidChangeModelContent( + () => { + this.updateSampleData(); + }); + } window.addEventListener('resize', () => { this.onResize(); }); this._isMonacoEditorLoaded = true; - this.updateJsonEditorLayout(); + this.updateJsonEditorsLayout(); this.updateJsonFromCard(false); } @@ -623,7 +790,10 @@ export class CardDesigner { readonly toolbar: Toolbar = new Toolbar(); + sampleCatalogueUrl: string = undefined; + constructor(hostContainers: Array = null) { + Adaptive.AdaptiveCard.enableFullJsonRoundTrip = true; Adaptive.AdaptiveCard.onProcessMarkdown = (text: string, result: Adaptive.IMarkdownProcessingResult) => { CardDesigner.internalProcessMarkdown(text, result); } @@ -631,287 +801,6 @@ export class CardDesigner { this._hostContainers = hostContainers ? hostContainers : []; this.prepareToolbar(); - - this._propertySheetHostConfig = new Adaptive.HostConfig( - { - preExpandSingleShowCardAction: true, - supportsInteractivity: true, - spacing: { - small: 10, - default: 20, - medium: 30, - large: 40, - extraLarge: 50, - padding: 20 - }, - separator: { - lineThickness: 1, - lineColor: "#EEEEEE" - }, - textAlign: { - right: "right" - }, - imageSizes: { - small: 40, - medium: 80, - large: 160 - }, - fontTypes: { - default: { - fontFamily: "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif", - fontSizes: { - small: 12, - default: 14, - medium: 17, - large: 21, - extraLarge: 26 - }, - fontWeights: { - lighter: 200, - default: 400, - bolder: 600 - } - }, - monospace: { - fontFamily: "'Courier New', Courier, monospace", - fontSizes: { - small: 12, - default: 14, - medium: 17, - large: 21, - extraLarge: 26 - }, - fontWeights: { - lighter: 200, - default: 400, - bolder: 600 - } - } - }, - containerStyles: { - default: { - backgroundColor: "#f9f9f9", - foregroundColors: { - default: { - default: "#333333", - subtle: "#EE333333" - }, - accent: { - default: "#2E89FC", - subtle: "#882E89FC" - }, - attention: { - default: "#cc3300", - subtle: "#DDcc3300" - }, - good: { - default: "#54a254", - subtle: "#DD54a254" - }, - warning: { - default: "#e69500", - subtle: "#DDe69500" - } - } - }, - emphasis: { - backgroundColor: "#08000000", - foregroundColors: { - default: { - default: "#333333", - subtle: "#EE333333" - }, - accent: { - default: "#2E89FC", - subtle: "#882E89FC" - }, - attention: { - default: "#cc3300", - subtle: "#DDcc3300" - }, - good: { - default: "#54a254", - subtle: "#DD54a254" - }, - warning: { - default: "#e69500", - subtle: "#DDe69500" - } - } - }, - accent: { - backgroundColor: "#C7DEF9", - foregroundColors: { - default: { - default: "#333333", - subtle: "#EE333333" - }, - dark: { - default: "#000000", - subtle: "#66000000" - }, - light: { - default: "#FFFFFF", - subtle: "#33000000" - }, - accent: { - default: "#2E89FC", - subtle: "#882E89FC" - }, - attention: { - default: "#cc3300", - subtle: "#DDcc3300" - }, - good: { - default: "#54a254", - subtle: "#DD54a254" - }, - warning: { - default: "#e69500", - subtle: "#DDe69500" - } - } - }, - good: { - backgroundColor: "#CCFFCC", - foregroundColors: { - default: { - default: "#333333", - subtle: "#EE333333" - }, - dark: { - default: "#000000", - subtle: "#66000000" - }, - light: { - default: "#FFFFFF", - subtle: "#33000000" - }, - accent: { - default: "#2E89FC", - subtle: "#882E89FC" - }, - attention: { - default: "#cc3300", - subtle: "#DDcc3300" - }, - good: { - default: "#54a254", - subtle: "#DD54a254" - }, - warning: { - default: "#e69500", - subtle: "#DDe69500" - } - } - }, - attention: { - backgroundColor: "#FFC5B2", - foregroundColors: { - default: { - default: "#333333", - subtle: "#EE333333" - }, - dark: { - default: "#000000", - subtle: "#66000000" - }, - light: { - default: "#FFFFFF", - subtle: "#33000000" - }, - accent: { - default: "#2E89FC", - subtle: "#882E89FC" - }, - attention: { - default: "#cc3300", - subtle: "#DDcc3300" - }, - good: { - default: "#54a254", - subtle: "#DD54a254" - }, - warning: { - default: "#e69500", - subtle: "#DDe69500" - } - } - }, - warning: { - backgroundColor: "#FFE2B2", - foregroundColors: { - default: { - default: "#333333", - subtle: "#EE333333" - }, - dark: { - default: "#000000", - subtle: "#66000000" - }, - light: { - default: "#FFFFFF", - subtle: "#33000000" - }, - accent: { - default: "#2E89FC", - subtle: "#882E89FC" - }, - attention: { - default: "#cc3300", - subtle: "#DDcc3300" - }, - good: { - default: "#54a254", - subtle: "#DD54a254" - }, - warning: { - default: "#e69500", - subtle: "#DDe69500" - } - } - } - }, - actions: { - maxActions: 5, - spacing: Adaptive.Spacing.Default, - buttonSpacing: 10, - showCard: { - actionMode: Adaptive.ShowCardActionMode.Inline, - inlineTopMargin: 16 - }, - actionsOrientation: Adaptive.Orientation.Horizontal, - actionAlignment: Adaptive.ActionAlignment.Left - }, - adaptiveCard: { - allowCustomStyle: true - }, - imageSet: { - imageSize: Adaptive.Size.Medium, - maxImageHeight: 100 - }, - factSet: { - title: { - color: Adaptive.TextColor.Default, - size: Adaptive.TextSize.Default, - isSubtle: false, - weight: Adaptive.TextWeight.Bolder, - wrap: true, - maxWidth: 150, - }, - value: { - color: Adaptive.TextColor.Default, - size: Adaptive.TextSize.Default, - isSubtle: false, - weight: Adaptive.TextWeight.Default, - wrap: true, - }, - spacing: 10 - } - } - ); - - this._propertySheetHostConfig.cssClassNamePrefix = "default"; } attachTo(root: HTMLElement) { @@ -938,140 +827,156 @@ export class CardDesigner { root.innerHTML = '
' + '
' + - '
' + - '
' + - '
' + - '
' + + '
' + + '
' + '
' + '
' + - '
' + + '
' + '
' + '
' + '
' + '
' + '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + + '
' + + '
' + '
' + - '
' + - '
' + - '
' + + '
' + + '
' + '
' + - '
' + + '
' + '
'; this.toolbar.attachTo(document.getElementById("toolbarHost")); - new Clipboard( - this._copyJSONButton.renderedElement, - { - text: (trigger) => { return JSON.stringify(this.card.toJSON(), null, 4); } - }); - - // Tool palette pane - this._toolPalettePane = new SidePane( - document.getElementById("toolPalettePane"), - document.getElementById("leftCollapsedPaneTabHost"), - "toolPalette", - "Tool box", - "selector-toolPalette"); - this._toolPalettePane.onToggled = (sender: SidePane) => { - this.updateFullLayout(); + if (this._versionChoicePicker) { + this._versionChoicePicker.selectedIndex = Shared.SupportedTargetVersions.indexOf(Shared.Versions.v1_2); + this._versionChoicePicker.onChanged = (sender) => { + this.buildPropertySheet(this._designerSurface.selectedPeer); + } } - this._toolPalettePane.content = document.getElementById("toolPaletteHost"); - - // Splitter for JSON editor pane - let jsonEditorSplitter = new Splitter( - document.getElementById("jsonEditorSplitter"), - document.getElementById("jsonEditorPane"), - false); - jsonEditorSplitter.onResized = (splitter: Splitter, newSize: number) => { - this.updateJsonEditorLayout(); - this._jsonEditorPane.saveState(); + if (this._copyJSONButton.isVisible) { + new Clipboard( + this._copyJSONButton.renderedElement, + { + text: (trigger) => { return JSON.stringify(this.card.toJSON(), null, 4); } + }); } - - // JSON editor pane - this._jsonEditorPane = new SidePane( - document.getElementById("jsonEditorPane"), - document.getElementById("bottomCollapsedPaneTabHost"), - "jsonEditor", - "JSON", - "selector-jsonEditor", - SidePaneOrientation.Horizontal - ) - this._jsonEditorPane.onToggled = (sender: SidePane) => { - this.updateFullLayout(); + + // Tool palette panel + let toolPaletteHost = document.createElement("div"); + toolPaletteHost.className = "acd-dockedPane"; + + this._toolPaletteToolbox = new Toolbox("toolPalette", "Card Elements"); + this._toolPaletteToolbox.content = toolPaletteHost; + + let toolPalettePanel = new SidePanel( + "toolPalettePanel", + SidePanelAlignment.Left, + document.getElementById("leftCollapsedPaneTabHost")); + toolPalettePanel.addToolbox(this._toolPaletteToolbox); + toolPalettePanel.isResizable = false; + + toolPalettePanel.attachTo(document.getElementById("toolPalettePanel")); + + // JSON editors panel + this._cardEditorToolbox = new Toolbox("cardEditor", "Card Payload Editor"); + this._cardEditorToolbox.content = document.createElement("div"); + this._cardEditorToolbox.content.style.padding = "8px"; + this._cardEditorToolbox.content.innerText = "Loading editor..."; + + this._jsonEditorsPanel = new SidePanel( + "jsonEditorPanel", + SidePanelAlignment.Bottom, + document.getElementById("bottomCollapsedPaneTabHost")); + this._jsonEditorsPanel.onResized = (sender: SidePanel) => { + this.updateJsonEditorsLayout(); } - this._jsonEditorPane.content = document.createElement("div"); - this._jsonEditorPane.content.style.padding = "8px"; - this._jsonEditorPane.content.innerText = "Loading editor..." - - // Splitter for property sheet pane - let propertySheetSplitter = new Splitter( - document.getElementById("propertySheetSplitter"), - document.getElementById("propertySheetPane"), - true); - propertySheetSplitter.minimum = 230; - propertySheetSplitter.onResized = (splitter: Splitter, newSize: number) => { - this.scheduleLayoutUpdate(); + this._jsonEditorsPanel.onToolboxResized = (sender: SidePanel) => { + this.updateJsonEditorsLayout(); + } + this._jsonEditorsPanel.onToolboxExpandedOrCollapsed = (sender: SidePanel) => { + this.updateJsonEditorsLayout(); + } + + this._jsonEditorsPanel.addToolbox(this._cardEditorToolbox); + + if (Shared.GlobalSettings.previewFeaturesEnabled) { + this._sampleDataEditorToolbox = new Toolbox("sampleDataEditor", "Sample Data Editor"); + this._sampleDataEditorToolbox.content = document.createElement("div"); + this._sampleDataEditorToolbox.content.style.padding = "8px"; + this._sampleDataEditorToolbox.content.innerText = "Loading editor..."; + this._sampleDataEditorToolbox.commands = [ + { + title: "Copy the structure of this data into the Data Structure toolbox", + iconClass: "acd-icon-dataStructure", + execute: (sender: IToolboxCommand) => { + this.dataStructure = FieldDefinition.create(JSON.parse(this.getCurrentSampleDataEditorPayload())); + } + } + ]; - this._propertySheetPane.saveState(); + this._jsonEditorsPanel.addToolbox(this._sampleDataEditorToolbox); } - // Property sheet pane - this._propertySheetPane = new SidePane( - document.getElementById("propertySheetPane"), - document.getElementById("rightCollapsedPaneTabHost"), - "propertySheet", - "Element properties", - "selector-propertySheet"); - this._propertySheetPane.onToggled = (sender: SidePane) => { - this.updateFullLayout(); - }; - this._propertySheetPane.content = document.getElementById("propertySheetHost"); - - // Splitter for tree view pane - let treeViewSplitter = new Splitter( - document.getElementById("treeViewSplitter"), - document.getElementById("treeViewPane"), - true); - treeViewSplitter.minimum = 140; - treeViewSplitter.onResized = (splitter: Splitter, newSize: number) => { + this._jsonEditorsPanel.attachTo(document.getElementById("jsonEditorPanel")); + + // Property sheet panel + let propertySheetHost = document.createElement("div"); + propertySheetHost.className = "acd-propertySheet-host"; + + this._propertySheetToolbox = new Toolbox("propertySheet", "Element Properties"); + this._propertySheetToolbox.content = propertySheetHost; + + let propertySheetPanel = new SidePanel( + "propertySheetPanel", + SidePanelAlignment.Right, + document.getElementById("rightCollapsedPaneTabHost")); + propertySheetPanel.addToolbox(this._propertySheetToolbox); + propertySheetPanel.onResized = (sender: SidePanel) => { this.scheduleLayoutUpdate(); + } + + propertySheetPanel.attachTo(document.getElementById("propertySheetPanel")); - this._treeViewPane.saveState(); + // Tree view panel + let treeViewHost = document.createElement("div"); + treeViewHost.className = "acd-treeView-host"; + + this._treeViewToolbox = new Toolbox("treeView", "Card Structure"); + this._treeViewToolbox.content = treeViewHost; + + let treeViewPanel = new SidePanel( + "treeViewPanel", + SidePanelAlignment.Right, + document.getElementById("rightCollapsedPaneTabHost")); + treeViewPanel.addToolbox(this._treeViewToolbox); + treeViewPanel.onResized = (sender: SidePanel) => { + this.scheduleLayoutUpdate(); } - // Tree view pane - this._treeViewPane = new SidePane( - document.getElementById("treeViewPane"), - document.getElementById("rightCollapsedPaneTabHost"), - "treeView", - "Visual tree view", - "selector-treeView"); - this._treeViewPane.onToggled = (sender: SidePane) => { - this.updateFullLayout(); - }; - this._treeViewPane.content = document.getElementById("treeViewHost"); + if (Shared.GlobalSettings.previewFeaturesEnabled) { + let dataExplorerHost = document.createElement("div"); + dataExplorerHost.className = "acd-treeView-host"; - this._designerHostElement = document.getElementById("designerHost") + this._dataToolbox = new Toolbox("data", "Data Structure"); + this._dataToolbox.content = dataExplorerHost; - this.recreateDesignerSurface(); + treeViewPanel.addToolbox(this._dataToolbox); + } + treeViewPanel.attachTo(document.getElementById("treeViewPanel")); - this.loadMonaco(() => { this.monacoModuleLoaded(); }); + this._designerHostElement = document.getElementById("designerHost"); window.addEventListener("pointermove", (e: PointerEvent) => { this.handlePointerMove(e); }); window.addEventListener("resize", () => { this.scheduleLayoutUpdate(); }); window.addEventListener("pointerup", (e: PointerEvent) => { this.handlePointerUp(e); }); + this._isAttached = true; + + this.recreateDesignerSurface(); + let card = new Adaptive.AdaptiveCard(); card.onImageLoaded = (image: Adaptive.Image) => { this.scheduleLayoutUpdate(); @@ -1086,7 +991,7 @@ export class CardDesigner { let card = this._undoStack[this._undoStackIndex]; - this.setJsonPayload(card); + this.setCardPayload(card); this.updateToolbar(); } @@ -1098,7 +1003,7 @@ export class CardDesigner { let card = this._undoStack[this._undoStackIndex]; - this.setJsonPayload(card); + this.setCardPayload(card); this.updateToolbar(); } @@ -1112,7 +1017,7 @@ export class CardDesigner { ] } - this.setJsonPayload(card); + this.setCardPayload(card); } setCard(payload: object) { @@ -1134,6 +1039,35 @@ export class CardDesigner { return this.designerSurface.card.toJSON(); } + get currentTargetVersion(): Shared.TargetVersion { + if (this._versionChoicePicker) { + return Shared.SupportedTargetVersions[parseInt(this._versionChoicePicker.value)]; + } + else { + return Shared.Versions.latest; + } + } + + get dataStructure(): FieldDefinition { + return this._dataStructure; + } + + set dataStructure(value: FieldDefinition) { + this._dataStructure = value; + + this.buildDataExplorer(); + } + + get sampleData(): any { + return this._sampleData; + } + + set sampleData(value: any) { + this._sampleData = value; + + this.setSampleDataPayload(value); + } + get activeHostContainer(): HostContainer { return this._activeHostContainer; } @@ -1180,20 +1114,24 @@ export class CardDesigner { return this._designerSurface; } - get treeViewPane(): SidePane { - return this._treeViewPane; + get treeViewToolbox(): Toolbox { + return this._treeViewToolbox; } - get propertySheetPane(): SidePane { - return this._propertySheetPane; + get propertySheetToolbox(): Toolbox { + return this._propertySheetToolbox; } - get jsonEditorPane(): SidePane { - return this._jsonEditorPane; + get jsonEditorToolbox(): Toolbox { + return this._cardEditorToolbox; } - get toolPalettePane(): SidePane { - return this._toolPalettePane; + get toolPaletteToolbox(): Toolbox { + return this._toolPaletteToolbox; + } + + get dataToolbox(): Toolbox { + return this._dataToolbox; } get assetPath(): string { @@ -1202,16 +1140,29 @@ export class CardDesigner { set assetPath(value: string) { this._assetPath = value; - } + } + + get customPaletteItems(): CustomPaletteItem[] { + return this._customPeletteItems; + } + + set customPaletteItems(value: CustomPaletteItem[]) { + this._customPeletteItems = value; + + this.buildPalette(); + } } export module CardDesigner { export class ToolbarCommands { static FullScreen = "__fullScreenButton"; + static OpenPayload = "__openPayload"; static HostAppPicker = "__hostAppPicker"; + static VersionPicker = "__versionPicker"; static Undo = "__undoButton"; static Redo = "__redoButton"; static NewCard = "__newCardButton"; static CopyJSON = "__copyJsonButton"; + static TogglePreview = "__togglePreviewButton"; } } diff --git a/source/nodejs/adaptivecards-designer/src/catalogue.ts b/source/nodejs/adaptivecards-designer/src/catalogue.ts new file mode 100644 index 0000000000..bce8ad026e --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/catalogue.ts @@ -0,0 +1,101 @@ +import * as Adaptive from "adaptivecards"; +import { Downloader } from "./downloader"; + +export class CatalogueEntry { + private _cardPayload: string; + private _cardPayloadDownloaded: boolean = false; + private _sampleData: string; + private _sampleDataDownloaded: boolean = false; + + private downloadCompleted() { + if (this._cardPayloadDownloaded && this._sampleDataDownloaded && this.onDownloaded) { + this.onDownloaded(this); + } + } + + sampleDataUrl?: string; + + onDownloaded: (sender: CatalogueEntry) => void = null; + + constructor(readonly displayName: string, readonly cardPayloadUrl: string, sampleDataUrl?: string) { + this.sampleDataUrl = sampleDataUrl; + } + + download() { + let payloadDownloader = new Downloader(this.cardPayloadUrl); + payloadDownloader.onSuccess = () => { + this._cardPayload = payloadDownloader.data; + this._cardPayloadDownloaded = true; + + this.downloadCompleted(); + } + payloadDownloader.onError = () => { + this._cardPayloadDownloaded = true; + + this.downloadCompleted(); + } + payloadDownloader.download(); + + if (!Adaptive.isNullOrEmpty(this.sampleDataUrl)) { + let sampleDataDownloader = new Downloader(this.sampleDataUrl); + sampleDataDownloader.onSuccess = () => { + this._sampleData = sampleDataDownloader.data; + this._sampleDataDownloaded = true; + + this.downloadCompleted(); + } + sampleDataDownloader.onError = () => { + this._sampleDataDownloaded = true; + + this.downloadCompleted(); + } + sampleDataDownloader.download(); + } + else { + this._sampleDataDownloaded = true; + + this.downloadCompleted(); + } + } + + get cardPayload(): string { + return this._cardPayload; + } + + get sampleData(): string { + return this._sampleData; + } +} + +export function parseCatalogue(input: any): CatalogueEntry[] { + let entries: any[] = null; + + if (Array.isArray(input)) { + entries = input; + } + else { + entries = Array.isArray(input["entries"]) ? input["entried"] : null; + } + + let result: CatalogueEntry[] = []; + + if (entries != null) { + for (let entry of entries) { + if (typeof entry === "object") { + let displayName = Adaptive.getStringValue(entry["displayName"]); + let cardPayloadUrl = Adaptive.getStringValue(entry["cardPayloadUrl"]); + + if (!Adaptive.isNullOrEmpty(displayName) && !Adaptive.isNullOrEmpty(cardPayloadUrl)) { + + result.push( + new CatalogueEntry( + displayName, + cardPayloadUrl, + Adaptive.getStringValue(entry["dataSampleUrl"]))); + } + } + } + } + + return result; +} diff --git a/source/nodejs/adaptivecards-designer/src/constants.ts b/source/nodejs/adaptivecards-designer/src/constants.ts index 35e5fca7ce..2a1f4988fa 100644 --- a/source/nodejs/adaptivecards-designer/src/constants.ts +++ b/source/nodejs/adaptivecards-designer/src/constants.ts @@ -46,121 +46,111 @@ export const otherTestPayload: string = `{ }`; export const defaultPayload: string = `{ - "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", - "type": "AdaptiveCard", - "version": "1.0", - "body": [ - { - "type": "Container", - "items": [ - { - "type": "TextBlock", - "text": "Publish Adaptive Card schema", - "weight": "bolder", - "size": "medium" - }, - { - "type": "ColumnSet", - "columns": [ - { - "type": "Column", - "width": "auto", - "items": [ - { - "type": "Image", - "url": "https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg", - "size": "small", - "style": "person" - } - ] - }, - { - "type": "Column", - "width": "stretch", - "items": [ - { - "type": "TextBlock", - "text": "Matt Hidinger", - "weight": "bolder", - "wrap": true - }, - { - "type": "TextBlock", - "spacing": "none", - "text": "Created {{DATE(2017-02-14T06:08:39Z,SHORT)}}", - "isSubtle": true, - "wrap": true - } - ] - } - ] - } - ] - }, - { - "type": "Container", - "items": [ - { - "type": "TextBlock", - "text": "Now that we have defined the main rules and features of the format, we need to produce a schema and publish it to GitHub. The schema will be the starting point of our reference documentation.", - "wrap": true - }, - { - "type": "FactSet", - "facts": [ - { - "title": "Board:", - "value": "Adaptive Card" - }, - { - "title": "List:", - "value": "Backlog" - }, - { - "title": "Assigned to:", - "value": "Matt Hidinger" - }, - { - "title": "Due date:", - "value": "Not set" - } - ] - } - ] - } - ], - "actions": [ - { - "type": "Action.ShowCard", - "title": "Set due date", - "card": { - "type": "AdaptiveCard", - "body": [ - { - "type": "Input.Date", - "id": "dueDate", - "title": "Select due date" - }, - { - "type": "Input.Text", - "id": "comment", - "isMultiline": true, - "placeholder": "Add a comment" - } - ], - "actions": [ - { - "type": "Action.OpenUrl", - "title": "OK", - "url": "http://adaptivecards.io" - } - ] - } - }, - { - "type": "Action.OpenUrl", - "title": "View", - "url": "http://adaptivecards.io" - } - ] + "type": "AdaptiveCard", + "body": [ + { + "type": "TextBlock", + "size": "Medium", + "weight": "Bolder", + "text": "Publish Adaptive Card schema" + }, + { + "type": "ColumnSet", + "columns": [ + { + "type": "Column", + "items": [ + { + "type": "Image", + "style": "Person", + "url": "https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg", + "size": "Small" + } + ], + "width": "auto" + }, + { + "type": "Column", + "items": [ + { + "type": "TextBlock", + "weight": "Bolder", + "text": "Matt Hidinger", + "wrap": true + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Created {{DATE(2017-02-14T06:08:39Z,SHORT)}}", + "isSubtle": true, + "wrap": true + } + ], + "width": "stretch" + } + ] + }, + { + "type": "TextBlock", + "text": "Now that we have defined the main rules and features of the format, we need to produce a schema and publish it to GitHub. The schema will be the starting point of our reference documentation.", + "wrap": true + }, + { + "type": "FactSet", + "facts": [ + { + "title": "Board:", + "value": "Adaptive Card" + }, + { + "title": "List:", + "value": "Backlog" + }, + { + "title": "Assigned to:", + "value": "Matt Hidinger" + }, + { + "title": "Due date:", + "value": "Not set" + } + ] + } + ], + "actions": [ + { + "type": "Action.ShowCard", + "title": "Set due date", + "card": { + "type": "AdaptiveCard", + "body": [ + { + "type": "Input.Date", + "id": "dueDate" + }, + { + "type": "Input.Text", + "id": "comment", + "placeholder": "Add a comment", + "isMultiline": true + } + ], + "actions": [ + { + "type": "Action.OpenUrl", + "title": "OK", + "url": "http://adaptivecards.io" + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json" + } + }, + { + "type": "Action.OpenUrl", + "title": "View", + "url": "http://adaptivecards.io" + } + ], + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.0" }`; diff --git a/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.ts b/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.ts index adf766deef..0060b229f2 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/bf-image/bf-image-container.ts @@ -1,19 +1,19 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/render-to-image.json"; -export class BotFrameworkContainer extends Designer.HostContainer { - public renderTo(hostElement: HTMLElement) { - this.cardHost.classList.add("bf-images-card"); +export class BotFrameworkContainer extends HostContainer { + public renderTo(hostElement: HTMLElement) { + this.cardHost.classList.add("bf-images-card"); - let frame = document.createElement("div"); - frame.className = "bf-images-frame"; - frame.appendChild(this.cardHost); + let frame = document.createElement("div"); + frame.className = "bf-images-frame"; + frame.appendChild(this.cardHost); - hostElement.appendChild(frame); - } + hostElement.appendChild(frame); + } public getHostConfig(): Adaptive.HostConfig { return new Adaptive.HostConfig(hostConfig); diff --git a/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container.ts b/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container.ts index 3091994eb6..67adfd41fc 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/cortana/cortana-container.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/cortana-skills.json"; -export class CortanaContainer extends Designer.HostContainer { +export class CortanaContainer extends HostContainer { public renderTo(hostElement: HTMLElement) { this.cardHost.classList.add("cortana-card"); diff --git a/source/nodejs/adaptivecards-designer/src/containers/host-container.ts b/source/nodejs/adaptivecards-designer/src/containers/host-container.ts index 3ba59ade87..da9915c9a5 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/host-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/host-container.ts @@ -14,6 +14,7 @@ export abstract class HostContainer { this.styleSheet = styleSheet; this._cardHost = document.createElement("div"); + this._cardHost.className = "cardHost"; } abstract renderTo(hostElement: HTMLElement); diff --git a/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.ts b/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.ts index 71d85a45bc..dd952d9a73 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/notifications/toast-container.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/windows-notification.json"; -export class ToastContainer extends Designer.HostContainer { +export class ToastContainer extends HostContainer { public renderTo(hostElement: HTMLElement) { this.cardHost.classList.add("toast-card"); diff --git a/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.ts b/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.ts index ec81064c41..af5a97a073 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/outlook/outlook-container.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/outlook-desktop.json"; -export class OutlookContainer extends Designer.HostContainer { +export class OutlookContainer extends HostContainer { public renderTo(hostElement: HTMLElement) { hostElement.classList.add("outlook-frame"); hostElement.appendChild(this.cardHost); diff --git a/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.ts b/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.ts index f50ebcf572..c8af98dad9 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/skype/skype-container.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/skype.json"; -export class SkypeContainer extends Designer.HostContainer { +export class SkypeContainer extends HostContainer { public renderTo(hostElement: HTMLElement) { this.cardHost.classList.add("skype-card"); diff --git a/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container.ts b/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container.ts index a62bd73bdd..89edb090eb 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/teams/teams-container.ts @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfigLight from "../../hostConfigs/microsoft-teams-light.json"; import * as hostConfigDark from "../../hostConfigs/microsoft-teams-dark.json"; -export abstract class BaseTeamsContainer extends Designer.HostContainer { +export abstract class BaseTeamsContainer extends HostContainer { public renderTo(hostElement: HTMLElement) { var outerFrame = document.createElement("div"); outerFrame.className = "teams-frame"; diff --git a/source/nodejs/adaptivecards-designer/src/containers/timeline/timeline-container.ts b/source/nodejs/adaptivecards-designer/src/containers/timeline/timeline-container.ts index 72b4003d91..7d449166bd 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/timeline/timeline-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/timeline/timeline-container.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/windows-timeline.json"; -export class TimelineContainer extends Designer.HostContainer { +export class TimelineContainer extends HostContainer { public initialize() { Adaptive.AdaptiveCard.elementTypeRegistry.reset(); Adaptive.AdaptiveCard.actionTypeRegistry.reset(); diff --git a/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.ts b/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.ts index 58d4780531..fdf85d404d 100644 --- a/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.ts +++ b/source/nodejs/adaptivecards-designer/src/containers/webchat/webchat-container.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import * as Adaptive from "adaptivecards"; -import * as Designer from "../../adaptivecards-designer"; +import { HostContainer } from "../host-container"; import * as hostConfig from "../../hostConfigs/webchat.json"; -export class WebChatContainer extends Designer.HostContainer { +export class WebChatContainer extends HostContainer { public renderTo(hostElement: HTMLElement) { this.cardHost.classList.add("webChatOuterContainer"); diff --git a/source/nodejs/adaptivecards-designer/src/data-treeitem.ts b/source/nodejs/adaptivecards-designer/src/data-treeitem.ts new file mode 100644 index 0000000000..1d35078505 --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/data-treeitem.ts @@ -0,0 +1,68 @@ +import { BaseTreeItem } from "./base-tree-item"; +import * as Data from "./data"; + +export class DataTreeItem extends BaseTreeItem { + private _children: Array = null; + + private buildChildList() { + if (!this._children) { + this._children = []; + + let properties = this.field.children; + + if (properties) { + let keys = Object.keys(properties); + + for (let key of keys) { + this._children.push(new DataTreeItem(properties[key])); + } + } + } + } + + protected getLabelText(): string { + return this.field.name; + } + + protected getAdditionalText(): string { + return this.field.typeName; + } + + protected getAdditionalTextClass(): string { + return "acd-data-tree-item-additionalText"; + } + + readonly field: Data.FieldDefinition; + + constructor(field: Data.FieldDefinition) { + super(); + + this.field = field; + + this._level = 0; + + let currentField = field; + + while (currentField) { + this._level++; + + currentField = currentField.parent; + } + } + + isDraggable(): boolean { + return true; + } + + getChildCount(): number { + this.buildChildList(); + + return this._children.length; + } + + getChildAt(index: number): DataTreeItem { + this.buildChildList(); + + return this._children[index]; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/data.ts b/source/nodejs/adaptivecards-designer/src/data.ts new file mode 100644 index 0000000000..85aad98182 --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/data.ts @@ -0,0 +1,170 @@ +export enum ValueKind { String, Boolean, Number } + +export abstract class DataType { + static create(parent: FieldDefinition, value: any): DataType { + if (typeof value === "string") { + return new ValueData(parent, ValueKind.String); + } + else if (typeof value === "boolean") { + return new ValueData(parent, ValueKind.Boolean); + } + else if (typeof value === "number") { + return new ValueData(parent, ValueKind.Number); + } + else if (typeof value === "object") { + if (Array.isArray(value)) { + return ArrayData.create(parent, value); + } + else { + return ObjectData.create(parent, value); + } + } + else { + throw new Error("Unsupported data type: " + typeof value); + } + } + + constructor(readonly owner: FieldDefinition) {} + + getChildFields(): FieldDefinition[] { + return null; + } + + qualifyFieldName(fieldName: string, fieldIsLeaf: boolean) { + return fieldName; + } + + abstract get typeName(): string; + + get isCollection(): boolean { + return false; + } +} + +export class ValueData extends DataType { + constructor(readonly owner: FieldDefinition, readonly valueKind: ValueKind) { + super(owner); + } + + get typeName(): string { + return ValueKind[this.valueKind]; + } +} + +export class ArrayData extends DataType { + static create(parent: FieldDefinition, input: Object): ArrayData { + if (!Array.isArray(input)) { + throw new Error("Input is not an array."); + } + + let result = new ArrayData(parent); + + if (input.length > 0) { + result.dataType = DataType.create(parent, input[0]); + } + + return result; + } + + dataType: DataType = undefined; + + constructor(readonly owner: FieldDefinition) { + super(owner); + } + + getChildFields(): FieldDefinition[] { + return this.dataType.getChildFields(); + } + + qualifyFieldName(fieldName: string, fieldIsLeaf: boolean) { + if (!fieldIsLeaf) { + return fieldName + "[0]"; + } + else { + return super.qualifyFieldName(fieldName, fieldIsLeaf); + } + } + + get isCollection(): boolean { + return true; + } + + get typeName(): string { + return "Array"; + } +} + +export class ObjectData extends DataType { + static create(parent: FieldDefinition, input: Object): ObjectData { + let result = new ObjectData(parent); + + for (let key of Object.keys(input)) { + let field = new FieldDefinition(parent); + field.dataType = DataType.create(field, input[key]); + field.name = key; + + result.fields.push(field); + } + + return result; + } + + readonly fields: FieldDefinition[] = []; + + constructor(readonly owner: FieldDefinition) { + super(owner); + } + + getChildFields(): FieldDefinition[] { + return this.fields; + } + + get typeName(): string { + return "Object"; + } +} + +export class FieldDefinition { + static create(input: any): FieldDefinition { + let field = new FieldDefinition(null); + field.name = "$root"; + field.dataType = DataType.create(field, input); + + return field; + } + + name: string; + displayName: string; + dataType: DataType; + + constructor(readonly parent: FieldDefinition) {} + + getPath(asLeaf: boolean = true): string { + let result: string = this.qualifiedName(asLeaf); + let currentField = this.parent; + + while (currentField) { + result = currentField.qualifiedName(false) + "." + result; + + currentField = currentField.parent; + } + + return result; + } + + qualifiedName(asLeaf: boolean): string { + return this.dataType.qualifyFieldName(this.name, asLeaf); + } + + get children(): FieldDefinition[] { + return this.dataType.getChildFields(); + } + + get isCollection(): boolean { + return this.dataType.isCollection; + } + + get typeName(): string { + return this.dataType.typeName; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/designer-peer-treeitem.ts b/source/nodejs/adaptivecards-designer/src/designer-peer-treeitem.ts new file mode 100644 index 0000000000..31d92ec4cd --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/designer-peer-treeitem.ts @@ -0,0 +1,63 @@ +import { BaseTreeItem } from "./base-tree-item"; +import { DesignerPeer } from "./designer-peers"; + +export class DesignerPeerTreeItem extends BaseTreeItem { + private computeLevel() { + this._level = 0; + + let peer = this.owner; + + while (peer) { + this._level++; + + peer = peer.parent; + } + + for (let i = 0; i < this.getChildCount(); i++) { + (this.getChildAt(i) as DesignerPeerTreeItem).computeLevel(); + } + } + + protected getIconClass(): string { + return this.owner.registration.iconClass; + } + + protected getLabelText(): string { + return this.owner.getCardObject().getJsonTypeName(); + } + + protected getAdditionalText(): string { + return this.owner.getTreeItemText(); + } + + protected selected() { + this.owner.isSelected = true; + } + + readonly owner: DesignerPeer; + + constructor(owner: DesignerPeer) { + super(); + + this.owner = owner; + this.owner.onParentChanged = (sender: DesignerPeer) => { + this.computeLevel(); + } + + this.computeLevel(); + } + + getChildCount(): number { + return this.owner.getChildCount(); + } + + getChildAt(index: number): BaseTreeItem { + return this.owner.getChildAt(index).treeItem; + } + + updateLayout() { + super.updateLayout(); + + this.isSelected = this.owner.isSelected; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/designer-peers.ts b/source/nodejs/adaptivecards-designer/src/designer-peers.ts index ab1a6b6d1f..be59399989 100644 --- a/source/nodejs/adaptivecards-designer/src/designer-peers.ts +++ b/source/nodejs/adaptivecards-designer/src/designer-peers.ts @@ -5,220 +5,147 @@ import * as Controls from "adaptivecards-controls"; import { DraggableElement } from "./draggable-element"; import { PeerCommand } from "./peer-command"; import { CardDesignerSurface } from "./card-designer-surface"; -import { TreeItem } from "./treeitem"; +import { DesignerPeerTreeItem } from "./designer-peer-treeitem"; import { Rect, IPoint } from "./miscellaneous"; +import { TargetVersion, Versions, isVersionLessOrEqual, GlobalSettings } from "./shared"; -interface ILabelAndInput { - label: Adaptive.TextBlock; - input: TInput; -} - -function addLabelAndInput( - container: Adaptive.Container, - label: string, - inputType: { new(): TInput }, - separator: boolean = false): ILabelAndInput { +export abstract class DesignerPeerInplaceEditor { + onClose: (applyChanges: boolean) => void; - var leftColumn = new Adaptive.Column(); - leftColumn.width = new Adaptive.SizeAndUnit(100, Adaptive.SizeUnit.Pixel); - leftColumn.verticalContentAlignment = Adaptive.VerticalAlignment.Center; + abstract initialize(); + abstract applyChanges(); + abstract render(): HTMLElement; +} - var rightColumn = new Adaptive.Column(); - rightColumn.width = "stretch"; - rightColumn.verticalContentAlignment = Adaptive.VerticalAlignment.Center; +export abstract class CardElementPeerInplaceEditor extends DesignerPeerInplaceEditor { + readonly cardElement: TCardElement; - var columnSet = new Adaptive.ColumnSet(); + constructor(cardElement: TCardElement) { + super(); - if (separator) { - columnSet.spacing = Adaptive.Spacing.Large; - columnSet.separator = true; - } - else { - columnSet.spacing = Adaptive.Spacing.Small; + this.cardElement = cardElement; } +} - columnSet.addColumn(leftColumn); - columnSet.addColumn(rightColumn); +export class DesignerPeerRegistrationBase { + readonly category: string; + readonly iconClass: string; - var result = { - label: new Adaptive.TextBlock(), - input: new inputType() - }; - result.label.horizontalAlignment = Adaptive.HorizontalAlignment.Right; - result.label.text = label; - result.label.wrap = true; - /* - result.label.selectAction = new Adaptive.SubmitAction(); - result.label.selectAction.onExecute = (sender: Adaptive.Action) => { - alert("Clicked: " + label); + constructor(category: string, iconClass: string = null) { + this.category = category; + this.iconClass = iconClass; } - */ - - leftColumn.addItem(result.label); - rightColumn.addItem(result.input); - - container.addItem(columnSet); - - return result; } -function addHeader(container: Adaptive.Container, text: string): Adaptive.CardElement { - let header = new Adaptive.TextBlock(); - header.text = "**" + text + "**"; - - container.addItem(header); +export class DesignerPeerRegistration extends DesignerPeerRegistrationBase{ + readonly sourceType: TSource; - return header; -} + peerType: TPeer; -interface INameValuePair { - name: string; - value: string; -} + constructor(sourceType: TSource, peerType: TPeer, category: string, iconClass: string = null) { + super(category, iconClass); -class NameValuePairEditor { - private changed(refreshPropertySheet: boolean = false) { - if (this.onChanged) { - this.onChanged(this, refreshPropertySheet); - } + this.sourceType = sourceType; + this.peerType = peerType; } +} - onChanged: (sender: NameValuePairEditor, refreshPropertySheet: boolean) => void; - - nameValuePairs: Array = []; - title: string = "Name/value pairs"; - messageIfEmpty = "This collection is empty."; - addButtonTitle: string = "Add a new pair"; - nameInputTitle: string = "Name"; - valueInputTitle: string = "Value"; - - render(): Adaptive.Container { - let result = new Adaptive.Container(); +export class PropertySheetCategory { + static readonly DefaultCategory = "__defaultCategory"; + static readonly LayoutCategory = "Layout"; + static readonly StyleCategory = "Style"; - let titleTextBlock = new Adaptive.TextBlock(); - titleTextBlock.text = "**" + this.title + "**"; + private _entries: PropertySheetEntry[] = []; - result.addItem(titleTextBlock); + constructor(readonly name: string) { } - if (this.nameValuePairs.length == 0) { - let messageTextBlock = new Adaptive.TextBlock(); - messageTextBlock.spacing = Adaptive.Spacing.Small; - messageTextBlock.text = this.messageIfEmpty; + render(card: Adaptive.AdaptiveCard, context: PropertySheetContext) { + let entriesToRender: PropertySheetEntry[] = []; - result.addItem(messageTextBlock); + for (let entry of this._entries) { + if (isVersionLessOrEqual(entry.targetVersion, context.targetVersion)) { + entriesToRender.push(entry); + } } - else { - for (let i = 0; i < this.nameValuePairs.length; i++) { - let textInput = new Adaptive.TextInput(); - textInput.placeholder = this.nameInputTitle; - textInput.defaultValue = this.nameValuePairs[i].name; - textInput.onValueChanged = (sender) => { - this.nameValuePairs[i].name = sender.value; - - this.changed(); - }; - - let nameColumn = new Adaptive.Column("stretch"); - nameColumn.addItem(textInput); - - textInput = new Adaptive.TextInput(); - textInput.placeholder = this.valueInputTitle; - textInput.defaultValue = this.nameValuePairs[i].value; - textInput.onValueChanged = (sender) => { - this.nameValuePairs[i].value = sender.value; - - this.changed(); - }; - - let valueColumn = new Adaptive.Column("stretch"); - valueColumn.spacing = Adaptive.Spacing.Small; - valueColumn.addItem(textInput); - let removeAction = new Adaptive.SubmitAction(); - removeAction.title = "X"; - removeAction.onExecute = (sender) => { - this.nameValuePairs.splice(i, 1); - - this.changed(true); + if (entriesToRender.length > 0) { + let header = new Adaptive.TextBlock(); + header.separator = true; + header.text = "**" + (this.name === PropertySheetCategory.DefaultCategory ? context.peer.getCardObject().getJsonTypeName() : this.name) + "**"; + + card.addItem(header); + + for (let entry of entriesToRender) { + if (isVersionLessOrEqual(entry.targetVersion, context.targetVersion)) { + card.addItem(entry.render(context)); } - - let actionSet = new Adaptive.ActionSet(); - actionSet.addAction(removeAction); - - let removeColumn = new Adaptive.Column("auto"); - removeColumn.spacing = Adaptive.Spacing.Small; - removeColumn.addItem(actionSet); - - let columnSet = new Adaptive.ColumnSet(); - columnSet.spacing = Adaptive.Spacing.Small; - columnSet.addColumn(nameColumn); - columnSet.addColumn(valueColumn); - columnSet.addColumn(removeColumn); - - result.addItem(columnSet); } } + } - let addAction = new Adaptive.SubmitAction(); - addAction.title = this.addButtonTitle; - addAction.onExecute = (sender) => { - this.nameValuePairs.push({ "name": "", "value": "" }); - - this.changed(true); - } + add(...entries: PropertySheetEntry[]) { + this._entries = this._entries.concat(entries); + } - let actionSet = new Adaptive.ActionSet(); - actionSet.spacing = Adaptive.Spacing.Small; - actionSet.addAction(addAction); + remove(...entries: PropertySheetEntry[]) { + for (let entry of entries) { + let index: number; - result.addItem(actionSet); + do { + let index = this._entries.indexOf(entry); - return result; + if (index >= 0) { + this._entries.splice(index, 1); + } + } while (index >= 0); + } } -} -abstract class DesignerPeerInplaceEditor { - onClose: (applyChanges: boolean) => void; + getEntryAt(index: number): PropertySheetEntry { + return this._entries[index]; + } - abstract initialize(); - abstract applyChanges(); - abstract render(): HTMLElement; + get length(): number { + return this._entries.length; + } } -abstract class CardElementPeerInplaceEditor extends DesignerPeerInplaceEditor { - readonly cardElement: TCardElement; - - constructor(cardElement: TCardElement) { - super(); +export class PropertySheet { + private _categories: { [key: string]: PropertySheetCategory } = {}; - this.cardElement = cardElement; + constructor() { + this._categories[PropertySheetCategory.DefaultCategory] = new PropertySheetCategory(PropertySheetCategory.DefaultCategory); + this._categories[PropertySheetCategory.LayoutCategory] = new PropertySheetCategory(PropertySheetCategory.LayoutCategory); + this._categories[PropertySheetCategory.StyleCategory] = new PropertySheetCategory(PropertySheetCategory.StyleCategory); } -} -export class DesignerPeerRegistrationBase { - readonly category: string; - readonly iconClass: string; + add(categoryName: string, ...entries: PropertySheetEntry[]) { + let category = this._categories[categoryName]; - constructor(category: string, iconClass: string = null) { - this.category = category; - this.iconClass = iconClass; - } -} + if (!category) { + category = new PropertySheetCategory(categoryName); -export class DesignerPeerRegistration extends DesignerPeerRegistrationBase{ - readonly sourceType: TSource; + this._categories[categoryName] = category; + } - peerType: TPeer; + category.add(...entries); + } - constructor(sourceType: TSource, peerType: TPeer, category: string, iconClass: string = null) { - super(category, iconClass); + remove(...entries: PropertySheetEntry[]) { + for (let categoryName of Object.keys(this._categories)) { + this._categories[categoryName].remove(...entries); + } + } - this.sourceType = sourceType; - this.peerType = peerType; + render(card: Adaptive.AdaptiveCard, context: PropertySheetContext) { + for (let categoryName of Object.keys(this._categories)) { + this._categories[categoryName].render(card, context); + } } } export abstract class DesignerPeer extends DraggableElement { + private _parent: DesignerPeer; private _children: Array = []; private _isSelected: boolean = false; private _inplaceEditorOverlay: HTMLElement; @@ -285,6 +212,12 @@ export abstract class DesignerPeer extends DraggableElement { return false; } + protected click(e: MouseEvent) { + super.click(e); + + this.isSelected = true; + } + protected doubleClick(e: MouseEvent) { super.doubleClick(e); @@ -299,12 +232,6 @@ export abstract class DesignerPeer extends DraggableElement { return null; } - protected pointerDown(e: PointerEvent) { - super.pointerDown(e); - - this.isSelected = true; - } - protected internalAddCommands(commands: Array) { // Do nothing in base implementation } @@ -352,12 +279,6 @@ export abstract class DesignerPeer extends DraggableElement { } } - protected changed(updatePropertySheet: boolean) { - if (this.onChanged) { - this.onChanged(this, updatePropertySheet); - } - } - protected peerRemoved(peer: DesignerPeer) { if (this.onPeerRemoved) { this.onPeerRemoved(peer); @@ -379,49 +300,55 @@ export abstract class DesignerPeer extends DraggableElement { return null; } - protected getExcludedProperties(): Array { - return []; + protected internalGetTreeItemText(): string { + return null; } protected abstract internalRemove(): boolean; readonly registration: DesignerPeerRegistrationBase; readonly designerSurface: CardDesignerSurface; - readonly treeItem: TreeItem; - - parent: DesignerPeer; + readonly treeItem: DesignerPeerTreeItem; + onParentChanged: (sender: DesignerPeer) => void; onSelectedChanged: (sender: DesignerPeer) => void; onChanged: (sender: DesignerPeer, updatePropertySheet: boolean) => void; onPeerRemoved: (sender: DesignerPeer) => void; onPeerAdded: (sender: DesignerPeer, newPeer: DesignerPeer) => void; abstract getCardObject(): Adaptive.CardObject; - abstract internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean); - constructor(designerSurface: CardDesignerSurface, registration: DesignerPeerRegistrationBase) { + constructor(parent: DesignerPeer, designerSurface: CardDesignerSurface, registration: DesignerPeerRegistrationBase) { super(); + this._parent = parent; + if (!registration) { alert((this).constructor.name); } this.registration = registration; this.designerSurface = designerSurface; - this.treeItem = new TreeItem(this); + this.treeItem = new DesignerPeerTreeItem(this); } abstract getBoundingRect(): Rect; abstract getCardObjectBoundingRect(): Rect; - protected internalGetTreeItemText(): string { - return null; + changed(updatePropertySheet: boolean) { + if (this.onChanged) { + this.onChanged(this, updatePropertySheet); + } } getTreeItemText(): string { return this.internalGetTreeItemText(); } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + // Do nothing in base implementation + } + canDrop(peer: DesignerPeer): boolean { return false; } @@ -524,15 +451,19 @@ export abstract class DesignerPeer extends DraggableElement { } } - buildPropertySheetCard(): Adaptive.AdaptiveCard { - let result = new Adaptive.AdaptiveCard(); - result.padding = new Adaptive.PaddingDefinition( + buildPropertySheetCard(targetVersion: TargetVersion): Adaptive.AdaptiveCard { + let card = new Adaptive.AdaptiveCard(); + card.padding = new Adaptive.PaddingDefinition( Adaptive.Spacing.Small, Adaptive.Spacing.Small, Adaptive.Spacing.Small, Adaptive.Spacing.Small); - this.internalAddPropertySheetEntries(result, true); + let propertySheet = new PropertySheet(); + + this.populatePropertySheet(propertySheet); + + propertySheet.render(card, new PropertySheetContext(targetVersion, this)); let actionSet = new Adaptive.ActionSet(); let commands = this.getCommands(true); @@ -549,9 +480,9 @@ export abstract class DesignerPeer extends DraggableElement { actionSet.separator = true; - result.addItem(actionSet); + card.addItem(actionSet); - return result; + return card; } scrollIntoView() { @@ -564,6 +495,18 @@ export abstract class DesignerPeer extends DraggableElement { } } + get parent(): DesignerPeer { + return this._parent; + } + + set parent(value: DesignerPeer) { + this._parent = value; + + if (this.onParentChanged) { + this.onParentChanged(this); + } + } + get isSelected(): boolean { return this._isSelected; } @@ -582,355 +525,762 @@ export abstract class DesignerPeer extends DraggableElement { } } -export class ActionPeer extends DesignerPeer { - protected _action: Adaptive.Action; - - protected doubleClick(e: MouseEvent) { - super.doubleClick(e); +export class PropertySheetContext { + private _target: object = undefined; - this.action.renderedElement.click(); + constructor(readonly targetVersion: TargetVersion, readonly peer: CardObjectPeer, target: object = undefined) { + this._target = target; } - protected internalRemove(): boolean { - return this.action.remove(); + get target(): object { + return this._target != undefined ? this._target : this.peer.getCardObject(); } +} - constructor(designerSurface: CardDesignerSurface, registration: DesignerPeerRegistrationBase, action: Adaptive.Action) { - super(designerSurface, registration); +export abstract class PropertySheetEntry { + abstract render(context: PropertySheetContext): Adaptive.CardElement; - this._action = action; - } + constructor(readonly targetVersion: TargetVersion) { } +} - protected internalGetTreeItemText(): string { - if (this.action.title && this.action.title != "") { - return this.action.title; - } - else { - return super.internalGetTreeItemText(); +export class CustomPropertySheetEntry extends PropertySheetEntry { + render(context: PropertySheetContext): Adaptive.CardElement { + if (this.onRender) { + return this.onRender(context); } } - getCardObject(): Adaptive.CardObject { - return this.action; + constructor(readonly targetVersion: TargetVersion, readonly onRender: (context: PropertySheetContext) => Adaptive.CardElement) { + super(targetVersion); } +} - isDraggable(): boolean { - return false; - } +export abstract class SingleInputPropertyEditor extends PropertySheetEntry { + protected abstract createInput(context: PropertySheetContext): Adaptive.Input; - getBoundingRect(): Rect { - let designSurfaceOffset = this.designerSurface.getDesignerSurfaceOffset(); - let actionBoundingRect = this.action.renderedElement.getBoundingClientRect(); + protected getPropertyValue(context: PropertySheetContext): any { + return context.target[this.propertyName]; + } - return new Rect( - actionBoundingRect.top - designSurfaceOffset.y, - actionBoundingRect.right - designSurfaceOffset.x, - actionBoundingRect.bottom - designSurfaceOffset.y, - actionBoundingRect.left - designSurfaceOffset.x - ); + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.target[this.propertyName] = value; } - getCardObjectBoundingRect(): Rect { - let actionBoundingRect = this.action.renderedElement.getBoundingClientRect(); + render(context: PropertySheetContext): Adaptive.CardElement { + let leftColumn = new Adaptive.Column(); + leftColumn.width = new Adaptive.SizeAndUnit(100, Adaptive.SizeUnit.Pixel); + leftColumn.verticalContentAlignment = Adaptive.VerticalAlignment.Center; + + let rightColumn = new Adaptive.Column(); + rightColumn.width = "stretch"; + rightColumn.verticalContentAlignment = Adaptive.VerticalAlignment.Center; + + let columnSet = new Adaptive.ColumnSet(); + + columnSet.spacing = Adaptive.Spacing.Small; + + columnSet.addColumn(leftColumn); + columnSet.addColumn(rightColumn); - return new Rect( - actionBoundingRect.top, - actionBoundingRect.right, - actionBoundingRect.bottom, - actionBoundingRect.left - ); - } + let label = new Adaptive.TextBlock(); + label.horizontalAlignment = Adaptive.HorizontalAlignment.Right; + label.wrap = true; + label.text = this.label; - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - if (includeHeader) { - let actionType = new Adaptive.TextBlock(); - actionType.text = "**" + this.action.getJsonTypeName() + "**"; + let input = this.createInput(context); + input.defaultValue = this.getPropertyValue(context); + input.onValueChanged = () => { + this.setPropertyValue(context, input.value); - card.addItem(actionType); + context.peer.changed(this.causesPropertySheetRefresh); } + + leftColumn.addItem(label); + rightColumn.addItem(input); - let id = addLabelAndInput(card, "Id:", Adaptive.TextInput); - id.input.defaultValue = this.action.id; - id.input.placeholder = "(not set)"; - id.input.onValueChanged = () => { - this.action.id = id.input.value; + return columnSet; + } - this.changed(false); - } + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion); + } +} - let title = addLabelAndInput(card, "Title:", Adaptive.TextInput); - title.input.defaultValue = this.action.title; - title.input.placeholder = "(not set)"; - title.input.onValueChanged = () => { - this.action.title = title.input.value; +export class StringPropertyEditor extends SingleInputPropertyEditor { + protected createInput(context: PropertySheetContext): Adaptive.Input { + let input = new Adaptive.TextInput(); + input.placeholder = "(not set)"; + input.isMultiline = this.isMultiline; - this.changed(false); - } + return input; + } - let style = addLabelAndInput(card, "Style:", Adaptive.ChoiceSetInput); - style.input.isCompact = true; - style.input.choices.push(new Adaptive.Choice("Default", Adaptive.ActionStyle.Default)); - style.input.choices.push(new Adaptive.Choice("Positive", Adaptive.ActionStyle.Positive)); - style.input.choices.push(new Adaptive.Choice("Destructive", Adaptive.ActionStyle.Destructive)); - style.input.defaultValue = this.action.style; - style.input.onValueChanged = () => { - this.action.style = style.input.value; + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly isMultiline: boolean = false, + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion, propertyName, label, causesPropertySheetRefresh); + } +} - this.changed(false); +export class NumberPropertyEditor extends SingleInputPropertyEditor { + protected setPropertyValue(context: PropertySheetContext, value: string) { + try { + context.target[this.propertyName] = parseFloat(value); + } + catch { + context.target[this.propertyName] = this.defaultValue; } + } - let iconUrl = addLabelAndInput(card, "Icon URL:", Adaptive.TextInput); - iconUrl.input.defaultValue = this.action.iconUrl; - iconUrl.input.placeholder = "(not set)"; - iconUrl.input.onValueChanged = () => { - this.action.iconUrl = iconUrl.input.value; + protected createInput(context: PropertySheetContext): Adaptive.Input { + let input = new Adaptive.NumberInput(); + input.placeholder = "(not set)"; - this.changed(false); - } + return input; } - get action(): Adaptive.Action { - return this._action; + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly defaultValue: number | undefined = undefined, + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion, propertyName, label, causesPropertySheetRefresh); } } -export abstract class TypedActionPeer extends ActionPeer { - constructor(designerSurface: CardDesignerSurface, registration: DesignerPeerRegistrationBase, action: TAction) { - super(designerSurface, registration, action); +export class ObjectPropertyEditor extends StringPropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + return JSON.stringify(context.target[this.propertyName]); } - get action(): TAction { - return this._action; + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.target[this.propertyName] = JSON.parse(value); } } -export class HttpActionPeer extends TypedActionPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); +export class CustomCardObjectPropertyEditor extends StringPropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + return context.peer.getCardObject().getCustomProperty(this.propertyName); + } - let ignoreInputValidation = addLabelAndInput(card, "Ignore input validation:", Adaptive.ToggleInput); - ignoreInputValidation.input.defaultValue = String(this.action.ignoreInputValidation); - ignoreInputValidation.input.onValueChanged = () => { - this.action.ignoreInputValidation = ignoreInputValidation.input.value == "true"; + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.peer.getCardObject().setCustomProperty(this.propertyName, value); + } +} - this.changed(false); - } +export class BooleanPropertyEditor extends SingleInputPropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + let v = context.target[this.propertyName]; - let method = addLabelAndInput(card, "Method:", Adaptive.ChoiceSetInput); - method.input.isCompact = true; - method.input.choices.push(new Adaptive.Choice("GET", "GET")); - method.input.choices.push(new Adaptive.Choice("POST", "POST")); - method.input.placeholder = "(not set)"; - method.input.defaultValue = this.action.method; - method.input.onValueChanged = () => { - this.action.method = method.input.value; + return typeof v === "boolean" ? v.toString() : "false"; + } - this.changed(true); - } + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.target[this.propertyName] = value == "true"; + } - let url = addLabelAndInput(card, "Url:", Adaptive.TextInput); - url.input.defaultValue = this.action.url; - url.input.placeholder = "(not set)"; - url.input.onValueChanged = () => { - this.action.url = url.input.value; + protected createInput(context: PropertySheetContext): Adaptive.Input { + return new Adaptive.ToggleInput(); + } +} - this.changed(false); - } +export interface IVersionedChoice { + targetVersion: TargetVersion; + name: string; + value: string; +} - if (this.action.method && this.action.method.toLowerCase() == "post") { - var body = addLabelAndInput(card, "Body:", Adaptive.TextInput); - body.input.isMultiline = true; - body.input.defaultValue = this.action.body; - body.input.placeholder = "(not set)"; - body.input.onValueChanged = () => { - this.action.body = body.input.value; +export class ChoicePropertyEditor extends SingleInputPropertyEditor { + protected createInput(context: PropertySheetContext): Adaptive.Input { + let input = new Adaptive.ChoiceSetInput(); + input.isCompact = true; + input.placeholder = "(not set)"; - this.changed(false); + for (let choice of this.choices) { + if (isVersionLessOrEqual(choice.targetVersion, context.targetVersion)) { + input.choices.push(new Adaptive.Choice(choice.name, choice.value)); } } - let headersEditor = new NameValuePairEditor(); - headersEditor.title = "HTTP headers:"; - headersEditor.addButtonTitle = "Add a new header"; - headersEditor.messageIfEmpty = "This action has no headers."; - - for (let choice of this.action.headers) { - headersEditor.nameValuePairs.push({ "name": choice.name, "value": choice.value }); - } - - headersEditor.onChanged = (sender, refreshPropertySheet) => { - this.action.headers = []; - - for (let nameValuePair of sender.nameValuePairs) { - this.action.headers.push(new Adaptive.HttpHeader(nameValuePair.name, nameValuePair.value)); - } - - this.changed(refreshPropertySheet); - }; + return input; + } - card.addItem(headersEditor.render()); + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly choices: IVersionedChoice[], + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion, propertyName, label, causesPropertySheetRefresh); } } -export class SubmitActionPeer extends TypedActionPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); +export class ContainerStylePropertyEditor extends ChoicePropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + let currentStyle = context.target[this.propertyName]; - let ignoreInputValidation = addLabelAndInput(card, "Ignore input validation:", Adaptive.ToggleInput); - ignoreInputValidation.input.defaultValue = String(this.action.ignoreInputValidation); - ignoreInputValidation.input.onValueChanged = () => { - this.action.ignoreInputValidation = ignoreInputValidation.input.value == "true"; + return currentStyle ? currentStyle.toString() : "not_set"; + } - this.changed(false); + protected setPropertyValue(context: PropertySheetContext, value: string) { + if (value == "not_set") { + context.target[this.propertyName] = null; } + else { + context.target[this.propertyName] = value; + } + } - let data = addLabelAndInput(card, "Data:", Adaptive.TextInput); - data.input.isMultiline = true; - data.input.defaultValue = JSON.stringify(this.action.data); - data.input.placeholder = "(not set)"; - data.input.onValueChanged = () => { - this.action.data = JSON.parse(data.input.value); + constructor(readonly targetVersion: TargetVersion,readonly propertyName: string, readonly label: string) { + super( + targetVersion, + propertyName, + label, + [ + { targetVersion: Versions.v1_0, name: "(not set)", value: "not_set" }, + { targetVersion: Versions.v1_0, name: "Default", value: "default" }, + { targetVersion: Versions.v1_0, name: "Emphasis", value: "emphasis" }, + { targetVersion: Versions.v1_2, name: "Accent", value: "accent" }, + { targetVersion: Versions.v1_2, name: "Good", value: "good" }, + { targetVersion: Versions.v1_2, name: "Attention", value: "attention" }, + { targetVersion: Versions.v1_2, name: "Warning", value: "warning" } + ]); + } +} - this.changed(false); +export class ColumnWidthPropertyEditor extends ChoicePropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + if (context.target[this.propertyName] instanceof Adaptive.SizeAndUnit) { + if (context.target[this.propertyName].unit == Adaptive.SizeUnit.Pixel) { + return "pixels"; + } + else { + return "weighted"; + } + } + else { + return context.target[this.propertyName].toString(); + } + } + + protected setPropertyValue(context: PropertySheetContext, value: string) { + switch (value) { + case "auto": + context.target[this.propertyName] = "auto"; + break; + case "pixels": + context.target[this.propertyName] = new Adaptive.SizeAndUnit(50, Adaptive.SizeUnit.Pixel); + break; + case "weighted": + context.target[this.propertyName] = new Adaptive.SizeAndUnit(50, Adaptive.SizeUnit.Weight); + break; + case "stretch": + default: + context.target[this.propertyName] = "stretch"; + break; } } } -export class OpenUrlActionPeer extends TypedActionPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - var url = addLabelAndInput(card, "Url:", Adaptive.TextInput); - url.input.defaultValue = this.action.url; - url.input.placeholder = "(not set)"; - url.input.onValueChanged = () => { - this.action.url = url.input.value; +export class HeightPropertyEditor extends ChoicePropertyEditor { + protected setPropertyValue(context: PropertySheetContext, value: string) { + let processedValue: string; - this.changed(false); + switch (value) { + case "auto": + case "stretch": + processedValue = value; + break; + default: + processedValue = "auto"; + break; } + + context.target[this.propertyName] = processedValue; } } -export class ShowCardActionPeer extends TypedActionPeer { - protected getToolTip(): string { - return "Double click to open/close"; +export class SizeAndUnitPropertyEditor extends NumberPropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + return (context.target[this.propertyName]).physicalSize.toString(); } -} -export class ToggleVisibilityActionPeer extends TypedActionPeer { + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.target[this.propertyName] = new Adaptive.SizeAndUnit(parseInt(value), this.sizeUnit); + } + + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly sizeUnit: Adaptive.SizeUnit, + readonly defaultValue: number | undefined = undefined, + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion, propertyName, label, defaultValue, causesPropertySheetRefresh); + } } -export class CardElementPeer extends DesignerPeer { - protected _cardElement: Adaptive.CardElement; +export class ActionPropertyEditor extends SingleInputPropertyEditor { + protected getPropertyValue(context: PropertySheetContext): any { + let action = context.target[this.propertyName]; - protected insertElementAfter(newElement: Adaptive.CardElement) { - if (this.cardElement.parent instanceof Adaptive.Container) { - this.cardElement.parent.insertItemAfter(newElement, this.cardElement); + return action ? action.getJsonTypeName() : "none"; + } - var newPeer = CardDesignerSurface.cardElementPeerRegistry.createPeerInstance(this.designerSurface, this, newElement); + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.target[this.propertyName] = parseInt(value, 10); - this.peerAdded(newPeer); + if (value == "none") { + context.target[this.propertyName] = null; + } + else { + context.target[this.propertyName] = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(value); } } - protected internalRemove(): boolean { - return this.cardElement.remove(); + protected createInput(context: PropertySheetContext): Adaptive.Input { + let input = new Adaptive.ChoiceSetInput(); + input.isCompact = true; + input.placeholder = "(not set)"; + input.choices.push(new Adaptive.Choice("(not set)", "none")); + + for (var i = 0; i < Adaptive.AdaptiveCard.actionTypeRegistry.getItemCount(); i++) { + let actionType = Adaptive.AdaptiveCard.actionTypeRegistry.getItemAt(i).typeName; + let doAddActionType = this.forbiddenActionTypes ? this.forbiddenActionTypes.indexOf(actionType) < 0 : true; + + if (doAddActionType) { + let choice = new Adaptive.Choice(actionType, actionType); + + input.choices.push(choice); + } + } + + return input; } - protected internalAddBackgroundImageProperties(card: Adaptive.AdaptiveCard, backgroundImage: Adaptive.BackgroundImage) { - let header = addHeader(card, "Background image"); - header.separator = true; + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly forbiddenActionTypes: string[] = [], + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion, propertyName, label, causesPropertySheetRefresh); + } +} - let url = addLabelAndInput(card, "URL:", Adaptive.TextInput); - url.input.placeholder = "(not set)"; +export class CompoundPropertyEditor extends PropertySheetEntry { + render(context: PropertySheetContext): Adaptive.CardElement { + let container = new Adaptive.Container(); - if (backgroundImage) { - url.input.defaultValue = backgroundImage.url; + for (let entry of this.entries) { + if (isVersionLessOrEqual(entry.targetVersion, context.targetVersion)) { + container.addItem(entry.render(new PropertySheetContext(context.targetVersion, context.peer, context.target[this.propertyName]))); + } } - url.input.onValueChanged = () => { - backgroundImage.url = url.input.value; + return container; + } - this.changed(false); - } + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly entries: PropertySheetEntry[] = []) { + super(targetVersion); + } +} - let fillMode = addLabelAndInput(card, "Fill mode:", Adaptive.ChoiceSetInput); - fillMode.input.isCompact = true; - fillMode.input.placeholder = "(not set)"; - fillMode.input.choices.push(new Adaptive.Choice("Cover", Adaptive.FillMode.Cover.toString())); - fillMode.input.choices.push(new Adaptive.Choice("Repeat horizontally", Adaptive.FillMode.RepeatHorizontally.toString())); - fillMode.input.choices.push(new Adaptive.Choice("Repeat vertically", Adaptive.FillMode.RepeatVertically.toString())); - fillMode.input.choices.push(new Adaptive.Choice("Repeat", Adaptive.FillMode.Repeat.toString())); +export class EnumPropertyEditor extends SingleInputPropertyEditor { + protected setPropertyValue(context: PropertySheetContext, value: string) { + context.target[this.propertyName] = parseInt(value, 10); + } - if (backgroundImage) { - fillMode.input.defaultValue = backgroundImage.fillMode.toString(); - } + protected createInput(context: PropertySheetContext): Adaptive.Input { + let input = new Adaptive.ChoiceSetInput(); + input.isCompact = true; + input.placeholder = "(not set)"; - fillMode.input.onValueChanged = () => { - if (horizontalAlignment.input.value) { - backgroundImage.fillMode = parseInt(fillMode.input.value); + for (let key in this.enumType) { + let v = parseInt(key, 10); + + if (!isNaN(v)) { + input.choices.push(new Adaptive.Choice(this.enumType[key], key)); } + } + + return input; + } + + constructor( + readonly targetVersion: TargetVersion, + readonly propertyName: string, + readonly label: string, + readonly enumType: { [s: number]: string }, + readonly causesPropertySheetRefresh: boolean = false) { + super(targetVersion, propertyName, label, causesPropertySheetRefresh); + } +} - this.changed(false); +interface INameValuePair { + name: string; + value: string; +} + +class NameValuePairPropertyEditor extends PropertySheetEntry { + private collectionChanged(context: PropertySheetContext, nameValuePairs: INameValuePair[], refreshPropertySheet: boolean) { + context.target[this.collectionPropertyName] = []; + + for (let nameValuePair of nameValuePairs) { + let item = this.createCollectionItem(nameValuePair.name, nameValuePair.value); + + context.target[this.collectionPropertyName].push(item); } - let horizontalAlignment = addLabelAndInput(card, "Horizontal alignment:", Adaptive.ChoiceSetInput); - horizontalAlignment.input.isCompact = true; - horizontalAlignment.input.placeholder = "(not set)"; - horizontalAlignment.input.choices.push(new Adaptive.Choice("Left", Adaptive.HorizontalAlignment.Left.toString())); - horizontalAlignment.input.choices.push(new Adaptive.Choice("Center", Adaptive.HorizontalAlignment.Center.toString())); - horizontalAlignment.input.choices.push(new Adaptive.Choice("Right", Adaptive.HorizontalAlignment.Right.toString())); + context.peer.changed(refreshPropertySheet); + } + + render(context: PropertySheetContext): Adaptive.CardElement { + let result = new Adaptive.Container(); + + let collection = context.target[this.collectionPropertyName]; - if (backgroundImage) { - horizontalAlignment.input.defaultValue = backgroundImage.horizontalAlignment.toString(); + if (!Array.isArray(collection)) { + throw new Error("The " + this.collectionPropertyName + " property on " + context.peer.getCardObject().getJsonTypeName() + " either doesn't exist or isn't an array.") } - horizontalAlignment.input.onValueChanged = () => { - if (horizontalAlignment.input.value) { - backgroundImage.horizontalAlignment = parseInt(horizontalAlignment.input.value); - } + let nameValuePairs: INameValuePair[] = []; - this.changed(false); + for (let pair of collection) { + nameValuePairs.push( + { + name: pair[this.namePropertyName], + value: pair[this.valuePropertyName] + } + ) } - let verticalAlignment = addLabelAndInput(card, "Vertical alignment:", Adaptive.ChoiceSetInput); - verticalAlignment.input.isCompact = true; - verticalAlignment.input.placeholder = "(not set)"; - verticalAlignment.input.choices.push(new Adaptive.Choice("Top", Adaptive.VerticalAlignment.Top.toString())); - verticalAlignment.input.choices.push(new Adaptive.Choice("Center", Adaptive.VerticalAlignment.Center.toString())); - verticalAlignment.input.choices.push(new Adaptive.Choice("Bottom", Adaptive.VerticalAlignment.Bottom.toString())); + if (nameValuePairs.length == 0) { + let messageTextBlock = new Adaptive.TextBlock(); + messageTextBlock.spacing = Adaptive.Spacing.Small; + messageTextBlock.text = this.messageIfEmpty; - if (backgroundImage) { - verticalAlignment.input.defaultValue = backgroundImage.verticalAlignment.toString(); + result.addItem(messageTextBlock); } + else { + for (let i = 0; i < nameValuePairs.length; i++) { + let textInput = new Adaptive.TextInput(); + textInput.placeholder = this.namePropertyLabel; + textInput.defaultValue = nameValuePairs[i].name; + textInput.onValueChanged = (sender) => { + nameValuePairs[i].name = sender.value; + + this.collectionChanged(context, nameValuePairs, false); + }; + + let nameColumn = new Adaptive.Column("stretch"); + nameColumn.addItem(textInput); + + textInput = new Adaptive.TextInput(); + textInput.placeholder = this.valuePropertyLabel; + textInput.defaultValue = nameValuePairs[i].value; + textInput.onValueChanged = (sender) => { + nameValuePairs[i].value = sender.value; + + this.collectionChanged(context, nameValuePairs, false); + }; + + let valueColumn = new Adaptive.Column("stretch"); + valueColumn.spacing = Adaptive.Spacing.Small; + valueColumn.addItem(textInput); + + let removeAction = new Adaptive.SubmitAction(); + removeAction.title = "X"; + removeAction.onExecute = (sender) => { + nameValuePairs.splice(i, 1); + + this.collectionChanged(context, nameValuePairs, true); + } + + let actionSet = new Adaptive.ActionSet(); + actionSet.addAction(removeAction); + + let removeColumn = new Adaptive.Column("auto"); + removeColumn.spacing = Adaptive.Spacing.Small; + removeColumn.addItem(actionSet); - verticalAlignment.input.onValueChanged = () => { - if (verticalAlignment.input.value) { - backgroundImage.verticalAlignment = parseInt(verticalAlignment.input.value); + let columnSet = new Adaptive.ColumnSet(); + columnSet.spacing = Adaptive.Spacing.Small; + columnSet.addColumn(nameColumn); + columnSet.addColumn(valueColumn); + columnSet.addColumn(removeColumn); + + result.addItem(columnSet); } + } + + let addAction = new Adaptive.SubmitAction(); + addAction.title = this.addButtonTitle; + addAction.onExecute = (sender) => { + nameValuePairs.push({ name: "", value: "" }); - this.changed(false); + this.collectionChanged(context, nameValuePairs, true); } + + let actionSet = new Adaptive.ActionSet(); + actionSet.spacing = Adaptive.Spacing.Small; + actionSet.addAction(addAction); + + result.addItem(actionSet); + + return result; + } + + constructor( + readonly targetVersion: TargetVersion, + readonly collectionPropertyName: string, + readonly namePropertyName: string, + readonly valuePropertyName: string, + readonly createCollectionItem: (name: string, value: string) => any, + readonly namePropertyLabel: string = "Name", + readonly valuePropertyLabel: string = "Value", + readonly addButtonTitle: string = "Add", + readonly messageIfEmpty: string = "This collection is empty") { + super(targetVersion); } +} - protected internalAddMinHeightProperty(card: Adaptive.AdaptiveCard) { - let minPixelHeight = addLabelAndInput(card, "Minimum height in pixels:", Adaptive.NumberInput); +export abstract class CardObjectPeer extends DesignerPeer { + static readonly idProperty = new StringPropertyEditor(Versions.v1_0, "id", "Id"); +} - if (this.cardElement.minPixelHeight) { - minPixelHeight.input.defaultValue = this.cardElement.minPixelHeight.toString(); +export class ActionPeer extends CardObjectPeer { + static readonly titleProperty = new StringPropertyEditor(Versions.v1_0, "title", "Title"); + static readonly styleProperty = new ChoicePropertyEditor( + Versions.v1_2, + "style", + "Style", + [ + { targetVersion: Versions.v1_2, name: "Default", value: Adaptive.ActionStyle.Default }, + { targetVersion: Versions.v1_2, name: "Positive", value: Adaptive.ActionStyle.Positive }, + { targetVersion: Versions.v1_2, name: "Destructive", value: Adaptive.ActionStyle.Destructive } + ]); + static readonly iconUrlProperty = new StringPropertyEditor(Versions.v1_1, "iconUrl", "Icon URL"); + + protected _action: Adaptive.Action; + + protected doubleClick(e: MouseEvent) { + super.doubleClick(e); + + this.action.renderedElement.click(); + } + + protected internalRemove(): boolean { + return this.action.remove(); + } + + constructor( + parent: DesignerPeer, + designerSurface: CardDesignerSurface, + registration: DesignerPeerRegistrationBase, + action: Adaptive.Action) { + super(parent, designerSurface, registration); + + this._action = action; + } + + protected internalGetTreeItemText(): string { + if (this.action.title && this.action.title != "") { + return this.action.title; + } + else { + return super.internalGetTreeItemText(); } + } - minPixelHeight.input.placeholder = "(not set)" - minPixelHeight.input.onValueChanged = () => { - try { - this.cardElement.minPixelHeight = parseInt(minPixelHeight.input.value); - } - catch { - this.cardElement.minPixelHeight = null; - } + getCardObject(): Adaptive.CardObject { + return this.action; + } + + isDraggable(): boolean { + return false; + } + + getBoundingRect(): Rect { + let designSurfaceOffset = this.designerSurface.getDesignerSurfaceOffset(); + let actionBoundingRect = this.action.renderedElement.getBoundingClientRect(); + + return new Rect( + actionBoundingRect.top - designSurfaceOffset.y, + actionBoundingRect.right - designSurfaceOffset.x, + actionBoundingRect.bottom - designSurfaceOffset.y, + actionBoundingRect.left - designSurfaceOffset.x + ); + } + + getCardObjectBoundingRect(): Rect { + let actionBoundingRect = this.action.renderedElement.getBoundingClientRect(); + + return new Rect( + actionBoundingRect.top, + actionBoundingRect.right, + actionBoundingRect.bottom, + actionBoundingRect.left + ); + } + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + ActionPeer.idProperty, + ActionPeer.titleProperty, + ActionPeer.styleProperty, + ActionPeer.iconUrlProperty); + } + + get action(): Adaptive.Action { + return this._action; + } +} + +export abstract class TypedActionPeer extends ActionPeer { + constructor( + parent: DesignerPeer, + designerSurface: CardDesignerSurface, + registration: DesignerPeerRegistrationBase, + action: TAction) { + super(parent, designerSurface, registration, action); + } + + get action(): TAction { + return this._action; + } +} + +export class HttpActionPeer extends TypedActionPeer { + static readonly ignoreInputValidationProperty = new BooleanPropertyEditor(Versions.vNext, "ignoreInputValidation", "Ignore input validation"); + static readonly methodProperty = new ChoicePropertyEditor( + Versions.v1_0, + "method", + "Method", + [ + { targetVersion: Versions.v1_0, name: "GET", value: "GET" }, + { targetVersion: Versions.v1_0, name: "POST", value: "POST" } + ], + true); + static readonly urlProperty = new StringPropertyEditor(Versions.v1_0, "url", "Url"); + static readonly bodyProperty = new StringPropertyEditor(Versions.v1_0, "body", "Body", true); + static readonly headersProperty = new NameValuePairPropertyEditor( + Versions.v1_0, + "headers", + "name", + "value", + (name: string, value: string) => { return new Adaptive.HttpHeader(name, value); }, + "Name", + "Value", + "Add a new header", + "This action has no header."); + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + if (Adaptive.AdaptiveCard.useBuiltInInputValidation) { + propertySheet.add( + PropertySheetCategory.DefaultCategory, + HttpActionPeer.ignoreInputValidationProperty); + } + + propertySheet.add( + defaultCategory, + HttpActionPeer.methodProperty, + HttpActionPeer.urlProperty); - this.changed(false); + if (this.action.method == "POST") { + propertySheet.add( + defaultCategory, + HttpActionPeer.bodyProperty); } + + propertySheet.add( + "HTTP headers", + HttpActionPeer.headersProperty); + } +} + +export class SubmitActionPeer extends TypedActionPeer { + static readonly ignoreInputValidationProperty = new BooleanPropertyEditor(Versions.vNext, "ignoreInputValidation", "Ignore input validation"); + static readonly dataProperty = new ObjectPropertyEditor(Versions.v1_0, "data", "Data"); + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + SubmitActionPeer.ignoreInputValidationProperty, + SubmitActionPeer.dataProperty); + } +} + +export class OpenUrlActionPeer extends TypedActionPeer { + static readonly urlProperty = new StringPropertyEditor(Versions.v1_0, "url", "Url"); + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + OpenUrlActionPeer.urlProperty); + } +} + +export class ShowCardActionPeer extends TypedActionPeer { + protected getToolTip(): string { + return "Double click to open/close"; + } +} + +export class ToggleVisibilityActionPeer extends TypedActionPeer { +} + +export class CardElementPeer extends CardObjectPeer { + static readonly dataContextProperty = new CustomCardObjectPropertyEditor("*", "$data", "Data context"); + static readonly whenProperty = new CustomCardObjectPropertyEditor("*", "$when", "Only show when"); + static readonly idProperty = new StringPropertyEditor(Versions.v1_0, "id", "Id"); + static readonly isVisibleProperty = new BooleanPropertyEditor(Versions.v1_2, "isVisible", "Initially visible"); + static readonly spacingProperty = new EnumPropertyEditor(Versions.v1_0, "spacing", "Spacing", Adaptive.Spacing); + static readonly separatorProperty = new BooleanPropertyEditor(Versions.v1_0, "separator", "Separator"); + static readonly horizontalAlignmentProperty = new EnumPropertyEditor(Versions.v1_0, "horizontalAlignment", "Horizontal alignment", Adaptive.HorizontalAlignment); + static readonly heightProperty = new HeightPropertyEditor( + Versions.v1_1, + "height", + "Height", + [ + { targetVersion: Versions.v1_1, name: "Automatic", value: "auto" }, + { targetVersion: Versions.v1_1, name: "Stretch", value: "stretch" } + ]); + + protected _cardElement: Adaptive.CardElement; + + protected insertElementAfter(newElement: Adaptive.CardElement) { + if (this.cardElement.parent instanceof Adaptive.Container) { + this.cardElement.parent.insertItemAfter(newElement, this.cardElement); + + var newPeer = CardDesignerSurface.cardElementPeerRegistry.createPeerInstance(this.designerSurface, this, newElement); + + this.peerAdded(newPeer); + } + } + + protected internalRemove(): boolean { + return this.cardElement.remove(); } protected internalUpdateCssStyles() { @@ -944,8 +1294,12 @@ export class CardElementPeer extends DesignerPeer { } } - constructor(designerSurface: CardDesignerSurface, registration: DesignerPeerRegistrationBase, cardElement: Adaptive.CardElement) { - super(designerSurface, registration); + constructor( + parent: DesignerPeer, + designerSurface: CardDesignerSurface, + registration: DesignerPeerRegistrationBase, + cardElement: Adaptive.CardElement) { + super(parent, designerSurface, registration); this._cardElement = cardElement; @@ -1081,114 +1435,41 @@ export class CardElementPeer extends DesignerPeer { ); } - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - if (includeHeader) { - addHeader(card, this.cardElement.getJsonTypeName()); - } - - let getExcludedProperties = this.getExcludedProperties(); - - if (getExcludedProperties.indexOf("id") < 0) { - let id = addLabelAndInput(card, "Id:", Adaptive.TextInput); - id.input.defaultValue = this.cardElement.id; - id.input.placeholder = "(not set)"; - id.input.onValueChanged = () => { - this.cardElement.id = id.input.value; - - this.changed(false); - } - } - - if (getExcludedProperties.indexOf("isVisible") < 0) { - let isVisible = addLabelAndInput(card, "Initially visible:", Adaptive.ToggleInput); - isVisible.input.defaultValue = String(this.cardElement.isVisible); - isVisible.input.onValueChanged = () => { - this.cardElement.isVisible = isVisible.input.value == "true"; - - this.changed(false); - } - } - - if (getExcludedProperties.indexOf("spacing") < 0) { - let spacing = addLabelAndInput(card, "Spacing:", Adaptive.ChoiceSetInput); - spacing.input.isCompact = true; - spacing.input.choices.push(new Adaptive.Choice("None", Adaptive.Spacing.None.toString())); - spacing.input.choices.push(new Adaptive.Choice("Small", Adaptive.Spacing.Small.toString())); - spacing.input.choices.push(new Adaptive.Choice("Default", Adaptive.Spacing.Default.toString())); - spacing.input.choices.push(new Adaptive.Choice("Medium", Adaptive.Spacing.Medium.toString())); - spacing.input.choices.push(new Adaptive.Choice("Large", Adaptive.Spacing.Large.toString())); - spacing.input.choices.push(new Adaptive.Choice("Extra large", Adaptive.Spacing.ExtraLarge.toString())); - spacing.input.choices.push(new Adaptive.Choice("Default padding", Adaptive.Spacing.Padding.toString())); - spacing.input.defaultValue = this.cardElement.spacing.toString(); - spacing.input.onValueChanged = () => { - this.cardElement.spacing = parseInt(spacing.input.value); - - this.changed(false); - } - } - - if (getExcludedProperties.indexOf("separator") < 0) { - let separator = addLabelAndInput(card, "Show separator:", Adaptive.ToggleInput); - separator.input.defaultValue = String(this.cardElement.separator); - separator.input.onValueChanged = () => { - this.cardElement.separator = separator.input.value == "true"; - - this.changed(false); - } - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); - if (getExcludedProperties.indexOf("horizontalAlignment") < 0) { - var horizontalAlignment = addLabelAndInput(card, "Horizontal alignment:", Adaptive.ChoiceSetInput); - horizontalAlignment.input.isCompact = true; - horizontalAlignment.input.placeholder = "(not set)"; - horizontalAlignment.input.choices.push(new Adaptive.Choice("Left", Adaptive.HorizontalAlignment.Left.toString())); - horizontalAlignment.input.choices.push(new Adaptive.Choice("Center", Adaptive.HorizontalAlignment.Center.toString())); - horizontalAlignment.input.choices.push(new Adaptive.Choice("Right", Adaptive.HorizontalAlignment.Right.toString())); - - if (this.cardElement.horizontalAlignment) { - horizontalAlignment.input.defaultValue = this.cardElement.horizontalAlignment.toString(); - } - - horizontalAlignment.input.onValueChanged = () => { - if (horizontalAlignment.input.value) { - this.cardElement.horizontalAlignment = parseInt(horizontalAlignment.input.value); - } - - this.changed(false); - } + if (GlobalSettings.previewFeaturesEnabled) { + propertySheet.add( + defaultCategory, + CardElementPeer.dataContextProperty, + CardElementPeer.whenProperty); } - if (getExcludedProperties.indexOf("height") < 0) { - let height = addLabelAndInput(card, "Height:", Adaptive.ChoiceSetInput); - height.input.isCompact = true; - height.input.choices.push(new Adaptive.Choice("Automatic", "auto")); - height.input.choices.push(new Adaptive.Choice("Stretch", "stretch")); - height.input.defaultValue = this.cardElement.height; - - height.input.onValueChanged = () => { - switch (height.input.value) { - case "auto": - case "stretch": - this.cardElement.height = height.input.value; - break; - default: - this.cardElement.height = "auto"; - break; - } + propertySheet.add( + defaultCategory, + CardElementPeer.idProperty, + CardElementPeer.isVisibleProperty); - this.changed(true); - } - } + propertySheet.add( + PropertySheetCategory.LayoutCategory, + CardElementPeer.spacingProperty, + CardElementPeer.separatorProperty, + CardElementPeer.horizontalAlignmentProperty, + CardElementPeer.heightProperty); } - + get cardElement(): Adaptive.CardElement { return this._cardElement; } } export abstract class TypedCardElementPeer extends CardElementPeer { - constructor(designerSurface: CardDesignerSurface, registration: DesignerPeerRegistrationBase, cardElement: TCardElement) { - super(designerSurface, registration, cardElement); + constructor( + parent: DesignerPeer, + designerSurface: CardDesignerSurface, + registration: DesignerPeerRegistrationBase, + cardElement: TCardElement) { + super(parent, designerSurface, registration, cardElement); } get cardElement(): TCardElement { @@ -1197,6 +1478,10 @@ export abstract class TypedCardElementPeer { + static readonly langProperty = new StringPropertyEditor(Versions.v1_1, "lang", "Language"); + static readonly fallbackTextProperty = new StringPropertyEditor(Versions.v1_0, "fallbackText", "Fallback text", true); + static readonly speakProperty = new StringPropertyEditor(Versions.v1_0, "speak", "Speak"); + protected addAction(action: Adaptive.Action) { this.cardElement.addAction(action); @@ -1239,10 +1524,6 @@ export class AdaptiveCardPeer extends TypedCardElementPeer { - return [ "id", "isVisible", "horizontalAlignment", "separator", "height", "spacing" ]; - } - isDraggable(): boolean { return false; } @@ -1251,81 +1532,60 @@ export class AdaptiveCardPeer extends TypedCardElementPeer { - this.cardElement.lang = lang.input.value; - - this.changed(false); - } - - let fallbackText = addLabelAndInput(card, "Fallback text:", Adaptive.TextInput); - fallbackText.input.defaultValue = this.cardElement.fallbackText; - fallbackText.input.placeholder = "(not set)"; - fallbackText.input.isMultiline = true; - fallbackText.input.onValueChanged = () => { - this.cardElement.fallbackText = fallbackText.input.value; - - this.changed(false); - } - - let speak = addLabelAndInput(card, "Speak:", Adaptive.TextInput); - speak.input.defaultValue = this.cardElement.fallbackText; - speak.input.placeholder = "(not set)"; - speak.input.isMultiline = true; - speak.input.onValueChanged = () => { - this.cardElement.speak = speak.input.value; - - this.changed(false); - } - - this.internalAddMinHeightProperty(card); - - let verticalContentAlignment = addLabelAndInput(card, "Vertical content alignment:", Adaptive.ChoiceSetInput); - verticalContentAlignment.input.isCompact = true; - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Top", Adaptive.VerticalAlignment.Top.toString())); - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Center", Adaptive.VerticalAlignment.Center.toString())); - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Bottom", Adaptive.VerticalAlignment.Bottom.toString())); - verticalContentAlignment.input.defaultValue = this.cardElement.verticalContentAlignment.toString(); - verticalContentAlignment.input.placeholder = "(not set)"; - verticalContentAlignment.input.onValueChanged = () => { - this.cardElement.verticalContentAlignment = parseInt(verticalContentAlignment.input.value); - - this.changed(false); - } - - this.internalAddBackgroundImageProperties(card, this.cardElement.backgroundImage); - - let actionSelector = createActionSelector( - "Select action", - card, - [ Adaptive.ShowCardAction.JsonTypeName ], - this.cardElement.selectAction ? this.cardElement.selectAction.getJsonTypeName() : "none"); - - actionSelector.input.onValueChanged = () => { - if (actionSelector.input.value == "none") { - this.cardElement.selectAction = null; - } - else { - this.cardElement.selectAction = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(actionSelector.input.value); - } - - this.changed(true); - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + AdaptiveCardPeer.langProperty, + AdaptiveCardPeer.fallbackTextProperty, + AdaptiveCardPeer.speakProperty); + + propertySheet.add( + PropertySheetCategory.LayoutCategory, + ContainerPeer.minHeightProperty, + ContainerPeer.verticalContentAlignmentProperty); + + propertySheet.add( + "Background image", + ContainerPeer.backgroundImageProperty); + + propertySheet.add( + "Selection action", + ContainerPeer.selectActionProperty); + + propertySheet.remove( + CardObjectPeer.idProperty, + CardElementPeer.isVisibleProperty, + CardElementPeer.horizontalAlignmentProperty, + CardElementPeer.separatorProperty, + CardElementPeer.heightProperty, + CardElementPeer.spacingProperty); if (this.cardElement.selectAction) { let selectActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.selectAction); - selectActionPeer.internalAddPropertySheetEntries(card, false); + selectActionPeer.populatePropertySheet(propertySheet, "Selection action"); selectActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; } } } export class ColumnPeer extends TypedCardElementPeer { + private static readonly pixelWidthProperty = new SizeAndUnitPropertyEditor(Versions.v1_1, "width", "Width in pixels", Adaptive.SizeUnit.Pixel); + private static readonly weightProperty = new SizeAndUnitPropertyEditor(Versions.v1_0, "width", "Weight", Adaptive.SizeUnit.Weight); + + static readonly widthProperty = new ColumnWidthPropertyEditor( + Versions.v1_0, + "width", + "Width", + [ + { targetVersion: Versions.v1_0, name: "Automatic", value: "auto" }, + { targetVersion: Versions.v1_0, name: "Stretch", value: "stretch" }, + { targetVersion: Versions.v1_0, name: "Weighted", value: "weighted" }, + { targetVersion: Versions.v1_1, name: "Pixels", value: "pixels" } + ], + true); + protected isContainer(): boolean { return true; } @@ -1355,151 +1615,47 @@ export class ColumnPeer extends TypedCardElementPeer { return false; } - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let width = addLabelAndInput(card, "Width:", Adaptive.ChoiceSetInput); - width.input.isCompact = true; - width.input.choices.push(new Adaptive.Choice("Automatic", "auto")); - width.input.choices.push(new Adaptive.Choice("Stretch", "stretch")); - width.input.choices.push(new Adaptive.Choice("Weighted", "weighted")); - width.input.choices.push(new Adaptive.Choice("Pixels", "pixels")); + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + ColumnPeer.widthProperty); if (this.cardElement.width instanceof Adaptive.SizeAndUnit) { if (this.cardElement.width.unit == Adaptive.SizeUnit.Pixel) { - width.input.defaultValue = "pixels"; - - let pixelWidth = addLabelAndInput(card, "Width in pixels:", Adaptive.NumberInput); - pixelWidth.input.defaultValue = this.cardElement.width.physicalSize.toString(); - pixelWidth.input.placeholder = "(not set)" - pixelWidth.input.onValueChanged = () => { - try { - this.cardElement.width = new Adaptive.SizeAndUnit(parseInt(pixelWidth.input.value), Adaptive.SizeUnit.Pixel); - - this.changed(false); - } - catch { - // Do nothing. The specified width is invalid - } - } + propertySheet.add( + PropertySheetCategory.DefaultCategory, + ColumnPeer.pixelWidthProperty); } else { - width.input.defaultValue = "weighted"; - - let weightedWidth = addLabelAndInput(card, "Weight:", Adaptive.NumberInput); - weightedWidth.input.defaultValue = this.cardElement.width.physicalSize.toString(); - weightedWidth.input.placeholder = "(not set)" - weightedWidth.input.onValueChanged = () => { - try { - this.cardElement.width = new Adaptive.SizeAndUnit(parseInt(weightedWidth.input.value), Adaptive.SizeUnit.Weight); - - this.changed(false); - } - catch { - // Do nothing. The specified width is invalid - } - } + propertySheet.add( + PropertySheetCategory.DefaultCategory, + ColumnPeer.weightProperty); } } - else { - width.input.defaultValue = this.cardElement.width.toString(); - } - width.input.placeholder = "(not set)"; + propertySheet.add( + PropertySheetCategory.LayoutCategory, + ContainerPeer.minHeightProperty, + ContainerPeer.verticalContentAlignmentProperty); - width.input.onValueChanged = () => { - switch (width.input.value) { - case "auto": - this.cardElement.width = "auto"; - break; - case "pixels": - this.cardElement.width = new Adaptive.SizeAndUnit(50, Adaptive.SizeUnit.Pixel); - break; - case "weighted": - this.cardElement.width = new Adaptive.SizeAndUnit(50, Adaptive.SizeUnit.Weight); - break; - case "stretch": - default: - this.cardElement.width = "stretch"; - break; - } - - this.changed(true); - } - - this.internalAddMinHeightProperty(card); + propertySheet.add( + PropertySheetCategory.StyleCategory, + ContainerPeer.styleProperty, + ContainerPeer.bleedProperty); - let verticalContentAlignment = addLabelAndInput(card, "Vertical content alignment:", Adaptive.ChoiceSetInput); - verticalContentAlignment.input.isCompact = true; - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Top", Adaptive.VerticalAlignment.Top.toString())); - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Center", Adaptive.VerticalAlignment.Center.toString())); - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Bottom", Adaptive.VerticalAlignment.Bottom.toString())); - verticalContentAlignment.input.defaultValue = this.cardElement.verticalContentAlignment.toString(); - verticalContentAlignment.input.placeholder = "(not set)"; - verticalContentAlignment.input.onValueChanged = () => { - this.cardElement.verticalContentAlignment = parseInt(verticalContentAlignment.input.value); - - this.changed(false); - } - - let style = addLabelAndInput(card, "Style:", Adaptive.ChoiceSetInput); - style.input.isCompact = true; - style.input.choices.push(new Adaptive.Choice("(not set)", "not_set")); - style.input.choices.push(new Adaptive.Choice("Default", "default")); - style.input.choices.push(new Adaptive.Choice("Emphasis", "emphasis")); - style.input.choices.push(new Adaptive.Choice("Accent", "accent")); - style.input.choices.push(new Adaptive.Choice("Good", "good")); - style.input.choices.push(new Adaptive.Choice("Attention", "attention")); - style.input.choices.push(new Adaptive.Choice("Warning", "warning")); - - if (this.cardElement.style) { - style.input.defaultValue = this.cardElement.style.toString(); - } - else { - style.input.defaultValue = "not_set"; - } - - style.input.onValueChanged = () => { - if (style.input.value == "not_set") { - this.cardElement.style = null; - } - else { - this.cardElement.style = style.input.value; - } - - this.changed(false); - } - - let bleed = addLabelAndInput(card, "Bleed:", Adaptive.ToggleInput); - bleed.input.defaultValue = String(this.cardElement.bleed); - bleed.input.onValueChanged = () => { - this.cardElement.bleed = bleed.input.value == "true"; - - this.changed(false); - } - - this.internalAddBackgroundImageProperties(card, this.cardElement.backgroundImage); - - let actionSelector = createActionSelector( - "Select action", - card, - [ Adaptive.ShowCardAction.JsonTypeName ], - this.cardElement.selectAction ? this.cardElement.selectAction.getJsonTypeName() : "none"); - - actionSelector.input.onValueChanged = () => { - if (actionSelector.input.value == "none") { - this.cardElement.selectAction = null; - } - else { - this.cardElement.selectAction = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(actionSelector.input.value); - } - - this.changed(true); - } + propertySheet.add( + "Background image", + ContainerPeer.backgroundImageProperty); + propertySheet.add( + "Selection action", + ContainerPeer.selectActionProperty); + if (this.cardElement.selectAction) { let selectActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.selectAction); - selectActionPeer.internalAddPropertySheetEntries(card, false); + selectActionPeer.populatePropertySheet(propertySheet, "Selection action"); selectActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; } } @@ -1544,157 +1700,77 @@ export class ColumnSetPeer extends TypedCardElementPeer { } } - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - this.internalAddMinHeightProperty(card); - - let style = addLabelAndInput(card, "Style:", Adaptive.ChoiceSetInput); - style.input.isCompact = true; - style.input.choices.push(new Adaptive.Choice("(not set)", "not_set")); - style.input.choices.push(new Adaptive.Choice("Default", "default")); - style.input.choices.push(new Adaptive.Choice("Emphasis", "emphasis")); - style.input.choices.push(new Adaptive.Choice("Accent", "accent")); - style.input.choices.push(new Adaptive.Choice("Good", "good")); - style.input.choices.push(new Adaptive.Choice("Attention", "attention")); - style.input.choices.push(new Adaptive.Choice("Warning", "warning")); - - if (this.cardElement.style) { - style.input.defaultValue = this.cardElement.style.toString(); - } - else { - style.input.defaultValue = "not_set"; - } - - style.input.onValueChanged = () => { - if (style.input.value == "not_set") { - this.cardElement.style = null; - } - else { - this.cardElement.style = style.input.value; - } - - this.changed(false); - } - - let bleed = addLabelAndInput(card, "Bleed:", Adaptive.ToggleInput); - bleed.input.defaultValue = String(this.cardElement.bleed); - bleed.input.onValueChanged = () => { - this.cardElement.bleed = bleed.input.value == "true"; - - this.changed(false); - } - - var actionSelector = createActionSelector( - "Select action", - card, - [ Adaptive.ShowCardAction.JsonTypeName ], - this.cardElement.selectAction ? this.cardElement.selectAction.getJsonTypeName() : "none"); - - actionSelector.input.onValueChanged = () => { - if (actionSelector.input.value == "none") { - this.cardElement.selectAction = null; - } - else { - this.cardElement.selectAction = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(actionSelector.input.value); - } - - this.changed(true); - } - - if (this.cardElement.selectAction) { - let selectActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.selectAction); - selectActionPeer.internalAddPropertySheetEntries(card, false); - selectActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; - } - } - - canDrop(peer: DesignerPeer) { - return true; - } -} - -export class ContainerPeer extends TypedCardElementPeer { - protected isContainer(): boolean { - return true; - } - - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - this.internalAddMinHeightProperty(card); - - let verticalContentAlignment = addLabelAndInput(card, "Vertical content alignment:", Adaptive.ChoiceSetInput); - verticalContentAlignment.input.isCompact = true; - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Top", Adaptive.VerticalAlignment.Top.toString())); - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Center", Adaptive.VerticalAlignment.Center.toString())); - verticalContentAlignment.input.choices.push(new Adaptive.Choice("Bottom", Adaptive.VerticalAlignment.Bottom.toString())); - verticalContentAlignment.input.defaultValue = this.cardElement.verticalContentAlignment.toString(); - verticalContentAlignment.input.placeholder = "(not set)"; - verticalContentAlignment.input.onValueChanged = () => { - this.cardElement.verticalContentAlignment = parseInt(verticalContentAlignment.input.value); - - this.changed(false); - } - - let style = addLabelAndInput(card, "Style:", Adaptive.ChoiceSetInput); - style.input.isCompact = true; - style.input.choices.push(new Adaptive.Choice("(not set)", "not_set")); - style.input.choices.push(new Adaptive.Choice("Default", "default")); - style.input.choices.push(new Adaptive.Choice("Emphasis", "emphasis")); - style.input.choices.push(new Adaptive.Choice("Accent", "accent")); - style.input.choices.push(new Adaptive.Choice("Good", "good")); - style.input.choices.push(new Adaptive.Choice("Attention", "attention")); - style.input.choices.push(new Adaptive.Choice("Warning", "warning")); - - if (this.cardElement.style) { - style.input.defaultValue = this.cardElement.style.toString(); - } - else { - style.input.defaultValue = "not_set"; - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + ContainerPeer.minHeightProperty, + ContainerPeer.styleProperty, + ContainerPeer.bleedProperty); - style.input.onValueChanged = () => { - if (style.input.value == "not_set") { - this.cardElement.style = null; - } - else { - this.cardElement.style = style.input.value; - } + propertySheet.add( + "Selection action", + ContainerPeer.selectActionProperty); - this.changed(false); + + if (this.cardElement.selectAction) { + let selectActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.selectAction); + selectActionPeer.populatePropertySheet(propertySheet, "Selection action"); + selectActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; } + } - let bleed = addLabelAndInput(card, "Bleed:", Adaptive.ToggleInput); - bleed.input.defaultValue = String(this.cardElement.bleed); - bleed.input.onValueChanged = () => { - this.cardElement.bleed = bleed.input.value == "true"; + canDrop(peer: DesignerPeer) { + return true; + } +} - this.changed(false); - } +export class ContainerPeer extends TypedCardElementPeer { + static readonly selectActionProperty = new ActionPropertyEditor(Versions.v1_0, "selectAction", "Action type", [ Adaptive.ShowCardAction.JsonTypeName ], true); + static readonly minHeightProperty = new NumberPropertyEditor(Versions.v1_2, "minPixelHeight", "Minimum height in pixels"); + static readonly verticalContentAlignmentProperty = new EnumPropertyEditor(Versions.v1_1, "verticalContentAlignment", "Vertical content alignment", Adaptive.VerticalAlignment); + static readonly styleProperty = new ContainerStylePropertyEditor(Versions.v1_0, "style", "Style"); + static readonly bleedProperty = new BooleanPropertyEditor(Versions.v1_2, "bleed", "Bleed"); + static readonly backgroundImageProperty = new CompoundPropertyEditor( + Versions.v1_0, + "backgroundImage", + [ + new StringPropertyEditor(Versions.v1_0, "url", "URL"), + new EnumPropertyEditor(Versions.v1_2, "fillMode", "Fill mode", Adaptive.FillMode), + new EnumPropertyEditor(Versions.v1_2, "horizontalAlignment", "Horizontal alignment", Adaptive.HorizontalAlignment), + new EnumPropertyEditor(Versions.v1_2, "verticalAlignment", "Vertical alignment", Adaptive.VerticalAlignment) + ] + ); - this.internalAddBackgroundImageProperties(card, this.cardElement.backgroundImage); + protected isContainer(): boolean { + return true; + } - let actionSelector = createActionSelector( - "Select action", - card, - [ Adaptive.ShowCardAction.JsonTypeName ], - this.cardElement.selectAction ? this.cardElement.selectAction.getJsonTypeName() : "none"); + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + PropertySheetCategory.LayoutCategory, + ContainerPeer.minHeightProperty, + ContainerPeer.verticalContentAlignmentProperty); - actionSelector.input.onValueChanged = () => { - if (actionSelector.input.value == "none") { - this.cardElement.selectAction = null; - } - else { - this.cardElement.selectAction = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(actionSelector.input.value); - } + propertySheet.add( + PropertySheetCategory.StyleCategory, + ContainerPeer.styleProperty, + ContainerPeer.bleedProperty); - this.changed(true); - } + propertySheet.add( + "Background image", + ContainerPeer.backgroundImageProperty); + + propertySheet.add( + "Selection action", + ContainerPeer.selectActionProperty); if (this.cardElement.selectAction) { let selectActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.selectAction); - selectActionPeer.internalAddPropertySheetEntries(card, false); + selectActionPeer.populatePropertySheet(propertySheet, "Selection action"); selectActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; } } @@ -1740,52 +1816,8 @@ export class ActionSetPeer extends TypedCardElementPeer { } } -function createActionSelector( - title: string, - card: Adaptive.AdaptiveCard, - forbiddenActionTypes: string[], - defaultValue: string): ILabelAndInput { - let header = addHeader(card, title); - header.separator = true; - - let actionSelector = addLabelAndInput(card, "Action type:", Adaptive.ChoiceSetInput); - actionSelector.input.isCompact = true; - actionSelector.input.choices.push(new Adaptive.Choice("(not set)", "none")); - - for (var i = 0; i < Adaptive.AdaptiveCard.actionTypeRegistry.getItemCount(); i++) { - let actionType = Adaptive.AdaptiveCard.actionTypeRegistry.getItemAt(i).typeName; - let doAddActionType = forbiddenActionTypes ? forbiddenActionTypes.indexOf(actionType) < 0 : true; - - if (doAddActionType) { - let choice = new Adaptive.Choice(actionType, actionType); - - actionSelector.input.choices.push(choice); - } - } - - actionSelector.input.defaultValue = defaultValue; - - return actionSelector; -} - export class ImageSetPeer extends TypedCardElementPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - var imageSize = addLabelAndInput(card, "Image Size:", Adaptive.ChoiceSetInput); - imageSize.input.isCompact = true; - imageSize.input.choices.push(new Adaptive.Choice("Automatic", Adaptive.Size.Auto.toString())); - imageSize.input.choices.push(new Adaptive.Choice("Small", Adaptive.Size.Small.toString())); - imageSize.input.choices.push(new Adaptive.Choice("Medium", Adaptive.Size.Medium.toString())); - imageSize.input.choices.push(new Adaptive.Choice("Large", Adaptive.Size.Large.toString())); - imageSize.input.choices.push(new Adaptive.Choice("Stretch", Adaptive.Size.Stretch.toString())); - imageSize.input.defaultValue = this.cardElement.imageSize.toString(); - imageSize.input.onValueChanged = () => { - this.cardElement.imageSize = parseInt(imageSize.input.value); - - this.changed(false); - } - } + static readonly ImageSizeProperty = new EnumPropertyEditor(Versions.v1_0, "imageSize", "Image size", Adaptive.Size); protected internalAddCommands(commands: Array) { super.internalAddCommands(commands); @@ -1806,9 +1838,25 @@ export class ImageSetPeer extends TypedCardElementPeer { }) ); } + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + ImageSetPeer.ImageSizeProperty); + } } export class ImagePeer extends TypedCardElementPeer { + static readonly urlProperty = new StringPropertyEditor(Versions.v1_0, "url", "Url"); + static readonly altTextProperty = new StringPropertyEditor(Versions.v1_0, "altText", "Alternate text"); + static readonly sizeProperty = new EnumPropertyEditor(Versions.v1_0, "size", "Size", Adaptive.Size); + static readonly pixelWidthProperty = new NumberPropertyEditor(Versions.v1_1, "pixelWidth", "Width in pixels"); + static readonly pixelHeightProperty = new NumberPropertyEditor(Versions.v1_1, "pixelHeight", "Height in pixels"); + static readonly styleProperty = new EnumPropertyEditor(Versions.v1_0, "style", "Style", Adaptive.ImageStyle); + static readonly backgroundColorProperty = new StringPropertyEditor(Versions.v1_1, "backgroundColor", "Background color"); + private get isParentImageSet(): boolean { return this.parent && this.parent instanceof ImageSetPeer; } @@ -1834,117 +1882,33 @@ export class ImagePeer extends TypedCardElementPeer { } } - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let url = addLabelAndInput(card, "Url:", Adaptive.TextInput); - url.input.defaultValue = this.cardElement.url; - url.input.onValueChanged = () => { - this.cardElement.url = url.input.value; - - this.changed(false); - } - - let altText = addLabelAndInput(card, "Alternate text:", Adaptive.TextInput); - altText.input.placeholder = "(not set)"; - altText.input.defaultValue = this.cardElement.altText; - altText.input.onValueChanged = () => { - this.cardElement.altText = altText.input.value; - - this.changed(false); - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + ImagePeer.urlProperty, + ImagePeer.altTextProperty); if (!this.isParentImageSet) { - let size = addLabelAndInput(card, "Size:", Adaptive.ChoiceSetInput); - size.input.isCompact = true; - size.input.choices.push(new Adaptive.Choice("Automatic", Adaptive.Size.Auto.toString())); - size.input.choices.push(new Adaptive.Choice("Small", Adaptive.Size.Small.toString())); - size.input.choices.push(new Adaptive.Choice("Medium", Adaptive.Size.Medium.toString())); - size.input.choices.push(new Adaptive.Choice("Large", Adaptive.Size.Large.toString())); - size.input.choices.push(new Adaptive.Choice("Stretch", Adaptive.Size.Stretch.toString())); - size.input.defaultValue = this.cardElement.size.toString(); - size.input.onValueChanged = () => { - this.cardElement.size = parseInt(size.input.value); - - this.changed(false); - } - - let width = addLabelAndInput(card, "Width in pixels:", Adaptive.TextInput); - width.input.placeholder = "(not set)"; - - if (this.cardElement.pixelWidth) { - width.input.defaultValue = this.cardElement.pixelWidth.toString(); - } - - width.input.onValueChanged = () => { - try { - this.cardElement.pixelWidth = parseInt(width.input.value); - } - catch (e) { - this.cardElement.pixelWidth = null; - } - - this.changed(false); - } - - let height = addLabelAndInput(card, "Height in pixels:", Adaptive.TextInput); - height.input.placeholder = "(not set)"; - - if (this.cardElement.pixelHeight) { - height.input.defaultValue = this.cardElement.pixelHeight.toString(); - } - - height.input.onValueChanged = () => { - try { - this.cardElement.pixelHeight = parseInt(height.input.value); - } - catch (e) { - this.cardElement.pixelHeight = null; - } - - this.changed(false); - } - - let style = addLabelAndInput(card, "Style:", Adaptive.ChoiceSetInput); - style.input.isCompact = true; - style.input.choices.push(new Adaptive.Choice("Default", Adaptive.ImageStyle.Default.toString())); - style.input.choices.push(new Adaptive.Choice("Person", Adaptive.ImageStyle.Person.toString())); - style.input.defaultValue = this.cardElement.style.toString(); - style.input.onValueChanged = () => { - this.cardElement.style = parseInt(style.input.value); - - this.changed(false); - } - - let backgroundColor = addLabelAndInput(card, "Background color:", Adaptive.TextInput); - backgroundColor.input.placeholder = "(not set) Format: #RRGGBB"; - backgroundColor.input.defaultValue = this.cardElement.backgroundColor; - backgroundColor.input.onValueChanged = () => { - this.cardElement.backgroundColor = backgroundColor.input.value; - - this.changed(false); - } - - let actionSelector = createActionSelector( - "Select action", - card, - [ Adaptive.ShowCardAction.JsonTypeName ], - this.cardElement.selectAction ? this.cardElement.selectAction.getJsonTypeName() : "none"); + propertySheet.add( + PropertySheetCategory.LayoutCategory, + ImagePeer.sizeProperty, + ImagePeer.pixelWidthProperty, + ImagePeer.pixelHeightProperty); - actionSelector.input.onValueChanged = () => { - if (actionSelector.input.value == "none") { - this.cardElement.selectAction = null; - } - else { - this.cardElement.selectAction = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(actionSelector.input.value); - } + propertySheet.add( + PropertySheetCategory.StyleCategory, + ImagePeer.styleProperty, + ImagePeer.backgroundColorProperty); - this.changed(true); - } + propertySheet.add( + "Selection action", + ContainerPeer.selectActionProperty); if (this.cardElement.selectAction) { let selectActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.selectAction); - selectActionPeer.internalAddPropertySheetEntries(card, false); + selectActionPeer.populatePropertySheet(propertySheet, "Selection action"); selectActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; } } @@ -1952,6 +1916,19 @@ export class ImagePeer extends TypedCardElementPeer { } export class MediaPeer extends TypedCardElementPeer { + static readonly altTextProperty = new StringPropertyEditor(Versions.v1_1, "altText", "Alternate text"); + static readonly posterUrlProperty = new StringPropertyEditor(Versions.v1_1, "posterUrl", "Poster URL"); + static readonly sourcesProperty = new NameValuePairPropertyEditor( + Versions.v1_1, + "sources", + "url", + "mimeType", + (name: string, value: string) => { return new Adaptive.MediaSource(name, value); }, + "URL", + "MIME type", + "Add a new source", + "No source has been defined."); + protected internalGetTreeItemText(): string { if (this.cardElement.selectedMediaType == "audio") { return "audio"; @@ -1964,56 +1941,31 @@ export class MediaPeer extends TypedCardElementPeer { } } - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let altText = addLabelAndInput(card, "Alternate text:", Adaptive.TextInput); - altText.input.placeholder = "(not set)"; - altText.input.defaultValue = this.cardElement.altText; - altText.input.onValueChanged = () => { - this.cardElement.altText = altText.input.value; - - this.changed(false); - } - - var posterUrl = addLabelAndInput(card, "Poster URL:", Adaptive.TextInput); - posterUrl.input.placeholder = "(not set)"; - posterUrl.input.defaultValue = this.cardElement.poster; - posterUrl.input.onValueChanged = () => { - this.cardElement.poster = posterUrl.input.value; - - this.changed(false); - } - - let sourcesEditor = new NameValuePairEditor(); - sourcesEditor.title = "Sources:"; - sourcesEditor.addButtonTitle = "Add a new source"; - sourcesEditor.messageIfEmpty = "No source has been defined."; - sourcesEditor.nameInputTitle = "URL"; - sourcesEditor.valueInputTitle = "MIME type"; - - for (let source of this.cardElement.sources) { - sourcesEditor.nameValuePairs.push({ "name": source.url, "value": source.mimeType }); - } - - sourcesEditor.onChanged = (sender, refreshPropertySheet) => { - this.cardElement.sources = []; - - for (let nameValuePair of sender.nameValuePairs) { - this.cardElement.sources.push(new Adaptive.MediaSource(nameValuePair.name, nameValuePair.value)); - } - - this.changed(refreshPropertySheet); - }; + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + MediaPeer.altTextProperty, + MediaPeer.posterUrlProperty); - card.addItem(sourcesEditor.render()); + propertySheet.add( + "Sources", + MediaPeer.sourcesProperty); } } export class FactSetPeer extends TypedCardElementPeer { - protected getExcludedProperties(): Array { - return [ "horizontalAlignment" ]; - } + static readonly factsProperty = new NameValuePairPropertyEditor( + Versions.v1_0, + "facts", + "name", + "value", + (name: string, value: string) => { return new Adaptive.Fact(name, value); }, + "Name", + "Value", + "Add a new fact", + "This FactSet is empty."); protected internalGetTreeItemText(): string { if (this.cardElement.facts.length == 0) { @@ -2038,71 +1990,43 @@ export class FactSetPeer extends TypedCardElementPeer { ); } - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let factsEditor = new NameValuePairEditor(); - factsEditor.title = "Facts:"; - factsEditor.addButtonTitle = "Add a new fact"; - factsEditor.messageIfEmpty = "This FactSet is empty."; - - for (let fact of this.cardElement.facts) { - factsEditor.nameValuePairs.push({ "name": fact.name, "value": fact.value }); - } - - factsEditor.onChanged = (sender, refreshPropertySheet) => { - this.cardElement.facts = []; - - for (let nameValuePair of sender.nameValuePairs) { - this.cardElement.facts.push(new Adaptive.Fact(nameValuePair.name, nameValuePair.value)); - } - - this.changed(refreshPropertySheet); - }; + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + "Facts", + FactSetPeer.factsProperty); - card.addItem(factsEditor.render()); + propertySheet.remove(CardElementPeer.horizontalAlignmentProperty); } } export abstract class InputPeer extends TypedCardElementPeer { - protected getExcludedProperties(): Array { - return [ "horizontalAlignment", "height" ]; - } - - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let title = addLabelAndInput(card, "Title:", Adaptive.TextInput); - title.input.placeholder = "(not set)"; - title.input.defaultValue = this.cardElement.title; - title.input.onValueChanged = () => { - this.cardElement.title = title.input.value; - - this.changed(false); - } - - if (Adaptive.AdaptiveCard.useBuiltInInputValidation) { - let validationNecessity = addLabelAndInput(card, "Necessity:", Adaptive.ChoiceSetInput); - validationNecessity.input.isCompact = true; - validationNecessity.input.choices.push(new Adaptive.Choice("Optional", Adaptive.InputValidationNecessity.Optional.toString())); - validationNecessity.input.choices.push(new Adaptive.Choice("Required", Adaptive.InputValidationNecessity.Required.toString())); - validationNecessity.input.choices.push(new Adaptive.Choice("Required with visual cue", Adaptive.InputValidationNecessity.RequiredWithVisualCue.toString())); - validationNecessity.input.defaultValue = this.cardElement.validation.necessity.toString(); - validationNecessity.input.onValueChanged = () => { - this.cardElement.validation.necessity = parseInt(validationNecessity.input.value); - - this.changed(false); - } + static readonly titleProperty = new StringPropertyEditor(Versions.v1_0, "title", "Title"); + static readonly defaultValueProperty = new StringPropertyEditor(Versions.v1_0, "defaultValue", "Default value"); + static readonly validationProperty = new CompoundPropertyEditor( + Versions.vNext, + "validation", + [ + new EnumPropertyEditor(Versions.vNext, "necessity", "Necessity", Adaptive.InputValidationNecessity), + new StringPropertyEditor(Versions.vNext, "errorMessage", "Error message") + ] + ); + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + InputPeer.titleProperty); - let validationErrorMessage = addLabelAndInput(card, "Error message:", Adaptive.TextInput); - validationErrorMessage.input.placeholder = "(not set)"; - validationErrorMessage.input.defaultValue = this.cardElement.validation.errorMessage; - validationErrorMessage.input.onValueChanged = () => { - this.cardElement.validation.errorMessage = validationErrorMessage.input.value; + propertySheet.add( + "Validation", + InputPeer.validationProperty); - this.changed(false); - } - } + propertySheet.remove( + CardElementPeer.horizontalAlignmentProperty, + CardElementPeer.heightProperty); } initializeCardElement() { @@ -2113,307 +2037,153 @@ export abstract class InputPeer extends TypedCard } export class TextInputPeer extends InputPeer { - initializeCardElement() { - super.initializeCardElement(); - - this.cardElement.placeholder = "Placeholder text"; - } - - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let placeholder = addLabelAndInput(card, "Placeholder:", Adaptive.TextInput); - placeholder.input.placeholder = "(not set)"; - placeholder.input.defaultValue = this.cardElement.placeholder; - placeholder.input.onValueChanged = () => { - this.cardElement.placeholder = placeholder.input.value; - - this.changed(false); - } + static readonly placeholderProperty = new StringPropertyEditor(Versions.v1_0, "placeholder", "Placeholder"); + static readonly isMultilineProperty = new BooleanPropertyEditor(Versions.v1_0, "isMultiline", "Multi-line", true); + static readonly styleProperty = new EnumPropertyEditor(Versions.v1_0, "style", "Style", Adaptive.InputTextStyle); + static readonly inlineActionProperty = new ActionPropertyEditor(Versions.v1_2, "inlineAction", "Action type", [ Adaptive.ShowCardAction.JsonTypeName ], true); - let isMultiline = addLabelAndInput(card, "Multi-line:", Adaptive.ToggleInput); - isMultiline.input.defaultValue = String(this.cardElement.isMultiline); - isMultiline.input.onValueChanged = () => { - this.cardElement.isMultiline = isMultiline.input.value == "true"; - - this.changed(true); - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + TextInputPeer.placeholderProperty, + TextInputPeer.isMultilineProperty); if (!this.cardElement.isMultiline) { - let style = addLabelAndInput(card, "Style:", Adaptive.ChoiceSetInput); - style.input.isCompact = true; - style.input.choices.push(new Adaptive.Choice("Text", Adaptive.InputTextStyle.Text.toString())); - style.input.choices.push(new Adaptive.Choice("Email", Adaptive.InputTextStyle.Email.toString())); - style.input.choices.push(new Adaptive.Choice("Telephone", Adaptive.InputTextStyle.Tel.toString())); - style.input.choices.push(new Adaptive.Choice("Url", Adaptive.InputTextStyle.Url.toString())); - style.input.defaultValue = this.cardElement.style.toString(); - style.input.onValueChanged = () => { - this.cardElement.style = parseInt(style.input.value); - - this.changed(false); - } + propertySheet.add( + PropertySheetCategory.DefaultCategory, + TextInputPeer.styleProperty); } - let actionSelector = createActionSelector( + propertySheet.add( "Inline action", - card, - [ Adaptive.ShowCardAction.JsonTypeName ], - this.cardElement.inlineAction ? this.cardElement.inlineAction.getJsonTypeName() : "none"); - - actionSelector.input.onValueChanged = () => { - if (actionSelector.input.value == "none") { - this.cardElement.inlineAction = null; - } - else { - this.cardElement.inlineAction = Adaptive.AdaptiveCard.actionTypeRegistry.createInstance(actionSelector.input.value); - } - - this.changed(true); - } + TextInputPeer.inlineActionProperty); if (this.cardElement.inlineAction) { let inlineActionPeer = CardDesignerSurface.actionPeerRegistry.createPeerInstance(this.designerSurface, null, this.cardElement.inlineAction); - inlineActionPeer.internalAddPropertySheetEntries(card, false); + inlineActionPeer.populatePropertySheet(propertySheet, "Inline action"); inlineActionPeer.onChanged = (sender: DesignerPeer, updatePropertySheet: boolean) => { this.changed(updatePropertySheet); }; } - let defaultValue = addLabelAndInput(card, "Default value:", Adaptive.TextInput); - defaultValue.input.placeholder = "(not set)"; - defaultValue.input.defaultValue = this.cardElement.defaultValue; - defaultValue.input.onValueChanged = () => { - this.cardElement.defaultValue = defaultValue.input.value; - - this.changed(false); - } + propertySheet.add( + defaultCategory, + TextInputPeer.defaultValueProperty); } -} -export class NumberInputPeer extends InputPeer { initializeCardElement() { super.initializeCardElement(); this.cardElement.placeholder = "Placeholder text"; } +} - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let placeholder = addLabelAndInput(card, "Placeholder:", Adaptive.TextInput); - placeholder.input.placeholder = "(not set)"; - placeholder.input.defaultValue = this.cardElement.placeholder; - placeholder.input.onValueChanged = () => { - this.cardElement.placeholder = placeholder.input.value; - - this.changed(false); - } - - let defaultValue = addLabelAndInput(card, "Default value:", Adaptive.TextInput); - defaultValue.input.placeholder = "(not set)"; - defaultValue.input.defaultValue = this.cardElement.defaultValue; - defaultValue.input.onValueChanged = () => { - this.cardElement.defaultValue = defaultValue.input.value; - - this.changed(false); - } - - let min = addLabelAndInput(card, "Minimum value:", Adaptive.TextInput); - min.input.placeholder = "(not set)"; - min.input.defaultValue = this.cardElement.min; - min.input.onValueChanged = () => { - this.cardElement.min = min.input.value; +export class NumberInputPeer extends InputPeer { + static readonly placeholderProperty = new StringPropertyEditor(Versions.v1_0, "placeholder", "Placeholder"); + static readonly minProperty = new StringPropertyEditor(Versions.v1_0, "min", "Maximum value"); + static readonly maxProperty = new StringPropertyEditor(Versions.v1_0, "max", "Maximum value"); - this.changed(false); - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + NumberInputPeer.placeholderProperty, + NumberInputPeer.defaultValueProperty, + NumberInputPeer.minProperty, + NumberInputPeer.maxProperty); + } - let max = addLabelAndInput(card, "Maximum value:", Adaptive.TextInput); - max.input.placeholder = "(not set)"; - max.input.defaultValue = this.cardElement.max; - max.input.onValueChanged = () => { - this.cardElement.max = max.input.value; + initializeCardElement() { + super.initializeCardElement(); - this.changed(false); - } + this.cardElement.placeholder = "Placeholder text"; } } export class DateInputPeer extends InputPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); + static readonly minProperty = new StringPropertyEditor(Versions.v1_0, "min", "Maximum value"); + static readonly maxProperty = new StringPropertyEditor(Versions.v1_0, "max", "Maximum value"); - let defaultValue = addLabelAndInput(card, "Default value:", Adaptive.TextInput); - defaultValue.input.placeholder = "(not set)"; - defaultValue.input.defaultValue = this.cardElement.defaultValue; - defaultValue.input.onValueChanged = () => { - this.cardElement.defaultValue = defaultValue.input.value; - - this.changed(false); - } - - let min = addLabelAndInput(card, "Minimum value:", Adaptive.TextInput); - min.input.placeholder = "(not set)"; - min.input.defaultValue = this.cardElement.min; - min.input.onValueChanged = () => { - this.cardElement.min = min.input.value; - - this.changed(false); - } - - let max = addLabelAndInput(card, "Maximum value:", Adaptive.TextInput); - max.input.placeholder = "(not set)"; - max.input.defaultValue = this.cardElement.max; - max.input.onValueChanged = () => { - this.cardElement.max = max.input.value; - - this.changed(false); - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + DateInputPeer.defaultValueProperty, + DateInputPeer.minProperty, + DateInputPeer.maxProperty); } } export class TimeInputPeer extends InputPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let defaultValue = addLabelAndInput(card, "Default value:", Adaptive.TextInput); - defaultValue.input.placeholder = "(not set)"; - defaultValue.input.defaultValue = this.cardElement.defaultValue; - defaultValue.input.onValueChanged = () => { - this.cardElement.defaultValue = defaultValue.input.value; - - this.changed(false); - } - - let min = addLabelAndInput(card, "Minimum value:", Adaptive.TextInput); - min.input.placeholder = "(not set)"; - min.input.defaultValue = this.cardElement.min; - min.input.onValueChanged = () => { - this.cardElement.min = min.input.value; - - this.changed(false); - } - - let max = addLabelAndInput(card, "Maximum value:", Adaptive.TextInput); - max.input.placeholder = "(not set)"; - max.input.defaultValue = this.cardElement.max; - max.input.onValueChanged = () => { - this.cardElement.max = max.input.value; + static readonly minProperty = new StringPropertyEditor(Versions.v1_0, "min", "Maximum value"); + static readonly maxProperty = new StringPropertyEditor(Versions.v1_0, "max", "Maximum value"); - this.changed(false); - } + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + TimeInputPeer.defaultValueProperty, + TimeInputPeer.minProperty, + TimeInputPeer.maxProperty); } } export class ToggleInputPeer extends InputPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let valueOn = addLabelAndInput(card, "Value when on:", Adaptive.TextInput); - valueOn.input.placeholder = "(not set)"; - valueOn.input.defaultValue = this.cardElement.valueOn; - valueOn.input.onValueChanged = () => { - this.cardElement.valueOn = valueOn.input.value; - - this.changed(false); - } - - let valueOff = addLabelAndInput(card, "Value when off:", Adaptive.TextInput); - valueOff.input.placeholder = "(not set)"; - valueOff.input.defaultValue = this.cardElement.valueOff; - valueOff.input.onValueChanged = () => { - this.cardElement.valueOff = valueOff.input.value; - - this.changed(false); - } + static readonly valueOnProperty = new StringPropertyEditor(Versions.v1_0, "valueOn", "Value when on"); + static readonly valueOffProperty = new StringPropertyEditor(Versions.v1_0, "valueOff", "Value when off"); + static readonly wrapProperty = new BooleanPropertyEditor(Versions.v1_2, "wrap", "Wrap"); - let wrap = addLabelAndInput(card, "Wrap:", Adaptive.ToggleInput); - wrap.input.defaultValue = String(this.cardElement.wrap); - wrap.input.onValueChanged = () => { - this.cardElement.wrap = wrap.input.value == "true"; - - this.changed(false); - } - - let defaultValue = addLabelAndInput(card, "Default value:", Adaptive.TextInput); - defaultValue.input.placeholder = "(not set)"; - defaultValue.input.defaultValue = this.cardElement.defaultValue; - defaultValue.input.onValueChanged = () => { - this.cardElement.defaultValue = defaultValue.input.value; + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + ToggleInputPeer.valueOnProperty, + ToggleInputPeer.valueOnProperty, + ToggleInputPeer.defaultValueProperty); - this.changed(false); - } + propertySheet.add( + PropertySheetCategory.LayoutCategory, + ToggleInputPeer.wrapProperty); } } export class ChoiceSetInputPeer extends InputPeer { - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let placeholder = addLabelAndInput(card, "Placeholder:", Adaptive.TextInput); - placeholder.input.placeholder = "(not set)"; - placeholder.input.defaultValue = this.cardElement.placeholder; - placeholder.input.onValueChanged = () => { - this.cardElement.placeholder = placeholder.input.value; - - this.changed(false); - } - - let isMultiSelect = addLabelAndInput(card, "Allow multi selection:", Adaptive.ToggleInput); - isMultiSelect.input.defaultValue = String(this.cardElement.isMultiSelect); - isMultiSelect.input.onValueChanged = () => { - this.cardElement.isMultiSelect = isMultiSelect.input.value == "true"; - - this.changed(true); - } - - if (!this.cardElement.isMultiSelect) { - let isCompact = addLabelAndInput(card, "Compact style:", Adaptive.ToggleInput); - isCompact.input.defaultValue = String(this.cardElement.isCompact); - isCompact.input.onValueChanged = () => { - this.cardElement.isCompact = isCompact.input.value == "true"; - - this.changed(true); - } - } - - if (!this.cardElement.isCompact) { - let wrap = addLabelAndInput(card, "Wrap:", Adaptive.ToggleInput); - wrap.input.defaultValue = String(this.cardElement.wrap); - wrap.input.onValueChanged = () => { - this.cardElement.wrap = wrap.input.value == "true"; - - this.changed(false); - } - } + static readonly placeholderProperty = new StringPropertyEditor(Versions.v1_0, "placeholder", "Placeholder"); + static readonly isMultiselectProperty = new BooleanPropertyEditor(Versions.v1_0, "isMultiSelect", "Allow multi selection"); + static readonly isCompactProperty = new BooleanPropertyEditor(Versions.v1_0, "isCompact", "Compact style"); + static readonly wrapProperty = new BooleanPropertyEditor(Versions.v1_2, "wrap", "Wrap"); + static readonly choicesProperty = new NameValuePairPropertyEditor( + Versions.v1_0, + "choices", + "name", + "value", + (name: string, value: string) => { return new Adaptive.Choice(name, value); }, + "Title", + "Value", + "Add a new choice", + "This ChoiceSet is empty"); + + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); - let defaultValue = addLabelAndInput(card, "Default value:", Adaptive.TextInput); - defaultValue.input.placeholder = "(not set)"; - defaultValue.input.defaultValue = this.cardElement.defaultValue; - defaultValue.input.onValueChanged = () => { - this.cardElement.defaultValue = defaultValue.input.value; - - this.changed(false); - } - - let choicesEditor = new NameValuePairEditor(); - choicesEditor.title = "Choices:"; - choicesEditor.addButtonTitle = "Add a new choice"; - choicesEditor.messageIfEmpty = "This ChoiceSet is empty."; - choicesEditor.nameInputTitle = "Title"; + propertySheet.add( + defaultCategory, + ChoiceSetInputPeer.placeholderProperty, + ChoiceSetInputPeer.isMultiselectProperty, + ChoiceSetInputPeer.isCompactProperty, + ChoiceSetInputPeer.defaultValueProperty); - for (let choice of this.cardElement.choices) { - choicesEditor.nameValuePairs.push({ "name": choice.title, "value": choice.value }); - } - - choicesEditor.onChanged = (sender, refreshPropertySheet) => { - this.cardElement.choices = []; - - for (let nameValuePair of sender.nameValuePairs) { - this.cardElement.choices.push(new Adaptive.Choice(nameValuePair.name, nameValuePair.value)); - } + propertySheet.add( + PropertySheetCategory.LayoutCategory, + ToggleInputPeer.wrapProperty); - this.changed(refreshPropertySheet); - }; - - card.addItem(choicesEditor.render()); + propertySheet.add( + "Choices", + ChoiceSetInputPeer.choicesProperty); } initializeCardElement() { @@ -2475,6 +2245,15 @@ class TextBlockPeerInplaceEditor extends CardElementPeerInplaceEditor { + static readonly textProperty = new StringPropertyEditor(Versions.v1_0, "text", "Text", true); + static readonly wrapProperty = new BooleanPropertyEditor(Versions.v1_0, "wrap", "Wrap"); + static readonly maxLinesProperty = new NumberPropertyEditor(Versions.v1_0, "maxLines", "Maximum lines", 0); + static readonly fontTypeProperty = new EnumPropertyEditor(Versions.v1_2, "fontType", "Font type", Adaptive.FontType); + static readonly sizeProperty = new EnumPropertyEditor(Versions.v1_0, "size", "Size", Adaptive.TextSize); + static readonly weightProperty = new EnumPropertyEditor(Versions.v1_0, "weight", "Weight", Adaptive.TextWeight); + static readonly colorProperty = new EnumPropertyEditor(Versions.v1_0, "color", "Color", Adaptive.TextColor); + static readonly subtleProperty = new BooleanPropertyEditor(Versions.v1_0, "subtle", "Subtle"); + protected createInplaceEditor(): DesignerPeerInplaceEditor { return new TextBlockPeerInplaceEditor(this.cardElement); } @@ -2483,112 +2262,35 @@ export class TextBlockPeer extends TypedCardElementPeer { return this.cardElement.text; } - getToolTip(): string { - return "Double click to edit"; - } - - internalAddPropertySheetEntries(card: Adaptive.AdaptiveCard, includeHeader: boolean) { - super.internalAddPropertySheetEntries(card, includeHeader); - - let text = addLabelAndInput(card, "Text:", Adaptive.TextInput); - text.input.defaultValue = this.cardElement.text; - text.input.isMultiline = true; - text.input.onValueChanged = () => { - this.cardElement.text = text.input.value; - - this.changed(false); - } - - let wrap = addLabelAndInput(card, "Wrap:", Adaptive.ToggleInput); - wrap.input.defaultValue = String(this.cardElement.wrap); - wrap.input.onValueChanged = () => { - this.cardElement.wrap = wrap.input.value == "true"; - - this.changed(false); - } - - let maxLines = addLabelAndInput(card, "Maximum lines:", Adaptive.NumberInput); - maxLines.input.placeholder = "(not set)"; - maxLines.input.defaultValue = String(this.cardElement.maxLines); - maxLines.input.onValueChanged = () => { - try { - let newMaxLines = parseInt(maxLines.input.value); - - this.cardElement.maxLines = newMaxLines; - - this.changed(false); - } - catch (ex) { - // Do nothing - } - } - - let fontType = addLabelAndInput(card, "Font type:", Adaptive.ChoiceSetInput); - fontType.input.placeholder = "Default"; - fontType.input.isCompact = true; - fontType.input.choices.push(new Adaptive.Choice("Default", Adaptive.FontType.Default.toString())); - fontType.input.choices.push(new Adaptive.Choice("Monospace", Adaptive.FontType.Monospace.toString())); - fontType.input.defaultValue = this.cardElement.fontType ? this.cardElement.fontType.toString() : "Default"; - fontType.input.onValueChanged = () => { - this.cardElement.fontType = parseInt(fontType.input.value); - - this.changed(false); - } - - let size = addLabelAndInput(card, "Size:", Adaptive.ChoiceSetInput); - size.input.isCompact = true; - size.input.choices.push(new Adaptive.Choice("Small", Adaptive.TextSize.Small.toString())); - size.input.choices.push(new Adaptive.Choice("Default", Adaptive.TextSize.Default.toString())); - size.input.choices.push(new Adaptive.Choice("Medium", Adaptive.TextSize.Medium.toString())); - size.input.choices.push(new Adaptive.Choice("Large", Adaptive.TextSize.Large.toString())); - size.input.choices.push(new Adaptive.Choice("Extra large", Adaptive.TextSize.ExtraLarge.toString())); - size.input.defaultValue = this.cardElement.size.toString(); - size.input.onValueChanged = () => { - this.cardElement.size = parseInt(size.input.value); - - this.changed(false); - } - - let weight = addLabelAndInput(card, "Weight:", Adaptive.ChoiceSetInput); - weight.input.isCompact = true; - weight.input.choices.push(new Adaptive.Choice("Lighter", Adaptive.TextWeight.Lighter.toString())); - weight.input.choices.push(new Adaptive.Choice("Default", Adaptive.TextWeight.Default.toString())); - weight.input.choices.push(new Adaptive.Choice("Bolder", Adaptive.TextWeight.Bolder.toString())); - weight.input.defaultValue = this.cardElement.weight.toString(); - weight.input.onValueChanged = () => { - this.cardElement.weight = parseInt(weight.input.value); - - this.changed(false); - } - - let color = addLabelAndInput(card, "Color:", Adaptive.ChoiceSetInput); - color.input.isCompact = true; - color.input.choices.push(new Adaptive.Choice("Default", Adaptive.TextColor.Default.toString())); - color.input.choices.push(new Adaptive.Choice("Dark", Adaptive.TextColor.Dark.toString())); - color.input.choices.push(new Adaptive.Choice("Light", Adaptive.TextColor.Light.toString())); - color.input.choices.push(new Adaptive.Choice("Accent", Adaptive.TextColor.Accent.toString())); - color.input.choices.push(new Adaptive.Choice("Good", Adaptive.TextColor.Good.toString())); - color.input.choices.push(new Adaptive.Choice("Warning", Adaptive.TextColor.Warning.toString())); - color.input.choices.push(new Adaptive.Choice("Attention", Adaptive.TextColor.Attention.toString())); - color.input.defaultValue = this.cardElement.color.toString(); - color.input.onValueChanged = () => { - this.cardElement.color = parseInt(color.input.value); + populatePropertySheet(propertySheet: PropertySheet, defaultCategory: string = PropertySheetCategory.DefaultCategory) { + super.populatePropertySheet(propertySheet, defaultCategory); + + propertySheet.add( + defaultCategory, + TextBlockPeer.textProperty); - this.changed(false); - } + propertySheet.add( + PropertySheetCategory.LayoutCategory, + TextBlockPeer.wrapProperty, + TextBlockPeer.maxLinesProperty); - let isSubtle = addLabelAndInput(card, "Subtle:", Adaptive.ToggleInput); - isSubtle.input.defaultValue = String(this.cardElement.isSubtle); - isSubtle.input.title = ""; - isSubtle.input.onValueChanged = () => { - this.cardElement.isSubtle = isSubtle.input.value == "true"; + propertySheet.add( + PropertySheetCategory.StyleCategory, + TextBlockPeer.fontTypeProperty, + TextBlockPeer.sizeProperty, + TextBlockPeer.weightProperty, + TextBlockPeer.colorProperty, + TextBlockPeer.subtleProperty); + } - this.changed(false); - } + getToolTip(): string { + return "Double click to edit"; } initializeCardElement() { - this.cardElement.text = "New TextBlock"; + if (!this.cardElement.text || this.cardElement.text == "") { + this.cardElement.text = "New TextBlock"; + } } } @@ -2597,17 +2299,25 @@ export class RichTextBlockPeer extends TypedCardElementPeer { + let infoTextBlock = new Adaptive.TextBlock(); + infoTextBlock.text = "Use the **Card Payload Editor** to edit the text of this RichTextBlock element."; + infoTextBlock.wrap = true; + infoTextBlock.spacing = Adaptive.Spacing.Large; + infoTextBlock.separator = true; + infoTextBlock.horizontalAlignment = Adaptive.HorizontalAlignment.Center; + + return infoTextBlock; + } + ) + ); } initializeCardElement() { @@ -2616,4 +2326,4 @@ export class RichTextBlockPeer extends TypedCardElementPeer void = null; + + title: string; + width: string; + height: string; + + open() { + if (!this._isOpen) { + this._overlayElement = document.createElement("div"); + this._overlayElement.className = "acd-dialog-overlay"; + + let dialogFrameElement = document.createElement("div"); + dialogFrameElement.className = "acd-dialog-frame"; + dialogFrameElement.style.width = this.width; + dialogFrameElement.style.height = this.height; + + let content = this.renderContent(); + content.style.flex = "1 1 auto"; + + dialogFrameElement.appendChild(content); + + this._overlayElement.appendChild(dialogFrameElement); + + document.body.appendChild(this._overlayElement); + + this._isOpen = true; + } + } + + close() { + if (this._isOpen) { + document.body.removeChild(this._overlayElement); + + this._isOpen = false; + + if (this.onClose) { + this.onClose(this); + } + } + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/downloader.ts b/source/nodejs/adaptivecards-designer/src/downloader.ts new file mode 100644 index 0000000000..874aae2b53 --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/downloader.ts @@ -0,0 +1,44 @@ +export class Downloader { + private _data: string; + + private error() { + if (this.onError) { + this.onError(this); + } + } + + private success() { + if (this.onSuccess) { + this.onSuccess(this); + } + } + + onError: (sender: Downloader) => void = null; + onSuccess: (sender: Downloader) => void = null; + + constructor(readonly url: string) {} + + download() { + let request = new XMLHttpRequest(); + request.onerror = () => { + this.error(); + } + request.onload = () => { + this._data = request.responseText; + + this.success(); + }; + + try { + request.open("GET", this.url, true); + request.send(); + } + catch (e) { + this.error(); + } + } + + get data(): string { + return this._data; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/draggable-element.ts b/source/nodejs/adaptivecards-designer/src/draggable-element.ts index 9199a5fa13..6d5c5ed9bc 100644 --- a/source/nodejs/adaptivecards-designer/src/draggable-element.ts +++ b/source/nodejs/adaptivecards-designer/src/draggable-element.ts @@ -12,7 +12,7 @@ export abstract class DraggableElement { private _dragging: boolean; private releasePointerCapture(pointerId: number) { - this.renderedElement.releasePointerCapture(pointerId); + this.getDragSourceElement().releasePointerCapture(pointerId); this._isPointerDown = false; } @@ -44,7 +44,7 @@ export abstract class DraggableElement { this._isPointerDown = true; this._lastClickedPoint = { x: e.offsetX, y: e.offsetY }; - this.renderedElement.setPointerCapture(e.pointerId); + this.getDragSourceElement().setPointerCapture(e.pointerId); } } @@ -66,6 +66,12 @@ export abstract class DraggableElement { } } + protected click(e: MouseEvent) { + if (this.onClick) { + this.onDoubleClick(this); + } + } + protected doubleClick(e: MouseEvent) { if (this.onDoubleClick) { this.onDoubleClick(this); @@ -80,10 +86,15 @@ export abstract class DraggableElement { // Do nothing in base implementation } + protected getDragSourceElement(): HTMLElement { + return this._renderedElement; + } + protected abstract internalRender(): HTMLElement; onStartDrag: (sender: DraggableElement) => void; onEndDrag: (sender: DraggableElement) => void; + onClick: (sender: DraggableElement) => void; onDoubleClick: (sender: DraggableElement) => void; isDraggable(): boolean { @@ -105,17 +116,23 @@ export abstract class DraggableElement { this.internalUpdateLayout(); } - render() { + render(): HTMLElement { this._renderedElement = this.internalRender(); - this._renderedElement.onmousedown = (e: MouseEvent) => { e.preventDefault(); }; - this._renderedElement.ondblclick = (e: MouseEvent) => { this.doubleClick(e); }; + let dragSourceElement = this.getDragSourceElement(); + dragSourceElement.onclick = (e: MouseEvent) => { this.click(e); }; + dragSourceElement.ondblclick = (e: MouseEvent) => { this.doubleClick(e); }; + + if (this.isDraggable()) { + dragSourceElement.onmousedown = (e: MouseEvent) => { e.preventDefault(); }; + dragSourceElement.onpointerenter = () => { this.isPointerOver = true; }; + dragSourceElement.onpointerleave = () => { this.isPointerOver = false; }; + dragSourceElement.onpointerdown = (e: PointerEvent) => { this.pointerDown(e); }; + dragSourceElement.onpointerup = (e: PointerEvent) => { this.pointerUp(e); }; + dragSourceElement.onpointermove = (e: PointerEvent) => { this.pointerMove(e); }; + } - this._renderedElement.onpointerenter = () => { this.isPointerOver = true; }; - this._renderedElement.onpointerleave = () => { this.isPointerOver = false; }; - this._renderedElement.onpointerdown = (e: PointerEvent) => { this.pointerDown(e); }; - this._renderedElement.onpointerup = (e: PointerEvent) => { this.pointerUp(e); }; - this._renderedElement.onpointermove = (e: PointerEvent) => { this.pointerMove(e); }; + return this._renderedElement; } get renderedElement(): HTMLElement { diff --git a/source/nodejs/adaptivecards-designer/src/miscellaneous.ts b/source/nodejs/adaptivecards-designer/src/miscellaneous.ts index 02832344bc..db550e76ac 100644 --- a/source/nodejs/adaptivecards-designer/src/miscellaneous.ts +++ b/source/nodejs/adaptivecards-designer/src/miscellaneous.ts @@ -1,5 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +import * as Adaptive from "adaptivecards"; + export interface IPoint { x: number; y: number; @@ -59,3 +61,284 @@ export class Utils { }).filter(x => x.length).join('/') } } + +export var defaultHostConfig = new Adaptive.HostConfig( + { + preExpandSingleShowCardAction: true, + supportsInteractivity: true, + spacing: { + small: 10, + default: 20, + medium: 30, + large: 40, + extraLarge: 50, + padding: 20 + }, + separator: { + lineThickness: 1, + lineColor: "#EEEEEE" + }, + textAlign: { + right: "right" + }, + imageSizes: { + small: 40, + medium: 80, + large: 160 + }, + fontStyles: { + default: { + fontFamily: "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif", + fontSizes: { + small: 12, + default: 14, + medium: 17, + large: 21, + extraLarge: 26 + }, + fontWeights: { + lighter: 200, + default: 400, + bolder: 600 + } + }, + monospace: { + fontFamily: "'Courier New', Courier, monospace", + fontSizes: { + small: 12, + default: 14, + medium: 17, + large: 21, + extraLarge: 26 + }, + fontWeights: { + lighter: 200, + default: 400, + bolder: 600 + } + } + }, + containerStyles: { + default: { + backgroundColor: "#f9f9f9", + foregroundColors: { + default: { + default: "#333333", + subtle: "#EE333333" + }, + accent: { + default: "#2E89FC", + subtle: "#882E89FC" + }, + attention: { + default: "#cc3300", + subtle: "#DDcc3300" + }, + good: { + default: "#54a254", + subtle: "#DD54a254" + }, + warning: { + default: "#e69500", + subtle: "#DDe69500" + } + } + }, + emphasis: { + backgroundColor: "#08000000", + foregroundColors: { + default: { + default: "#333333", + subtle: "#EE333333" + }, + accent: { + default: "#2E89FC", + subtle: "#882E89FC" + }, + attention: { + default: "#cc3300", + subtle: "#DDcc3300" + }, + good: { + default: "#54a254", + subtle: "#DD54a254" + }, + warning: { + default: "#e69500", + subtle: "#DDe69500" + } + } + }, + accent: { + backgroundColor: "#C7DEF9", + foregroundColors: { + default: { + default: "#333333", + subtle: "#EE333333" + }, + dark: { + default: "#000000", + subtle: "#66000000" + }, + light: { + default: "#FFFFFF", + subtle: "#33000000" + }, + accent: { + default: "#2E89FC", + subtle: "#882E89FC" + }, + attention: { + default: "#cc3300", + subtle: "#DDcc3300" + }, + good: { + default: "#54a254", + subtle: "#DD54a254" + }, + warning: { + default: "#e69500", + subtle: "#DDe69500" + } + } + }, + good: { + backgroundColor: "#CCFFCC", + foregroundColors: { + default: { + default: "#333333", + subtle: "#EE333333" + }, + dark: { + default: "#000000", + subtle: "#66000000" + }, + light: { + default: "#FFFFFF", + subtle: "#33000000" + }, + accent: { + default: "#2E89FC", + subtle: "#882E89FC" + }, + attention: { + default: "#cc3300", + subtle: "#DDcc3300" + }, + good: { + default: "#54a254", + subtle: "#DD54a254" + }, + warning: { + default: "#e69500", + subtle: "#DDe69500" + } + } + }, + attention: { + backgroundColor: "#FFC5B2", + foregroundColors: { + default: { + default: "#333333", + subtle: "#EE333333" + }, + dark: { + default: "#000000", + subtle: "#66000000" + }, + light: { + default: "#FFFFFF", + subtle: "#33000000" + }, + accent: { + default: "#2E89FC", + subtle: "#882E89FC" + }, + attention: { + default: "#cc3300", + subtle: "#DDcc3300" + }, + good: { + default: "#54a254", + subtle: "#DD54a254" + }, + warning: { + default: "#e69500", + subtle: "#DDe69500" + } + } + }, + warning: { + backgroundColor: "#FFE2B2", + foregroundColors: { + default: { + default: "#333333", + subtle: "#EE333333" + }, + dark: { + default: "#000000", + subtle: "#66000000" + }, + light: { + default: "#FFFFFF", + subtle: "#33000000" + }, + accent: { + default: "#2E89FC", + subtle: "#882E89FC" + }, + attention: { + default: "#cc3300", + subtle: "#DDcc3300" + }, + good: { + default: "#54a254", + subtle: "#DD54a254" + }, + warning: { + default: "#e69500", + subtle: "#DDe69500" + } + } + } + }, + actions: { + maxActions: 5, + spacing: Adaptive.Spacing.Default, + buttonSpacing: 10, + showCard: { + actionMode: Adaptive.ShowCardActionMode.Inline, + inlineTopMargin: 16 + }, + actionsOrientation: Adaptive.Orientation.Horizontal, + actionAlignment: Adaptive.ActionAlignment.Left + }, + adaptiveCard: { + allowCustomStyle: true + }, + imageSet: { + imageSize: Adaptive.Size.Medium, + maxImageHeight: 100 + }, + factSet: { + title: { + color: Adaptive.TextColor.Default, + size: Adaptive.TextSize.Default, + isSubtle: false, + weight: Adaptive.TextWeight.Bolder, + wrap: true, + maxWidth: 150, + }, + value: { + color: Adaptive.TextColor.Default, + size: Adaptive.TextSize.Default, + isSubtle: false, + weight: Adaptive.TextWeight.Default, + wrap: true, + }, + spacing: 10 + } + } +); + +defaultHostConfig.cssClassNamePrefix = "default"; diff --git a/source/nodejs/adaptivecards-designer/src/sample-picker-dialog.ts b/source/nodejs/adaptivecards-designer/src/sample-picker-dialog.ts new file mode 100644 index 0000000000..43cfb8979e --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/sample-picker-dialog.ts @@ -0,0 +1,193 @@ +import { parseCatalogue, CatalogueEntry } from "./catalogue"; +import * as ACData from "adaptivecards-templating"; +import * as Adaptive from "adaptivecards"; +import { Dialog } from "./dialog"; +import { defaultHostConfig } from "./miscellaneous"; +import { Downloader } from "./downloader"; + +export class SamplePickerDialog extends Dialog { + private _renderedElement: HTMLElement; + private _selectedSample: CatalogueEntry; + + private renderMessage(message: string) { + let templatePayload = { + type: "AdaptiveCard", + version: "1.0", + body: [ + { + type: "TextBlock", + text: "**{title}**", + size: "large" + }, + { + type: "Container", + verticalContentAlignment: "center", + height: "stretch", + items: [ + { + type: "TextBlock", + text: "{message}", + horizontalAlignment: "center", + wrap: true + } + ] + }, + { + type: "ActionSet", + horizontalAlignment: "right", + actions: [ + { + type: "Action.Submit", + id: "cancel", + title: "Cancel" + } + ] + } + ] + }; + + let template = new ACData.Template(templatePayload); + + let context = new ACData.EvaluationContext(); + context.$root = { + title: this.title, + message: message + }; + + let expandedCardPayload = template.expand(context); + + let card = new Adaptive.AdaptiveCard(); + card.hostConfig = defaultHostConfig; + card.onExecuteAction = (action: Adaptive.Action) => { + if (action.id == "cancel") { + this.close(); + } + } + + card.parse(expandedCardPayload); + + let renderedCard = card.render(); + renderedCard.style.height = "100%"; + + this._renderedElement.innerHTML = ""; + this._renderedElement.appendChild(renderedCard); + } + + private renderCatalogue(catalogue: CatalogueEntry[]) { + let templatePayload = { + type: "AdaptiveCard", + version: "1.0", + body: [ + { + type: "TextBlock", + text: "**{title}**", + size: "large" + }, + { + type: "Container", + height: "stretch", + allowVerticalOverflow: true, + items: [ + { + type: "Container", + $data: "{catalogue}", + minHeight: "36px", + verticalContentAlignment: "center", + selectAction: { + type: "Action.Submit", + data: { + catalogueIndex: "{$index}" + } + }, + spacing: "none", + items: [ + { + type: "TextBlock", + text: "{displayName}", + size: "medium" + } + ] + } + ] + }, + { + type: "ActionSet", + horizontalAlignment: "right", + actions: [ + { + type: "Action.Submit", + id: "cancel", + title: "Cancel" + } + ] + } + ] + }; + + let template = new ACData.Template(templatePayload); + + let context = new ACData.EvaluationContext(); + context.$root = { + title: this.title, + catalogue: catalogue + }; + + let expandedCardPayload = template.expand(context); + + let card = new Adaptive.AdaptiveCard(); + card.hostConfig = defaultHostConfig; + card.onExecuteAction = (action: Adaptive.Action) => { + if (action.id == "cancel") { + this.close(); + } + else if (action instanceof Adaptive.SubmitAction) { + this._selectedSample = catalogue[action.data["catalogueIndex"]]; + + this.close(); + } + } + card.onParseElement = (element: Adaptive.CardElement, json: any, errors?: Adaptive.IValidationError[]) => { + if (element instanceof Adaptive.CardElementContainer) { + element.allowVerticalOverflow = Adaptive.getBoolValue(json["allowVerticalOverflow"], false); + } + } + card.parse(expandedCardPayload); + + let renderedCard = card.render(); + renderedCard.style.height = "100%"; + + this._renderedElement.innerHTML = ""; + this._renderedElement.appendChild(renderedCard); + } + + protected renderContent(): HTMLElement { + this._renderedElement = document.createElement("div"); + this._renderedElement.style.overflow = "auto"; + + this.renderMessage("Loading sample catalogue..."); + + let downloader = new Downloader(this.catalogueUrl); + downloader.onError = () => { this.renderMessage("The catalogue couldn't be loaded. Please try again later."); }; + downloader.onSuccess = () => { + if (!Adaptive.isNullOrEmpty(downloader.data)) { + try { + let catalogue = parseCatalogue(JSON.parse(downloader.data)); + + this.renderCatalogue(catalogue); + } + catch (e) { + this.renderMessage("The catalogue couldn't be loaded. Please try again later."); + } + } + }; + downloader.download(); + + return this._renderedElement; + } + + catalogueUrl: string; + + get selectedSample(): CatalogueEntry { + return this._selectedSample; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/settings-manager.ts b/source/nodejs/adaptivecards-designer/src/settings-manager.ts index ae13b59ddb..b812b5e72d 100644 --- a/source/nodejs/adaptivecards-designer/src/settings-manager.ts +++ b/source/nodejs/adaptivecards-designer/src/settings-manager.ts @@ -40,6 +40,20 @@ export class SettingsManager { } } + static tryLoadStringSetting(name: string): ILoadSettingResult { + if (SettingsManager.isLocalStorageAvailable) { + let returnValue = localStorage.getItem(name); + + return { + succeeded: true, + value: returnValue + }; + } + else { + return { succeeded: false }; + } + } + static tryLoadNumberSetting(name: string): ILoadSettingResult { if (SettingsManager.isLocalStorageAvailable) { let returnValue = localStorage.getItem(name); diff --git a/source/nodejs/adaptivecards-designer/src/shared.ts b/source/nodejs/adaptivecards-designer/src/shared.ts new file mode 100644 index 0000000000..ba6855028c --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/shared.ts @@ -0,0 +1,33 @@ +import * as Adaptive from "adaptivecards"; + +export class GlobalSettings { + static previewFeaturesEnabled: boolean = false; +} + +export type TargetVersion = Adaptive.Version | "*"; + +export class Versions { + static readonly v1_0 = new Adaptive.Version(1, 0); + static readonly v1_1 = new Adaptive.Version(1, 1); + static readonly v1_2 = new Adaptive.Version(1, 2); + static readonly latest = Versions.v1_2; + static readonly vNext = new Adaptive.Version(1000, 0, "vNext"); +} + +export var SupportedTargetVersions: Adaptive.Version[] = [ Versions.v1_0, Versions.v1_1, Versions.v1_2, Versions.vNext ]; + +export function isVersionLessOrEqual(version: TargetVersion, targetVersion: TargetVersion): boolean { + if (version instanceof Adaptive.Version) { + if (targetVersion instanceof Adaptive.Version) { + return targetVersion.compareTo(version) >= 0; + } + else { + // Target version is * + return true; + } + } + else { + // Version is * + return true; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/side-pane.ts b/source/nodejs/adaptivecards-designer/src/side-pane.ts deleted file mode 100644 index 68c7b06dd9..0000000000 --- a/source/nodejs/adaptivecards-designer/src/side-pane.ts +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { SettingsManager } from "./settings-manager"; - -export enum SidePaneOrientation { - Horizontal, - Vertical -} - -export class SidePane { - private _headerRootElement: HTMLElement; - private _headerContentElement: HTMLElement; - private _headerTitleElement: HTMLElement; - private _headerIconElement: HTMLElement; - private _headerStatusTextElement: HTMLElement; - private _isExpanded: boolean = true; - private _content: HTMLElement; - - private getDimensionSettingName(): string { - return this.id + (this.orientation == SidePaneOrientation.Vertical ? "Height" : "Width"); - } - - private updateLayout() { - if (this.orientation == SidePaneOrientation.Vertical) { - this._headerRootElement.classList.toggle("rotated90DegreesCounterClockwise", !this._isExpanded); - this._headerContentElement.classList.toggle("rotated90DegreesCounterClockwise", !this._isExpanded); - } - - if (this.targetElementSelector) { - let targetNodes = document.getElementsByClassName(this.targetElementSelector); - - for (let i = 0; i < targetNodes.length; i++) { - (targetNodes[i]).classList.toggle("acd-hidden", !this._isExpanded); - } - } - } - - private toggled() { - if (this.onToggled) { - this.onToggled(this); - } - } - - readonly attachedTo: HTMLElement = null; - readonly id: string; - readonly title: string; - readonly targetElementSelector: string; - readonly collapsedTabContainer: HTMLElement = null; - readonly orientation: SidePaneOrientation = SidePaneOrientation.Vertical; - - onToggled: (sender: SidePane) => void; - - constructor( - attachedTo: HTMLElement, - collapsedTabContainer: HTMLElement, - id: string, - title: string, - targetElementSelector: string, - orientation: SidePaneOrientation = SidePaneOrientation.Vertical) { - this.attachedTo = attachedTo; - this.collapsedTabContainer = collapsedTabContainer; - this.id = id; - this.title = title; - this.targetElementSelector = targetElementSelector; - this.orientation = orientation; - - this.attachedTo.classList.add(this.targetElementSelector); - - this._headerRootElement = document.createElement("div"); - this._headerRootElement.innerHTML = ""; - this._headerRootElement.className = "acd-sidePane-header"; - - this._headerContentElement = document.createElement("div"); - this._headerContentElement.className = "acd-sidePane-header-content"; - - this._headerTitleElement = document.createElement("span"); - this._headerTitleElement.className = "acd-sidePane-header-title"; - this._headerTitleElement.innerText = this.title; - - this._headerContentElement.appendChild(this._headerTitleElement); - - let expandCollapseElement = document.createElement("span"); - expandCollapseElement.className = "acd-sidePane-header-expandCollapseButton"; - - this._headerIconElement = document.createElement("span") - this._headerIconElement.classList.add("acd-icon", "acd-icon-header-expanded"); - - expandCollapseElement.appendChild(this._headerIconElement); - - this._headerStatusTextElement = document.createElement("span"); - this._headerStatusTextElement.className = "acd-sidePane-header-status"; - this._headerStatusTextElement.innerText = "Hide"; - - expandCollapseElement.appendChild(this._headerStatusTextElement); - - expandCollapseElement.onmousedown = (e) => { - e.preventDefault(); - - return true; - } - - expandCollapseElement.onclick = (e) => { - this.toggle(); - - e.preventDefault(); - - return true; - } - - this._headerContentElement.appendChild(expandCollapseElement); - this._headerRootElement.appendChild(this._headerContentElement); - - this.attachedTo.insertBefore(this._headerRootElement, this.attachedTo.firstChild); - - let dimensionSetting = SettingsManager.tryLoadNumberSetting(this.getDimensionSettingName()); - - if (dimensionSetting.succeeded && dimensionSetting.value != undefined) { - if (this.orientation == SidePaneOrientation.Vertical) { - this.attachedTo.style.width = dimensionSetting.value + "px"; - } - else { - this.attachedTo.style.height = dimensionSetting.value + "px"; - } - } - - let isExpandedSetting = SettingsManager.tryLoadBooleanSetting(this.id + "IsExpanded", true); - - if (isExpandedSetting.succeeded && !isExpandedSetting.value) { - this.toggle(); - } - } - - collapse() { - if (this.attachedTo && this._isExpanded) { - this._headerIconElement.classList.add("acd-icon-header-collapsed"); - this._headerIconElement.classList.remove("acd-icon-header-expanded"); - this._headerStatusTextElement.classList.add("acd-hidden"); - - if (this.collapsedTabContainer) { - this.attachedTo.removeChild(this._headerRootElement); - this.collapsedTabContainer.appendChild(this._headerRootElement); - } - - this._isExpanded = false; - - this.updateLayout(); - - this.toggled(); - } - } - - expand() { - if (this.attachedTo && !this._isExpanded) { - this._headerIconElement.classList.add("acd-icon-header-expanded"); - this._headerIconElement.classList.remove("acd-icon-header-collapsed"); - this._headerStatusTextElement.classList.remove("acd-hidden"); - - if (this.collapsedTabContainer) { - this.collapsedTabContainer.removeChild(this._headerRootElement); - this.attachedTo.insertBefore(this._headerRootElement, this.attachedTo.firstChild); - } - - this._isExpanded = true; - - this.updateLayout(); - - this.toggled(); - } - } - - toggle() { - if (this.isExpanded) { - this.collapse(); - } - else { - this.expand(); - } - } - - getHeaderBoundingRect(): ClientRect { - return this._headerRootElement.getBoundingClientRect(); - } - - saveState() { - SettingsManager.trySaveSetting(this.id + "IsExpanded", this.isExpanded.toString()); - - let boundingRect = this.attachedTo.getBoundingClientRect(); - - SettingsManager.trySaveSetting( - this.getDimensionSettingName(), - (this.orientation == SidePaneOrientation.Vertical ? boundingRect.width : boundingRect.height).toString()); - } - - get content(): HTMLElement { - return this._content; - } - - set content(value: HTMLElement) { - if (this._content) { - this.attachedTo.removeChild(this._content); - } - - this._content = value; - - if (this._content) { - this.attachedTo.appendChild(this._content); - } - } - - get isExpanded(): boolean { - return this._isExpanded; - } -} diff --git a/source/nodejs/adaptivecards-designer/src/side-panel.ts b/source/nodejs/adaptivecards-designer/src/side-panel.ts new file mode 100644 index 0000000000..1b1295e6bf --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/side-panel.ts @@ -0,0 +1,334 @@ +import { Splitter } from "./splitter"; +import { Toolbox, ToolboxOrientation } from "./tool-box"; +import { SettingsManager } from "./settings-manager"; + +export enum SidePanelAlignment { + Top, + Right, + Bottom, + Left +} + +class ToolboxInfo { + private _splitter: Splitter; + + private resizeEnded() { + if (this.onResizeEnded) { + this.onResizeEnded(this); + } + } + + private resized() { + if (this.onResized) { + this.onResized(this); + } + } + + onToggled: (sender: ToolboxInfo) => void; + onResizeEnded: (sender: ToolboxInfo) => void; + onResized: (sender: ToolboxInfo) => void; + + showSplitter() { + if (this.splitter) { + this.splitter.attachedTo.classList.remove("acd-hidden"); + } + } + + hideSplitter() { + if (this.splitter) { + this.splitter.attachedTo.classList.add("acd-hidden"); + } + } + + constructor(readonly toolbox: Toolbox) { + toolbox.onToggled = (sender: Toolbox) => { + if (sender.isExpanded) { + this.showSplitter(); + + this.toolbox.renderedElement.classList.remove("acd-hidden"); + } + else { + this.hideSplitter(); + + this.toolbox.renderedElement.classList.add("acd-hidden"); + } + + if (this.onToggled) { + this.onToggled(this); + } + } + } + + get splitter(): Splitter { + return this._splitter; + } + + set splitter(value: Splitter) { + this._splitter = value; + + this._splitter.onResizeEnded = (sender: Splitter) => { + this.resizeEnded(); + } + + this._splitter.onResized = (sender: Splitter) => { + this.resized(); + } + } +} + +export class SidePanel { + private _attachedTo: HTMLElement; + private _alignment: SidePanelAlignment; + private _collapsedTabContainer: HTMLElement; + private _contentHost: HTMLElement; + private _toolboxes: ToolboxInfo[] = []; + private _isRestoring: boolean = false; + + private updateLayout() { + let expandedToolboxCount = 0; + + for (let toolboxInfo of this._toolboxes) { + if (toolboxInfo.toolbox.isExpanded) { + expandedToolboxCount++; + + if (expandedToolboxCount == 1) { + toolboxInfo.hideSplitter(); + toolboxInfo.toolbox.stretch = true; + } + else { + toolboxInfo.showSplitter(); + toolboxInfo.toolbox.stretch = false; + } + } + } + + if (expandedToolboxCount > 0) { + this._attachedTo.classList.remove("acd-hidden"); + } + else { + this._attachedTo.classList.add("acd-hidden"); + } + } + + private computeToolboxSize(toolbox: Toolbox) { + let boundingRect = this._attachedTo.getBoundingClientRect(); + let toolboxBoundingRect = toolbox.renderedElement.getBoundingClientRect(); + + if (this.isVertical) { + toolbox.renderedElement.style.height = (100 / boundingRect.height * toolboxBoundingRect.height) + "%"; + } + else { + toolbox.renderedElement.style.width = (100 / boundingRect.width * toolboxBoundingRect.width) + "%"; + } + } + + private resized() { + if (this.onResized) { + this.onResized(this); + } + + this.saveState(); + } + + private toolboxResized(toolbox: Toolbox) { + if (this.onToolboxResized) { + this.onToolboxResized(this, toolbox); + } + + this.saveState(); + } + + private toolboxExpandedOrCollapsed(toolbox: Toolbox) { + if (this.onToolboxExpandedOrCollapsed) { + this.onToolboxExpandedOrCollapsed(this, toolbox); + } + + this.saveState(); + } + + private getDimensionSettingName(): string { + return this.id + (this.isVertical ? "Height" : "Width"); + } + + private get isVertical(): boolean { + return this._alignment == SidePanelAlignment.Right || this._alignment == SidePanelAlignment.Left; + } + + onResized: (sender: SidePanel) => void; + onToolboxResized: (sender: SidePanel, toolbox: Toolbox) => void; + onToolboxExpandedOrCollapsed: (sender: SidePanel, toolbox: Toolbox) => void; + + readonly id; + + size?: number; + isResizable: boolean = true; + + addToolbox(toolbox: Toolbox) { + let toolboxInfo = new ToolboxInfo(toolbox); + toolboxInfo.onToggled = (sender: ToolboxInfo) => { + this.updateLayout(); + this.toolboxExpandedOrCollapsed(toolboxInfo.toolbox); + } + toolboxInfo.onResizeEnded = (sender: ToolboxInfo) => { + this.computeToolboxSize(sender.toolbox); + this.toolboxResized(sender.toolbox); + } + toolboxInfo.onResized = (sender: ToolboxInfo) => { + this.toolboxResized(sender.toolbox); + } + + this._toolboxes.push(toolboxInfo); + } + + attachTo(attachTo: HTMLElement) { + this._attachedTo = attachTo; + + this._contentHost = document.createElement("div"); + this._contentHost.style.display = "flex"; + this._contentHost.style.overflow = "hidden"; + this._contentHost.style.flex = "1 1 auto"; + + if (this.isVertical) { + this._contentHost.style.flexDirection = "column"; + } + else { + this._contentHost.style.flexDirection = "row"; + } + + for (let i = 0; i < this._toolboxes.length; i++) { + let toolboxInfo = this._toolboxes[i]; + toolboxInfo.toolbox.render( + this.isVertical ? ToolboxOrientation.Vertical : ToolboxOrientation.Horizontal, + this._collapsedTabContainer); + + if (i > 0) { + let splitterElement = document.createElement("div"); + + if (this.isVertical) { + splitterElement.className = "acd-horizontal-splitter"; + + toolboxInfo.toolbox.renderedElement.style.height = (100 / this._toolboxes.length) + "%"; + } + else { + splitterElement.className = "acd-vertical-splitter"; + + toolboxInfo.toolbox.renderedElement.style.width = (100 / this._toolboxes.length) + "%"; + } + + this._contentHost.appendChild(splitterElement); + + toolboxInfo.splitter = new Splitter( + splitterElement, + toolboxInfo.toolbox.renderedElement, + !this.isVertical); + } + + this._contentHost.appendChild(toolboxInfo.toolbox.renderedElement); + } + + let splitterElement: HTMLElement = null; + + if (this.isResizable) { + splitterElement = document.createElement("div"); + splitterElement.className = this.isVertical ? "acd-vertical-splitter" : "acd-horizontal-splitter"; + + let splitter = new Splitter( + splitterElement, + this._attachedTo, + this.isVertical, + this._alignment == SidePanelAlignment.Left || this._alignment == SidePanelAlignment.Top); + splitter.onResized = (splitter: Splitter) => { + this.resized(); + } + } + + this._attachedTo.innerHTML = ""; + this._attachedTo.style.display = "flex"; + + if (this.isVertical) { + if (this.size) { + this._attachedTo.style.width = this.size + "px"; + } + + this._attachedTo.style.flexDirection = "row"; + this._attachedTo.style.overflowX = "hidden"; + } + else { + if (this.size) { + this._attachedTo.style.height = this.size + "px"; + } + + this._attachedTo.style.flexDirection = "column"; + this._attachedTo.style.overflowY = "hidden"; + } + + if (this._alignment == SidePanelAlignment.Right || this._alignment == SidePanelAlignment.Bottom) { + if (splitterElement) { + this._attachedTo.appendChild(splitterElement); + } + + this._attachedTo.appendChild(this._contentHost); + } + else { + this._attachedTo.append(this._contentHost); + + if (splitterElement) { + this._attachedTo.appendChild(splitterElement); + } + } + + this.restoreState(); + this.updateLayout(); + } + + constructor(id: string, alignment: SidePanelAlignment, collapsedTabContainer: HTMLElement) { + this.id = id; + this._alignment = alignment; + this._collapsedTabContainer = collapsedTabContainer; + } + + saveState() { + if (!this._isRestoring) { + SettingsManager.trySaveSetting( + this.getDimensionSettingName(), + this.isVertical ? this._attachedTo.style.width : this._attachedTo.style.height); + + for (let toolboxInfo of this._toolboxes) { + toolboxInfo.toolbox.saveState(); + } + } + } + + restoreState() { + if (this._attachedTo && !this._isRestoring) { + this._isRestoring = true; + + try { + let dimensionSetting = SettingsManager.tryLoadStringSetting(this.getDimensionSettingName()); + + if (dimensionSetting.succeeded && dimensionSetting.value != undefined && dimensionSetting.value != "") { + if (this.isVertical) { + this._attachedTo.style.width = dimensionSetting.value; + } + else { + this._attachedTo.style.height = dimensionSetting.value; + } + } + + for (let toolboxInfo of this._toolboxes) { + toolboxInfo.toolbox.restoreState(); + } + + this.updateLayout(); + this.resized(); + } + finally { + this._isRestoring = false; + } + } + } + + get contentHost(): HTMLElement { + return this._contentHost; + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/splitter.ts b/source/nodejs/adaptivecards-designer/src/splitter.ts index 9ce81c4436..225813d22d 100644 --- a/source/nodejs/adaptivecards-designer/src/splitter.ts +++ b/source/nodejs/adaptivecards-designer/src/splitter.ts @@ -4,10 +4,17 @@ import { IPoint } from "./miscellaneous"; export class Splitter { private _isVertical: boolean = false; + private _isAttachedAfter: boolean = false; private _sizedELement: HTMLElement; private _isPointerDown: boolean; private _lastClickedOffset: IPoint; + private resizeEnded() { + if (this.onResizeEnded) { + this.onResizeEnded(this); + } + } + private pointerDown(e: PointerEvent) { e.preventDefault(); @@ -26,7 +33,12 @@ export class Splitter { let newSize: number; if (this._isVertical) { - newSize = this._sizedELement.getBoundingClientRect().width - (e.x - this._lastClickedOffset.x); + if (this._isAttachedAfter) { + newSize = this._sizedELement.getBoundingClientRect().width - (this._lastClickedOffset.x - e.x); + } + else { + newSize = this._sizedELement.getBoundingClientRect().width - (e.x - this._lastClickedOffset.x); + } if (newSize >= this.minimum) { this._sizedELement.style.width = newSize + "px"; @@ -35,7 +47,12 @@ export class Splitter { } } else { - newSize = this._sizedELement.getBoundingClientRect().height - (e.y - this._lastClickedOffset.y); + if (this._isAttachedAfter) { + newSize = this._sizedELement.getBoundingClientRect().height - (this._lastClickedOffset.y - e.y); + } + else { + newSize = this._sizedELement.getBoundingClientRect().height - (e.y - this._lastClickedOffset.y); + } if (newSize >= this.minimum) { this._sizedELement.style.height = newSize + "px"; @@ -46,7 +63,7 @@ export class Splitter { if (sizeApplied) { if (this.onResized) { - this.onResized(this, newSize); + this.onResized(this); } this._lastClickedOffset = { x: e.x, y: e.y }; @@ -59,10 +76,13 @@ export class Splitter { this.attachedTo.releasePointerCapture(e.pointerId); + this.resizeEnded(); + this._isPointerDown = false; } - onResized: (sender: Splitter, newSize: number) => void; + onResizeEnded: (sender: Splitter) => void; + onResized: (sender: Splitter) => void; readonly attachedTo: HTMLElement; @@ -71,10 +91,14 @@ export class Splitter { constructor( attachedTo: HTMLElement, sizedElement: HTMLElement, - isVertical: boolean = false) { + isVertical: boolean = false, + isAttachedAfter: boolean = false, + minimumSize: number = 140) { this.attachedTo = attachedTo; this._sizedELement = sizedElement; this._isVertical = isVertical; + this._isAttachedAfter = isAttachedAfter; + this.minimum = minimumSize; this.attachedTo.onmousedown = (e: MouseEvent) => {e.preventDefault(); }; this.attachedTo.onpointerdown = (e: PointerEvent) => { this.pointerDown(e); }; diff --git a/source/nodejs/adaptivecards-designer/src/tool-box.ts b/source/nodejs/adaptivecards-designer/src/tool-box.ts new file mode 100644 index 0000000000..355d770d0e --- /dev/null +++ b/source/nodejs/adaptivecards-designer/src/tool-box.ts @@ -0,0 +1,275 @@ +import { SettingsManager } from "./settings-manager"; + +export interface IToolboxCommand { + title: string; + iconClass: string; + execute: (sender: IToolboxCommand) => void; +} + +export enum ToolboxOrientation { + Horizontal, + Vertical +} + +export class Toolbox { + private _renderedElement: HTMLElement; + private _headerRootElement: HTMLElement; + private _headerIconElement: HTMLElement; + private _expandCollapseButtonElement: HTMLElement; + private _customCommandsHost: HTMLElement; + private _contentHost: HTMLElement; + private _isExpanded: boolean = true; + private _content: HTMLElement; + private _stretch: boolean = false; + private _orientation: ToolboxOrientation; + private _isRestoring: boolean = false; + private _collapsedTabContainer: HTMLElement; + + private getDimensionSettingName(): string { + return "Toolbox" + this.id + (this._orientation == ToolboxOrientation.Vertical ? "Height" : "Width"); + } + + private updateContent() { + if (this._contentHost) { + this._contentHost.innerHTML = ""; + + if (this._content) { + this._contentHost.appendChild(this._content); + } + } + } + + private toggled() { + if (this.onToggled) { + this.onToggled(this); + } + } + + onToggled: (sender: Toolbox) => void; + + readonly id: string; + readonly title: string; + + commands: Array = null; + + constructor(id: string, title: string) { + this.id = id; + this.title = title; + } + + render(orientation: ToolboxOrientation, collapsedTabContainer: HTMLElement) { + this._orientation = orientation; + this._collapsedTabContainer = collapsedTabContainer; + + this._renderedElement = document.createElement("div"); + this._renderedElement.style.overflow = "auto"; + this._renderedElement.style.display = "flex"; + this._renderedElement.style.flexDirection = "column"; + + this._headerRootElement = document.createElement("div"); + this._headerRootElement.innerHTML = ""; + this._headerRootElement.className = "acd-toolbox-header"; + + let headerContentElement = document.createElement("div"); + headerContentElement.className = "acd-toolbox-header-content"; + + let headerTitleElement = document.createElement("span"); + headerTitleElement.className = "acd-toolbox-header-title"; + headerTitleElement.innerText = this.title; + + headerContentElement.appendChild(headerTitleElement); + + let headerCommandsHostElement = document.createElement("span"); + headerCommandsHostElement.className = "acd-toolbox-header-commandsHost"; + + this._customCommandsHost = document.createElement("div"); + this._customCommandsHost.style.display = "flex"; + + if (this.commands) { + for (let command of this.commands) { + let commandButtonElement = document.createElement("div"); + commandButtonElement.className = "acd-toolbox-header-commandButton"; + commandButtonElement.title = command.title; + commandButtonElement.onclick = (e) => { + command.execute(command); + } + + let commandIconElement = document.createElement("div"); + commandIconElement.classList.add("acd-icon", command.iconClass); + + commandButtonElement.appendChild(commandIconElement); + + this._customCommandsHost.appendChild(commandButtonElement); + } + } + + headerCommandsHostElement.appendChild(this._customCommandsHost); + + this._expandCollapseButtonElement = document.createElement("span"); + this._expandCollapseButtonElement.className = "acd-toolbox-header-commandButton"; + this._expandCollapseButtonElement.title = "Hide"; + + this._headerIconElement = document.createElement("span") + this._headerIconElement.classList.add("acd-icon", "acd-icon-header-expanded"); + + this._expandCollapseButtonElement.appendChild(this._headerIconElement); + + this._expandCollapseButtonElement.onmousedown = (e) => { + e.preventDefault(); + + return true; + } + + this._expandCollapseButtonElement.onclick = (e) => { + this.toggle(); + + e.preventDefault(); + + return true; + } + + headerCommandsHostElement.appendChild(this._expandCollapseButtonElement); + + headerContentElement.appendChild(headerCommandsHostElement); + + this._headerRootElement.appendChild(headerContentElement); + + this._contentHost = document.createElement("div"); + this._contentHost.style.overflow = "auto"; + + this._renderedElement.append(this._headerRootElement, this._contentHost); + + this.updateContent(); + } + + collapse() { + if (this._isExpanded) { + this._headerIconElement.classList.add("acd-icon-header-collapsed"); + this._headerIconElement.classList.remove("acd-icon-header-expanded"); + this._customCommandsHost.classList.add("acd-hidden"); + + if (this._collapsedTabContainer) { + this._renderedElement.removeChild(this._headerRootElement); + this._collapsedTabContainer.appendChild(this._headerRootElement); + } + + this._expandCollapseButtonElement.title = "Show"; + + this._isExpanded = false; + + this.toggled(); + } + } + + expand() { + if (!this._isExpanded) { + this._headerIconElement.classList.add("acd-icon-header-expanded"); + this._headerIconElement.classList.remove("acd-icon-header-collapsed"); + this._customCommandsHost.classList.remove("acd-hidden"); + + if (this._collapsedTabContainer) { + this._collapsedTabContainer.removeChild(this._headerRootElement); + this._renderedElement.insertBefore(this._headerRootElement, this._renderedElement.firstChild); + } + + this._expandCollapseButtonElement.title = "Hide"; + + this._isExpanded = true; + + this.toggled(); + } + } + + toggle() { + if (this.isExpanded) { + this.collapse(); + } + else { + this.expand(); + } + } + + getHeaderBoundingRect(): ClientRect { + return this._headerRootElement.getBoundingClientRect(); + } + + saveState() { + if (!this._isRestoring) { + SettingsManager.trySaveSetting("Toolbox" + this.id + "IsExpanded", this.isExpanded.toString()); + + SettingsManager.trySaveSetting( + this.getDimensionSettingName(), + this.orientation == ToolboxOrientation.Vertical ? this.renderedElement.style.height : this.renderedElement.style.width); + } + } + + restoreState() { + if (this.renderedElement && !this._isRestoring) { + this._isRestoring = true; + + try { + let dimensionSetting = SettingsManager.tryLoadStringSetting(this.getDimensionSettingName()); + + if (dimensionSetting.succeeded && dimensionSetting.value != undefined && dimensionSetting.value != "") { + if (this.orientation == ToolboxOrientation.Vertical) { + this.renderedElement.style.height = dimensionSetting.value; + } + else { + this.renderedElement.style.width = dimensionSetting.value; + } + } + + let isExpandedSetting = SettingsManager.tryLoadBooleanSetting("Toolbox" + this.id + "IsExpanded", true); + + if (isExpandedSetting.succeeded) { + if (isExpandedSetting.value) { + this.expand(); + } + else { + this.collapse(); + } + } + } + finally { + this._isRestoring = false; + } + } + } + + get orientation(): ToolboxOrientation { + return this._orientation; + } + + get renderedElement(): HTMLElement { + return this._renderedElement; + } + + get content(): HTMLElement { + return this._content; + } + + set content(value: HTMLElement) { + this._content = value; + + this.updateContent(); + } + + get isExpanded(): boolean { + return this._isExpanded; + } + + get stretch(): boolean { + return this._stretch; + } + + set stretch(value: boolean) { + this._stretch = value; + + if (this._stretch) { + this.renderedElement.style.flex = "1 1 auto"; + } + else { + this.renderedElement.style.flex = "0 0 auto"; + } + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-designer/src/tool-palette.ts b/source/nodejs/adaptivecards-designer/src/tool-palette.ts index bc12e1e20e..99921b1e30 100644 --- a/source/nodejs/adaptivecards-designer/src/tool-palette.ts +++ b/source/nodejs/adaptivecards-designer/src/tool-palette.ts @@ -4,6 +4,7 @@ import * as DesignerSurface from "./card-designer-surface"; import * as DesignerPeers from "./designer-peers"; import * as Adaptive from "adaptivecards"; import { DraggableElement } from "./draggable-element"; +import { FieldDefinition } from "./data"; export abstract class BasePaletteItem extends DraggableElement { protected abstract getText(): string; @@ -15,7 +16,7 @@ export abstract class BasePaletteItem extends DraggableElement { element.style.display = "flex"; let iconElement = document.createElement("div"); - iconElement.classList.add("acd-icon", this.getIconClass()); + iconElement.classList.add("acd-icon", "acd-toolPalette-icon", this.getIconClass()); iconElement.style.flex = "0 0 auto"; let labelElement = document.createElement("div"); @@ -29,7 +30,7 @@ export abstract class BasePaletteItem extends DraggableElement { return element; } - cloneElement(): HTMLElement { + renderDragVisual(): HTMLElement { return this.internalRender(); } @@ -63,26 +64,69 @@ export class ElementPaletteItem extends BasePaletteItem { } } -/* DO NOT REMOVE - future feature -class SnippetPaletteItem extends BasePaletteItem { +export class DataPaletteItem extends BasePaletteItem { protected getText(): string { - return this.name; + return this.field.name; } protected getIconClass(): string { return null; } + constructor(readonly field: FieldDefinition) { + super(); + } + + createPeer(designer: DesignerSurface.CardDesignerSurface): DesignerPeers.CardElementPeer { + let element: Adaptive.CardElement; + + if (this.field.isCollection) { + element = new Adaptive.Container(); + element.setCustomProperty("$data", "{" + this.field.getPath() + "}"); + } + else { + let textBlock = new Adaptive.TextBlock(); + textBlock.text = "{" + this.field.getPath() + "}"; + + element = textBlock; + } + + let peer = DesignerSurface.CardDesignerSurface.cardElementPeerRegistry.createPeerInstance(designer, null, element); + peer.initializeCardElement(); + + return peer; + } +} + +export abstract class CustomPaletteItem extends BasePaletteItem { + readonly category: string; + + protected getIconClass(): string { + return "acd-icon-customPaletteItem"; + } + + constructor(category: string) { + super(); + + this.category = category; + } +} + +export class SnippetPaletteItem extends CustomPaletteItem { + protected getText(): string { + return this.name; + } + readonly name: string; snippet: object; - constructor(name: string) { - super(); + constructor(category: string, name: string) { + super(category); this.name = name; } - createPeer(designer: Designer.CardDesigner): Designer.CardElementPeer { + createPeer(designer: DesignerSurface.CardDesignerSurface): DesignerPeers.CardElementPeer { if (this.snippet) { let rootElementTypeName = this.snippet["type"]; @@ -92,7 +136,7 @@ class SnippetPaletteItem extends BasePaletteItem { if (adaptiveElement) { adaptiveElement.parse(this.snippet); - let peer = Designer.CardDesigner.cardElementPeerRegistry.createPeerInstance(designer, null, adaptiveElement); + let peer = DesignerSurface.CardDesignerSurface.cardElementPeerRegistry.createPeerInstance(designer, null, adaptiveElement); peer.initializeCardElement(); return peer; @@ -101,4 +145,3 @@ class SnippetPaletteItem extends BasePaletteItem { } } } -*/ diff --git a/source/nodejs/adaptivecards-designer/src/toolbar.ts b/source/nodejs/adaptivecards-designer/src/toolbar.ts index 56bd79d763..04f223fb7a 100644 --- a/source/nodejs/adaptivecards-designer/src/toolbar.ts +++ b/source/nodejs/adaptivecards-designer/src/toolbar.ts @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. import { DropDown, DropDownItem } from "adaptivecards-controls"; -import { Utils } from "./miscellaneous"; export enum ToolbarElementAlignment { Left, @@ -19,6 +18,7 @@ export abstract class ToolbarElement { readonly id: string; + isVisible: boolean = true; separator: boolean = false; label: string = null; alignment: ToolbarElementAlignment = ToolbarElementAlignment.Left; @@ -56,6 +56,8 @@ export class ToolbarButton extends ToolbarElement { private _iconClass: string = undefined; private _toolTip: string = undefined; private _isEnabled: boolean = true; + private _allowToggle: boolean = false; + private _isToggled: boolean = false; protected clicked() { if (this.onClick) { @@ -67,6 +69,13 @@ export class ToolbarButton extends ToolbarElement { this.renderedElement.className = "acd-toolbar-button"; (this.renderedElement as HTMLButtonElement).disabled = !this.isEnabled; + if (this.isToggled) { + this.renderedElement.classList.add("acd-toolbar-button-toggled"); + } + else { + this.renderedElement.classList.remove("acd-toolbar-button-toggled"); + } + if (this.iconClass) { this.renderedElement.classList.add(this.iconClass); } @@ -86,6 +95,10 @@ export class ToolbarButton extends ToolbarElement { let element = document.createElement("button"); element.onclick = (e) => { + if (this.allowToggle) { + this.isToggled = !this.isToggled; + } + this.clicked(); } @@ -106,6 +119,28 @@ export class ToolbarButton extends ToolbarElement { this.onClick = onClick; } + get allowToggle(): boolean { + return this._allowToggle; + } + + set allowToggle(value: boolean) { + this._allowToggle = value; + + if (!this._allowToggle) { + this.isToggled = false; + } + } + + get isToggled(): boolean { + return this._isToggled; + } + + set isToggled(value: boolean) { + this._isToggled = value; + + this.updateLayout(); + } + get caption(): string { return this._caption; } @@ -216,6 +251,14 @@ export class ToolbarChoicePicker extends ToolbarElement { get value(): string { return this._dropDown.value.key; } + + get selectedIndex(): number { + return this._dropDown.selectedIndex; + } + + set selectedIndex(value: number) { + this._dropDown.selectedIndex = value; + } } export class Toolbar { @@ -233,7 +276,6 @@ export class Toolbar { container: HTMLElement, elements: Array, separatorPosition: ToolbarElementAlignment) { - for (let i = 0; i < elements.length; i++) { if (elements[i].separator && separatorPosition == ToolbarElementAlignment.Left && i > 0) { container.appendChild(this.createSeparatorElement()); @@ -258,11 +300,13 @@ export class Toolbar { let rightElements: Array = []; for (let element of this._elements) { - if (element.alignment == ToolbarElementAlignment.Left) { - leftElements.push(element); - } - else { - rightElements.push(element); + if (element.isVisible) { + if (element.alignment == ToolbarElementAlignment.Left) { + leftElements.push(element); + } + else { + rightElements.push(element); + } } } @@ -291,6 +335,16 @@ export class Toolbar { this._elements.push(element); } + getElementById(elementId: string): ToolbarElement { + for (let element of this._elements) { + if (element.id == elementId) { + return element; + } + } + + return null; + } + insertElementAfter(element: ToolbarElement, afterElementId: string) { for (let i = 0; i < this._elements.length; i++) { if (this._elements[i].id == afterElementId) { diff --git a/source/nodejs/adaptivecards-designer/src/treeitem.ts b/source/nodejs/adaptivecards-designer/src/treeitem.ts deleted file mode 100644 index b434d254b9..0000000000 --- a/source/nodejs/adaptivecards-designer/src/treeitem.ts +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -import { DesignerPeer } from "./designer-peers"; - -export class TreeItem { - private static collapsedIconClass = "acd-icon-chevronRight"; - private static expandedIconClass = "acd-icon-chevronDown"; - - private _isExpanded: boolean = true; - private _renderedElement: HTMLElement; - private _treeItemElement: HTMLElement; - private _expandCollapseElement: HTMLElement; - private _childContainerElement: HTMLElement; - - readonly owner: DesignerPeer; - - constructor(owner: DesignerPeer) { - this.owner = owner; - } - - render(indentationLevel: number = 0): HTMLElement { - this._renderedElement = document.createElement("div"); - - this._treeItemElement = document.createElement("div"); - this._treeItemElement.classList.add("acd-tree-item"); - this._treeItemElement.style.display = "flex"; - this._treeItemElement.style.alignItems = "center"; - this._treeItemElement.style.paddingLeft = 8 + 8 * indentationLevel + "px"; - this._treeItemElement.onclick = (e: MouseEvent) => { - this._isExpanded = !this._isExpanded; - - this.updateLayout(); - - e.cancelBubble = true; - e.preventDefault(); - } - - this._expandCollapseElement = document.createElement("div"); - this._expandCollapseElement.classList.add("acd-tree-item-expandCollapseButton"); - this._expandCollapseElement.style.flex = "0 0 auto"; - this._expandCollapseElement.style.visibility = this.owner.getChildCount() > 0 ? "visible" : "hidden"; - - this._treeItemElement.appendChild(this._expandCollapseElement); - - let textElement = document.createElement("div"); - textElement.classList.add("acd-tree-item-text"); - textElement.style.flex = "1 1 auto"; - textElement.style.display = "flex"; - textElement.style.alignItems = "center"; - textElement.style.whiteSpace = "nowrap"; - textElement.style.textOverflow = "ellipsis"; - textElement.style.overflow = "hidden"; - textElement.onclick = (e: MouseEvent) => { - this.owner.isSelected = true; - - e.cancelBubble = true; - e.preventDefault(); - } - - let iconElement = document.createElement("div"); - iconElement.classList.add("acd-icon", this.owner.registration.iconClass); - - textElement.appendChild(iconElement); - - let typeNameSpan = document.createElement("span"); - typeNameSpan.classList.add("acd-tree-item-typeName"); - typeNameSpan.innerText = this.owner.getCardObject().getJsonTypeName(); - - textElement.appendChild(typeNameSpan); - - let text = this.owner.getTreeItemText(); - - if (text && text != "") { - let additionalTextSpan = document.createElement("span"); - additionalTextSpan.classList.add("acd-tree-item-additionalText"); - additionalTextSpan.innerText = " [" + text + "]"; - - textElement.appendChild(additionalTextSpan); - } - - this._treeItemElement.appendChild(textElement); - - this._renderedElement.appendChild(this._treeItemElement); - - this._childContainerElement = document.createElement("div"); - - for (let i = 0; i < this.owner.getChildCount(); i++) { - let renderedChildItem = this.owner.getChildAt(i).treeItem.render(indentationLevel + 1); - - this._childContainerElement.appendChild(renderedChildItem); - } - - this._renderedElement.appendChild(this._childContainerElement); - - this.updateLayout(); - - return this._renderedElement; - } - - updateLayout() { - if (this._isExpanded) { - this._childContainerElement.classList.remove("acd-hidden"); - this._expandCollapseElement.classList.remove(TreeItem.collapsedIconClass); - this._expandCollapseElement.classList.add(TreeItem.expandedIconClass); - } - else { - this._childContainerElement.classList.add("acd-hidden"); - this._expandCollapseElement.classList.add(TreeItem.collapsedIconClass); - this._expandCollapseElement.classList.remove(TreeItem.expandedIconClass); - } - - if (this.owner.isSelected) { - this._treeItemElement.classList.add("selected"); - } - else { - this._treeItemElement.classList.remove("selected"); - } - } - - expand() { - this._isExpanded = true; - - this.updateLayout(); - } - - get renderedElement(): HTMLElement { - return this._renderedElement; - } -} diff --git a/source/nodejs/adaptivecards-designer/webpack.config.js b/source/nodejs/adaptivecards-designer/webpack.config.js index beb89a8b22..8f4d906dbf 100644 --- a/source/nodejs/adaptivecards-designer/webpack.config.js +++ b/source/nodejs/adaptivecards-designer/webpack.config.js @@ -32,18 +32,18 @@ module.exports = (env, argv) => { }, module: { rules: [{ - test: /\.ts$/, - loader: "ts-loader", - exclude: /(node_modules|__tests__)/ - }, - { - test: /\.css$/, - use: [ - 'style-loader', - MiniCssExtractPlugin.loader, - 'css-loader' - ] - } + test: /\.ts$/, + loader: "ts-loader", + exclude: /(node_modules|__tests__)/ + }, + { + test: /\.css$/, + use: [ + 'style-loader', + MiniCssExtractPlugin.loader, + 'css-loader' + ] + } ] }, plugins: [ @@ -57,7 +57,19 @@ module.exports = (env, argv) => { title: "Adaptive Cards Designer", template: "./index.html", filename: "index.html", - chunks: [ "adaptivecards-designer" ] + chunks: ["adaptivecards-designer"] + }), + new HtmlWebpackPlugin({ + title: "Adaptive Cards Designer (Preview Features)", + template: "./previewFeatures.html", + filename: "previewFeatures.html", + chunks: ["adaptivecards-designer"] + }), + new HtmlWebpackPlugin({ + title: "Adaptive Cards Designer (No Microsoft Hosts)", + template: "./noHosts.html", + filename: "noHosts.html", + chunks: ["adaptivecards-designer-standalone"] }), new MiniCssExtractPlugin({ filename: '[name].css' @@ -67,7 +79,7 @@ module.exports = (env, argv) => { sourceMap: false, fileName: 'adaptivecards-designer.css', injectType: 'none', - filesToConcat: [ './node_modules/adaptivecards-controls/dist/adaptivecards-controls.css', './src/adaptivecards-designer.css'] + filesToConcat: ['./node_modules/adaptivecards-controls/dist/adaptivecards-controls.css', './src/adaptivecards-designer.css'] }), new CopyWebpackPlugin([{ from: 'src/containers/default/adaptivecards-defaulthost.css', diff --git a/source/nodejs/adaptivecards-fabric/package-lock.json b/source/nodejs/adaptivecards-fabric/package-lock.json index 62062e6688..5ab9148735 100644 --- a/source/nodejs/adaptivecards-fabric/package-lock.json +++ b/source/nodejs/adaptivecards-fabric/package-lock.json @@ -815,6 +815,12 @@ "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", "dev": true }, + "adaptivecards": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.0.tgz", + "integrity": "sha512-rfB3dr2/yNMgJHiGCFH247RtLXkKcNwhGbI1GrXSITfyqfo12esTWDLkRLe62b0oGZxPKJZo5187BY9xORZYsg==", + "dev": true + }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", diff --git a/source/nodejs/adaptivecards-site/package-lock.json b/source/nodejs/adaptivecards-site/package-lock.json index e2808a0e3a..bdf5574f10 100644 --- a/source/nodejs/adaptivecards-site/package-lock.json +++ b/source/nodejs/adaptivecards-site/package-lock.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-site", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -235,6 +235,38 @@ "acorn": "^5.0.0" } }, + "adaptivecards": { + "version": "1.3.0-alpha1", + "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.3.0-alpha1.tgz", + "integrity": "sha512-V6dOox+Kzpu0NUb14FErW5JGBDLtxL3JimdA9D2scIP5O2g9t5eO/auD2RTFaag2pzBLGKBKbe06koeh1ml9RA==", + "dev": true + }, + "adaptivecards-controls": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/adaptivecards-controls/-/adaptivecards-controls-0.2.0.tgz", + "integrity": "sha512-LfmE76Chi6hfNnxp7olyEF25t2Jmbm7b9pqVa+RXrTR48Klj4KHGrMrXsVQKhEznAVordYiwLliBMDlbsiJ7Fw==", + "dev": true + }, + "adaptivecards-designer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/adaptivecards-designer/-/adaptivecards-designer-0.6.0.tgz", + "integrity": "sha512-PC/bnwnjT9YxUZAvUlGI0x4t9ytgED+mpJZRhK4TpjkzCZu7MvxDRgRu9tkZK0qsNRafMFQAK9vvbLt2RP9lNA==", + "dev": true, + "requires": { + "adaptivecards": "^1.2.0", + "adaptivecards-controls": "^0.2.0", + "clipboard": "^2.0.1", + "monaco-editor": "^0.15.6" + }, + "dependencies": { + "adaptivecards": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.0.tgz", + "integrity": "sha512-rfB3dr2/yNMgJHiGCFH247RtLXkKcNwhGbI1GrXSITfyqfo12esTWDLkRLe62b0oGZxPKJZo5187BY9xORZYsg==", + "dev": true + } + } + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -335,6 +367,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -1179,6 +1212,17 @@ } } }, + "clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "dev": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -1412,7 +1456,7 @@ }, "content-disposition": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "resolved": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", "dev": true }, @@ -1691,6 +1735,12 @@ } } }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1957,7 +2007,8 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true }, "errno": { "version": "0.1.7", @@ -2151,7 +2202,7 @@ "dependencies": { "array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, @@ -2166,7 +2217,7 @@ }, "finalhandler": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { @@ -3033,6 +3084,15 @@ "pinkie-promise": "^2.0.0" } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "dev": true, + "requires": { + "delegate": "^3.1.2" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -4444,6 +4504,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", + "dev": true, "requires": { "uc.micro": "^1.0.1" } @@ -4739,6 +4800,7 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", @@ -4796,7 +4858,8 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true }, "media-typer": { "version": "0.3.0", @@ -4996,7 +5059,8 @@ "monaco-editor": { "version": "0.15.6", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.15.6.tgz", - "integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg==" + "integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg==", + "dev": true }, "morgan": { "version": "1.9.0", @@ -9250,7 +9314,7 @@ "dependencies": { "async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, @@ -9781,6 +9845,12 @@ "ajv-keywords": "^3.1.0" } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "dev": true + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -10463,7 +10533,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "6.0.1", @@ -10872,6 +10943,12 @@ "setimmediate": "^1.0.4" } }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "dev": true + }, "title-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", @@ -10971,9 +11048,9 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "ua-parser-js": { @@ -10991,7 +11068,8 @@ "uc.micro": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", + "dev": true }, "uglify-js": { "version": "2.6.0", diff --git a/source/nodejs/adaptivecards-site/package.json b/source/nodejs/adaptivecards-site/package.json index 09151e52eb..1dc4dde0ca 100644 --- a/source/nodejs/adaptivecards-site/package.json +++ b/source/nodejs/adaptivecards-site/package.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-site", - "version": "0.4.0", + "version": "0.4.1", "private": true, "scripts": { "build": "hexo generate", @@ -13,6 +13,9 @@ "version": "3.7.1" }, "devDependencies": { + "adaptivecards": "^1.3.0-alpha1", + "adaptivecards-designer": "^0.6.0", + "adaptivecards-visualizer": "^1.2.2", "change-case": "^3.0.1", "glob": "7.1.2", "hexo": "^3.7.1", @@ -27,20 +30,15 @@ "hexo-renderer-marked": "^0.3.2", "hexo-renderer-stylus": "^0.3.1", "hexo-server": "^0.3.3", - "marked-schema": "^0.1.4", + "markdown-it": "^8.4.0", + "marked-schema": "^0.1.4", "minimist": "^1.2.0", - "rimraf": "^2.6.2", - "typed-schema": "0.5.0", + "monaco-editor": "^0.15.6", + "rimraf": "^2.6.2", + "typed-schema": "^0.5.1", "typescript": "^3.2.2", "webpack": "^4.27.1", "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.14" - }, - "dependencies": { - "adaptivecards": "^1.2.0", - "adaptivecards-designer": "^0.6.0", - "adaptivecards-visualizer": "^1.2.0", - "markdown-it": "^8.4.0", - "monaco-editor": "^0.15.6" } } \ No newline at end of file diff --git a/source/nodejs/adaptivecards-site/themes/adaptivecards/layout/designer.ejs b/source/nodejs/adaptivecards-site/themes/adaptivecards/layout/designer.ejs index e85821cfde..0241e0bafa 100644 --- a/source/nodejs/adaptivecards-site/themes/adaptivecards/layout/designer.ejs +++ b/source/nodejs/adaptivecards-site/themes/adaptivecards/layout/designer.ejs @@ -1,5 +1,5 @@
-
\ No newline at end of file +
diff --git a/source/nodejs/adaptivecards-site/themes/adaptivecards/package-lock.json b/source/nodejs/adaptivecards-site/themes/adaptivecards/package-lock.json index 7a79944471..0cdcd84071 100644 --- a/source/nodejs/adaptivecards-site/themes/adaptivecards/package-lock.json +++ b/source/nodejs/adaptivecards-site/themes/adaptivecards/package-lock.json @@ -5486,9 +5486,9 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "underscore": { diff --git a/source/nodejs/adaptivecards-templating/.gitignore b/source/nodejs/adaptivecards-templating/.gitignore new file mode 100644 index 0000000000..53ab085443 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/.gitignore @@ -0,0 +1,5 @@ +build/ +lib/ +dist/ +node_modules/ +coverage/ diff --git a/source/nodejs/adaptivecards-templating/README.md b/source/nodejs/adaptivecards-templating/README.md new file mode 100644 index 0000000000..efd9290688 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/README.md @@ -0,0 +1,208 @@ +# Adaptive Card Data Binding and Templating Engine for JavaScript (Preview) + +This library implements a JSON-to-JSON templating/data-binding engine. While it is designed to be used with Adaptive Cards, it is not dependent on Adaptive Cards and can therefore be used in many contexts and applications. + +For more information about the data binding language implemented by this library, [please refer to GitHub](https://github.com/microsoft/AdaptiveCards/issues/2448) + +## Install and import the module + +### Node + +```console +npm install adaptivecards-templating --save +``` + +```js +// Import the module: +import * as ACData from "adaptivecards-templating"; + +// OR require it: +var ACData = require("adaptivecards-templating"); +``` + +### CDN + +The unpkg.com CDN makes it easy to load the script in an browser. + +The latest release will keep you up to date with features and fixes, but may have breaking changes over time. For maximum stability you should use a specific version. + +* `adaptivecards-templating.js` - non-minified, useful for dev +* `adaptivecards-templating.min.js` - minified version, best for production + +```html + + + + + +``` + +Once the library is loaded, the global `ACData` variable is defined and ready to be used. + +## Usage + +### Hello World example + +Here is a simplistic "Hello World" example on how to use the library to generate an Adaptive Card using a template bound to a data object. Note this example requires the [adaptivecards](https://www.npmjs.com/package/adaptivecards) package. + +```typescript +import * as ACData from "adaptivecards-templating"; +import * as AdaptiveCards from "adaptivecards"; + +// Define a template payload +var templatePayload = { + "type": "AdaptiveCard", + "version": "1.0", + "body": [ + { + "type": "TextBlock", + "text": "Hello {name}!" + } + ] +}; + +// Create a Template instamce from the template payload +var template = new ACData.Template(templatePayload); + +// Create a data binding context, and set its $root property to the +// data object to bind the template to +var context = new ACData.EvaluationContext(); +context.$root = { + "name": "Adaptive Cards" +}; + +// "Expand" the template - this generates the final Adaptive Card, +// ready to render +var card = template.expand(context); + +// Render the card +var adaptiveCard = new AdaptiveCards.AdaptiveCard(); +adaptiveCard.parse(card); + +document.getElementById('exampleDiv').appendChild(adaptiveCard.render()); +``` + +This example is implemented in the **example.html** file. + +### Built-in functions + +This library provides a set of built-in functions for use in data binding expressions. Note that any function parameter can itself be an expression. + +#### substr +Extracts a substring from a string. + +```typescript +substr(s: string, index: number, count: number) +``` + +|Parameter|Description| +|---|---| +|s|The input string| +|index|The index (zero based) where to start the extraction| +|count|The number of characters to extract| + +#### JSON.parse +Converts a string representing JSON data into an object to make it possible to access its individual properties within an expression. + +```typescript +JSON.parse(input: string) +``` + +|Parameter|Description| +|---|---| +|input|The input string. Must be a valid JSON payload.| + +#### if +Returns a value that depends on whether a condition evaluates to true or false. + +```typescript +if(condition: boolean, ifTrue: any, ifFalse: any) +``` + +|Parameter|Description| +|---|---| +|condition|The condition to evaluate.| +|ifTrue|The value to return if the condition evaluates to true.| +|ifFalse|The value to return if the condition evaluates to false.| + +#### toUpper +Converts a string to its upper case representation. + +```typescript +toUpper(input: string) +``` + +|Parameter|Description| +|---|---| +|input|The string to convert.| + +#### toLower +Converts a string to its lower case representation. + +```typescript +toLower(input: string) +``` + +|Parameter|Description| +|---|---| +|input|The string to convert.| + +#### Date.format +Formats an ISO 8601 date/time string into a human redable date. + +```typescript +Date.format(input: string, format: "long" | "short" | "compact") +``` + +|Parameter|Description| +|---|---| +|input|The string to format.| +|format|The format to use. Must be "short", "long" or "compact". Defaults to "compact"| + +#### Time.format +Formats an ISO 8601 date/time string into a human redable time. + +```typescript +Time.format(input: string) +``` + +|Parameter|Description| +|---|---| +|input|The string to format.| + +### Custom functions +Applications can add support for custom functions by registering them with the engine. Custom functions open up additional possibilities and scenarios. To register a custom function: + +```typescript +var template = new ACData.Template(templatePayload); + +// Create a data binding context, and set its $root property to the +// data object to bind the template to +var context = new ACData.EvaluationContext(); +context.$root = { + "name": "Adaptive Cards" +}; + +// Register a custom "add" function that adds two numbers +context.registerFunction( + "add", + (a, b) => { + if (typeof a === "number" && typeof b === "number") { + return a + b + } + else { + return undefined; + } + } +) + +// "Expand" the template - this generates the final Adaptive Card, +// ready to render +var card = template.expand(context); + +// Render the card +var adaptiveCard = new AdaptiveCards.AdaptiveCard(); +adaptiveCard.parse(card); + +document.getElementById('exampleDiv').appendChild(adaptiveCard.render()); +``` diff --git a/source/nodejs/adaptivecards-templating/example.html b/source/nodejs/adaptivecards-templating/example.html new file mode 100644 index 0000000000..435636de69 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/example.html @@ -0,0 +1,62 @@ + + + + + + Adaptive Cards Example + + + + + + + + + + + + + +

Adaptive Cards Data Binding Example

+ +
+ \ No newline at end of file diff --git a/source/nodejs/adaptivecards-templating/package-lock.json b/source/nodejs/adaptivecards-templating/package-lock.json new file mode 100644 index 0000000000..a51d361fdd --- /dev/null +++ b/source/nodejs/adaptivecards-templating/package-lock.json @@ -0,0 +1,5512 @@ +{ + "name": "adaptivecards-templating", + "version": "0.1.0-alpha.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.3.tgz", + "integrity": "sha512-zkOxCS/fA+3SsdA+9Yun0iANxzhQRiNwTvJSr6N95JhuJ/x27z9G2URx1Jpt3zYFfCGUXZGL5UDxt5eyLE7wgw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "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.0.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": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "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 + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "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.1" + } + }, + "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.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "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" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "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": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "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.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "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.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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.1.0", + "randombytes": "^2.0.1" + } + }, + "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.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "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.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "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-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": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "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 + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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 + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "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.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "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.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "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 + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "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.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "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 + }, + "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.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "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=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "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 + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "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 + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "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.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "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.1", + "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-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.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.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "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.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.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 + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "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 + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "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-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "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.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "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.0" + } + } + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", + "dev": true, + "requires": { + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "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.1", + "readable-stream": "^2.0.0" + } + }, + "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.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "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.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "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.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "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.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "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.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "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.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.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" + } + } + } + }, + "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.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.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" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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 + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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.0.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" + } + } + } + }, + "is-path-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.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-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "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=", + "dev": true + }, + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "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": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.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.3", + "readable-stream": "^2.0.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 + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "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.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "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.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "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.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "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 + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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.0" + } + }, + "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-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "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.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "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" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "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-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "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.1.5" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "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-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "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.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "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 + }, + "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-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "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" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.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-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.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 + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "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" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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.5.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "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 + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "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-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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "terser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz", + "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==", + "dev": true, + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "loader-utils": "^1.2.3", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.0.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.0" + }, + "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 + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "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 + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.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" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "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.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "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 + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "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 + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "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.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "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": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "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" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "4.32.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.2.tgz", + "integrity": "sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-cli": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.2.tgz", + "integrity": "sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.5" + } + }, + "webpack-concat-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-concat-plugin/-/webpack-concat-plugin-3.0.0.tgz", + "integrity": "sha512-DLdDbZXyrFR99wyAVC9P06HLjr2XujBmQdSbnQMK2o01H9U2NHsN5W76jeTVeXDq5OLvZf8r/se65ftRo3Prow==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.5", + "globby": "^8.0.1", + "schema-utils": "^0.4.5", + "uglify-es": "^3.3.9", + "upath": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz", + "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.2", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.4.1.tgz", + "integrity": "sha512-CRqZQX2ryMtrg0r3TXQPpNh76eM1HD3Wmu6zDBxIKi/d2y+4aa28Ia8weNT0bfgWpY6Vs3Oq/K8+DjfbR+tWYw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.6", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.0", + "html-entities": "^1.2.1", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "killable": "^1.0.1", + "loglevel": "^1.6.1", + "opn": "^5.5.0", + "portfinder": "^1.0.20", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.4", + "semver": "^6.0.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + }, + "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.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "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 + } + } + }, + "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.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "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 + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "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.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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.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.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^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.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/source/nodejs/adaptivecards-templating/package.json b/source/nodejs/adaptivecards-templating/package.json new file mode 100644 index 0000000000..0504356da7 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/package.json @@ -0,0 +1,32 @@ +{ + "name": "adaptivecards-templating", + "version": "0.1.0-alpha.0", + "description": "Adaptive Card data binding and templating engine for JavaScript", + "author": "AdaptiveCards", + "license": "MIT", + "main": "lib/adaptivecards-templating.js", + "types": "lib/adaptivecards-templating.d.ts", + "files": [ + "lib", + "dist", + "src" + ], + "scripts": { + "clean": "rimraf build lib dist", + "prebuild": "tsc", + "build": "webpack", + "watch": "webpack --watch", + "start": "webpack-dev-server --open", + "dts": "dts-generator --name adaptivecards-templating --project . --out dist/adaptivecards-templating.d.ts", + "lint": "tslint -c tslint.json 'src/**/*.{ts,tsx}'", + "release": "npm run build && webpack --mode=production && npm run dts" + }, + "devDependencies": { + "rimraf": "^2.6.2", + "typescript": "^3.2.2", + "webpack": "^4.27.1", + "webpack-cli": "^3.1.2", + "webpack-concat-plugin": "^3.0.0", + "webpack-dev-server": "^3.1.14" + } +} diff --git a/source/nodejs/adaptivecards-templating/src/adaptivecards-templating.ts b/source/nodejs/adaptivecards-templating/src/adaptivecards-templating.ts new file mode 100644 index 0000000000..52a6409c1d --- /dev/null +++ b/source/nodejs/adaptivecards-templating/src/adaptivecards-templating.ts @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +export * from "./expression-parser"; +export * from "./template-engine"; \ No newline at end of file diff --git a/source/nodejs/adaptivecards-templating/src/expression-parser.ts b/source/nodejs/adaptivecards-templating/src/expression-parser.ts new file mode 100644 index 0000000000..35938ac331 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/src/expression-parser.ts @@ -0,0 +1,772 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +type TokenType = + "{" | + "?#" | + "}" | + "[" | + "]" | + "(" | + ")" | + "identifier" | + "." | + "," | + "+" | + "-" | + "*" | + "/" | + "==" | + "!=" | + "<" | + "<=" | + ">" | + ">=" | + "string" | + "number" | + "boolean"; + +const orderedOperators: Array = [ + "/", + "*", + "-", + "+", + "==", + "!=", + "<", + "<=", + ">", + ">=" +]; + +const literals: Array = [ + "identifier", + "string", + "number", + "boolean" +]; + +interface TokenizerRule { + tokenType: TokenType; + regEx: RegExp; +} + +interface Token { + type: TokenType; + value: string; + originalPosition: number; +} + +class Tokenizer { + static rules: Array = []; + + static init() { + Tokenizer.rules.push( + { tokenType: undefined, regEx: /^\s/ }, + { tokenType: "{", regEx: /^{/ }, + { tokenType: "?#", regEx: /^\?#/ }, + { tokenType: "}", regEx: /^}/ }, + { tokenType: "[", regEx: /^\[/ }, + { tokenType: "]", regEx: /^\]/ }, + { tokenType: "(", regEx: /^\(/ }, + { tokenType: ")", regEx: /^\)/ }, + { tokenType: "boolean", regEx: /^true|^false/ }, + { tokenType: "identifier", regEx: /^[$a-z_]+/i }, + { tokenType: ".", regEx: /^\./ }, + { tokenType: ",", regEx: /^,/ }, + { tokenType: "+", regEx: /^\+/ }, + { tokenType: "-", regEx: /^-/ }, + { tokenType: "*", regEx: /^\*/ }, + { tokenType: "/", regEx: /^\// }, + { tokenType: "==", regEx: /^==/ }, + { tokenType: "!=", regEx: /^!=/ }, + { tokenType: "<=", regEx: /^<=/ }, + { tokenType: "<", regEx: /^=", regEx: /^>=/ }, + { tokenType: ">", regEx: /^>/ }, + { tokenType: "string", regEx: /^"([^"]*)"/ }, + { tokenType: "string", regEx: /^'([^']*)'/ }, + { tokenType: "number", regEx: /^\d*\.?\d+/ } + ) + } + + static parse(expression: string): Token[] { + let result: Token[] = []; + let i = 0; + + while (i < expression.length) { + let subExpression = expression.substring(i); + let matchFound = false; + + for (let rule of Tokenizer.rules) { + let matches = rule.regEx.exec(subExpression); + + if (matches) { + if (matches.length > 2) { + throw new Error("A tokenizer rule matched more than one group."); + } + + if (rule.tokenType != undefined) { + result.push( + { + type: rule.tokenType, + value: matches[matches.length == 1 ? 0 : 1], + originalPosition: i + } + ) + } + + i += matches[0].length; + + matchFound = true; + + break; + } + } + + if (!matchFound) { + throw new Error("Unexpected character " + subExpression[0] + " at position " + i); + } + } + + return result; + } +} + +Tokenizer.init(); + +type LiteralValue = string | number | boolean; + +function ensureValueType(value: any): LiteralValue { + if (typeof value === "number" || typeof value === "string" || typeof value === "boolean") { + return value; + } + + throw new Error("Invalid value type: " + typeof value); +} + +type FunctionCallback = (...params: any[]) => any; +type FunctionDictionary = { [key: string]: FunctionCallback }; + +interface EvaluationContextState { + $data: any; + $index: any; +} + +export class EvaluationContext { + private static readonly _reservedFields = ["$data", "$root", "$index"]; + private static _builtInFunctions: FunctionDictionary = {} + + static init() { + EvaluationContext._builtInFunctions["substr"] = (s, index, count) => { + if (typeof s === "string" && typeof index === "number" && typeof count === "number") { + return (s.substr(index, count)); + } + else { + return ""; + } + }; + EvaluationContext._builtInFunctions["JSON.parse"] = (input) => { + return JSON.parse(input); + }; + EvaluationContext._builtInFunctions["if"] = (condition, ifTrue, ifFalse) => { + return condition ? ifTrue : ifFalse; + }; + EvaluationContext._builtInFunctions["toUpper"] = (input) => { + return typeof input === "string" ? input.toUpperCase() : input; + }; + EvaluationContext._builtInFunctions["toLower"] = (input) => { + return typeof input === "string" ? input.toLowerCase() : input; + }; + EvaluationContext._builtInFunctions["Date.format"] = (input, format) => { + const acceptedFormats = [ "long", "short", "compact" ]; + + let inputAsNumber: number; + + if (typeof input === "string") { + inputAsNumber = Date.parse(input); + } + else if (typeof input === "number") { + inputAsNumber = input; + } + else { + return input; + } + + let date = new Date(inputAsNumber); + + let effectiveFormat: string = "compact"; + + if (typeof format === "string") { + effectiveFormat = format.toLowerCase(); + + if (acceptedFormats.indexOf(effectiveFormat) < 0) { + effectiveFormat = "compact"; + } + } + + return effectiveFormat === "compact" ? date.toLocaleDateString() : date.toLocaleDateString(undefined, { day: "numeric", weekday: effectiveFormat, month: effectiveFormat, year: "numeric" }); + }; + EvaluationContext._builtInFunctions["Time.format"] = (input) => { + let inputAsNumber: number; + + if (typeof input === "string") { + inputAsNumber = Date.parse(input); + } + else if (typeof input === "number") { + inputAsNumber = input; + } + else { + return input; + } + + let date = new Date(inputAsNumber); + + return date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }); + }; + } + + private _functions = {}; + private _stateStack: EvaluationContextState[] = []; + + $root: any; + $data: any; + $index: number; + + registerFunction(name: string, callback: FunctionCallback) { + this._functions[name] = callback; + } + + unregisterFunction(name: string) { + delete this._functions[name]; + } + + getFunction(name: string): FunctionCallback { + let result = this._functions[name]; + + if (result == undefined) { + result = EvaluationContext._builtInFunctions[name]; + } + + return result; + } + + isReservedField(name: string): boolean { + return EvaluationContext._reservedFields.indexOf(name) >= 0; + } + + saveState() { + this._stateStack.push({ $data: this.$data, $index: this.$index }); + } + + restoreLastState() { + if (this._stateStack.length == 0) { + throw new Error("There is no evaluation context state to restore."); + } + + let savedContext = this._stateStack.pop(); + + this.$data = savedContext.$data; + this.$index = savedContext.$index; + } + + get currentDataContext(): any { + return this.$data != undefined ? this.$data : this.$root; + } +} + +EvaluationContext.init(); + +abstract class EvaluationNode { + abstract evaluate(context: EvaluationContext): LiteralValue; +} + +class ExpressionNode extends EvaluationNode { + nodes: Array = []; + allowNull: boolean = true; + + evaluate(context: EvaluationContext): any { + const operatorPriorityGroups = [ + ["/", "*"], + ["-", "+"], + ["==", "!=", "<", "<=", ">", ">="] + ]; + + let nodesCopy = this.nodes; + + for (let priorityGroup of operatorPriorityGroups) { + let i = 0; + + while (i < nodesCopy.length) { + let node = nodesCopy[i]; + + if (node instanceof OperatorNode && priorityGroup.indexOf(node.operator) >= 0) { + let left = ensureValueType(nodesCopy[i - 1].evaluate(context)); + let right = ensureValueType(nodesCopy[i + 1].evaluate(context)); + + if (typeof left !== typeof right) { + throw new Error("Incompatible operands " + left + " and " + right + " for operator " + node.operator); + } + + let result: LiteralValue; + + if (typeof left === "number" && typeof right === "number") { + switch (node.operator) { + case "/": + result = left / right; + break; + case "*": + result = left * right; + break; + case "-": + result = left - right; + break; + case "+": + result = left + right; + break; + } + } + + if (typeof left === "string" && typeof right === "string") { + switch (node.operator) { + case "+": + result = left + right; + break; + } + } + + switch (node.operator) { + case "==": + result = left == right; + break; + case "!=": + result = left != right; + break; + case "<": + result = left < right; + break; + case "<=": + result = left <= right; + break; + case ">": + result = left > right; + break; + case ">=": + result = left >= right; + break; + default: + // This should never happen + } + + nodesCopy.splice(i - 1, 3, new LiteralNode(result)); + + i--; + } + + i++; + }; + } + + return nodesCopy[0].evaluate(context); + } +} + +class IdentifierNode extends EvaluationNode { + identifier: string; + + evaluate(context: EvaluationContext): LiteralValue { + return this.identifier; + } +} + +class IndexerNode extends EvaluationNode { + index: ExpressionNode; + + evaluate(context: EvaluationContext): LiteralValue { + return this.index.evaluate(context); + } +} + +class FunctionCallNode extends EvaluationNode { + functionName: string = null; + parameters: Array = []; + + evaluate(context: EvaluationContext): LiteralValue { + let callback = context.getFunction(this.functionName); + + if (callback != undefined) { + let evaluatedParams = []; + + for (let param of this.parameters) { + evaluatedParams.push(param.evaluate(context)); + } + + return callback(...evaluatedParams); + } + + throw new Error("Undefined function: " + this.functionName); + } +} + +class LiteralNode extends EvaluationNode { + constructor(readonly value: LiteralValue) { + super(); + } + + evaluate(context: EvaluationContext): LiteralValue { + return this.value; + } +} + +class OperatorNode extends EvaluationNode { + constructor(readonly operator: TokenType) { + super(); + } + + evaluate(context: EvaluationContext): LiteralValue { + throw new Error("An operator cannot be evaluated on its own."); + } +} + +type PathPart = ExpressionNode | IdentifierNode | IndexerNode | FunctionCallNode; + +class PathNode extends EvaluationNode { + parts: PathPart[] = []; + + evaluate(context: EvaluationContext): LiteralValue { + let result: any = undefined; + let index = 0; + + while (index < this.parts.length) { + let part = this.parts[index]; + + try { + if (part instanceof IdentifierNode && index == 0) { + switch (part.identifier) { + case "$root": + result = context.$root; + + break; + case "$data": + result = context.currentDataContext; + + break; + case "$index": + result = context.$index; + + break; + default: + result = context.currentDataContext[part.identifier]; + + break; + } + } + else { + let partValue = part.evaluate(context); + + if (index == 0) { + result = partValue; + } + else { + result = typeof partValue !== "boolean" ? result[partValue] : result[partValue.toString()]; + } + } + } + catch (e) { + return undefined; + } + + index++; + } + + return result; + } +} + +export class ExpressionParser { + private _index: number = 0; + private _tokens: Token[]; + + private unexpectedToken() { + throw new Error("Unexpected token " + this.current.value + " at position " + this.current.originalPosition + "."); + } + + private unexpectedEoe() { + throw new Error("Unexpected end of expression."); + } + + private moveNext() { + this._index++; + } + + private parseToken(...expectedTokenTypes: TokenType[]): Token { + if (this.eoe) { + this.unexpectedEoe(); + } + + let currentToken = this.current; + + if (expectedTokenTypes.indexOf(this.current.type) < 0) { + this.unexpectedToken(); + } + + this.moveNext(); + + return currentToken; + } + + private parseOptionalToken(...expectedTokenTypes: TokenType[]): boolean { + if (this.eoe) { + this.unexpectedEoe(); + } + else if (expectedTokenTypes.indexOf(this.current.type) < 0) { + return false; + } + else { + this.moveNext(); + + return true; + } + } + + private parseFunctionCall(functionName: string): FunctionCallNode { + let result = new FunctionCallNode(); + result.functionName = functionName; + + this.parseToken("("); + + let firstParameter = this.parseExpression(); + let moreParameters: boolean = false; + + if (firstParameter) { + result.parameters.push(firstParameter); + + do { + moreParameters = this.parseOptionalToken(","); + + if (moreParameters) { + let parameter = this.parseExpression(); + + result.parameters.push(parameter); + } + } while (moreParameters); + } + + this.parseToken(")"); + + return result; + } + + private parseIdentifier(): IdentifierNode { + let result = new IdentifierNode(); + + result.identifier = this.current.value; + + this.moveNext(); + + return result; + } + + private parseIndexer(): IndexerNode { + let result = new IndexerNode(); + + this.parseToken("["); + + result.index = this.parseExpression(); + + this.parseToken("]"); + + return result; + } + + private parsePath(): PathNode { + let result = new PathNode(); + + let expectedNextTokenTypes: TokenType[] = ["identifier", "("]; + + while (!this.eoe) { + if (expectedNextTokenTypes.indexOf(this.current.type) < 0) { + return result; + } + + switch (this.current.type) { + case "(": + if (result.parts.length == 0) { + this.moveNext(); + + result.parts.push(this.parseExpression()); + + this.parseToken(")"); + } + else { + let functionName: string = ""; + + for (let part of result.parts) { + if (!(part instanceof IdentifierNode)) { + this.unexpectedToken(); + } + + if (functionName != "") { + functionName += "."; + } + + functionName += (part).identifier; + } + + result.parts = []; + + result.parts.push(this.parseFunctionCall(functionName)); + } + + expectedNextTokenTypes = [".", "["]; + + break; + case "[": + result.parts.push(this.parseIndexer()); + + expectedNextTokenTypes = [".", "(", "["]; + + break; + case "identifier": + result.parts.push(this.parseIdentifier()); + + expectedNextTokenTypes = [".", "(", "["]; + + break; + case ".": + this.moveNext(); + + expectedNextTokenTypes = ["identifier"]; + + break; + default: + expectedNextTokenTypes = []; + + break; + } + } + } + + private parseExpression(): ExpressionNode { + let result: ExpressionNode = new ExpressionNode(); + + let expectedNextTokenTypes: TokenType[] = literals.concat("(", "+", "-"); + + while (!this.eoe) { + if (expectedNextTokenTypes.indexOf(this.current.type) < 0) { + if (result.nodes.length == 0) { + this.unexpectedToken(); + } + + return result; + } + + switch (this.current.type) { + case "(": + case "identifier": + result.nodes.push(this.parsePath()); + + expectedNextTokenTypes = orderedOperators; + + break; + case "string": + case "number": + case "boolean": + if (this.current.type == "string") { + result.nodes.push(new LiteralNode(this.current.value)); + } + else if (this.current.type == "number") { + result.nodes.push(new LiteralNode(parseFloat(this.current.value))); + } + else { + result.nodes.push(new LiteralNode(this.current.value === "true")); + } + + this.moveNext(); + + expectedNextTokenTypes = orderedOperators; + + break; + case "-": + if (result.nodes.length == 0) { + result.nodes.push(new LiteralNode(-1)); + result.nodes.push(new OperatorNode("*")); + + expectedNextTokenTypes = ["identifier", "number", "("]; + } + else { + result.nodes.push(new OperatorNode(this.current.type)); + + expectedNextTokenTypes = literals.concat("("); + } + + this.moveNext(); + + break; + case "+": + if (result.nodes.length == 0) { + expectedNextTokenTypes = literals.concat("("); + } + else { + result.nodes.push(new OperatorNode(this.current.type)); + + expectedNextTokenTypes = literals.concat("("); + } + + this.moveNext(); + + break; + case "*": + case "/": + case "==": + case "!=": + case "<": + case "<=": + case ">": + case ">=": + result.nodes.push(new OperatorNode(this.current.type)); + + this.moveNext(); + + expectedNextTokenTypes = literals.concat("("); + + break; + default: + expectedNextTokenTypes = []; + + break; + } + } + } + + private get eoe(): boolean { + return this._index >= this._tokens.length; + } + + private get current(): Token { + return this._tokens[this._index]; + } + + static parseBinding(bindingExpression: string): Binding { + let parser = new ExpressionParser(Tokenizer.parse(bindingExpression)); + parser.parseToken("{"); + + let allowNull = !parser.parseOptionalToken("?#"); + let expression = parser.parseExpression(); + + parser.parseToken("}"); + + return new Binding(expression, allowNull); + } + + constructor(tokens: Token[]) { + this._tokens = tokens; + } +} + +export class Binding { + constructor(private readonly expression: EvaluationNode, readonly allowNull: boolean = true) {} + + evaluate(context: EvaluationContext): LiteralValue { + return this.expression.evaluate(context); + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-templating/src/template-engine.ts b/source/nodejs/adaptivecards-templating/src/template-engine.ts new file mode 100644 index 0000000000..5542ce7ca5 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/src/template-engine.ts @@ -0,0 +1,271 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +import { Binding, ExpressionParser, EvaluationContext } from "./expression-parser"; + +class TemplatizedString { + private _parts: Array = []; + + static parse(s: string): string | TemplatizedString { + let result = new TemplatizedString(); + let i = 0; + + do { + let expressionFound = false; + let start = i; + let loop; + + do { + loop = false; + + start = s.indexOf("{", start); + + if (start >= 0) { + if (start + 1 < s.length && s[start + 1] == "{") { + start += 2; + + loop = true; + } + } + } while (loop); + + if (start >= 0) { + let end = s.indexOf("}", start); + + if (end >= 0) { + expressionFound = true; + + if (start > i) { + result._parts.push(s.substring(i, start)); + } + + let bindngExpression = s.substring(start, end + 1); + let part: string | Binding; + + try { + part = ExpressionParser.parseBinding(bindngExpression); + } + catch (e) { + part = bindngExpression; + } + + result._parts.push(part); + + i = end + 1; + } + } + + if (!expressionFound) { + result._parts.push(s.substr(i)); + + break; + } + } while (i < s.length); + + if (result._parts.length == 1 && typeof result._parts[0] === "string") { + return result._parts[0]; + } + else { + return result; + } + } + + private _shouldDropOwner: boolean = false; + + private evalExpression(bindingExpression: Binding, context: EvaluationContext): any { + let result = bindingExpression.evaluate(context); + + if (result == undefined) { + this._shouldDropOwner = this._shouldDropOwner || !bindingExpression.allowNull; + } + + return result; + } + + private internalEvaluate(context: EvaluationContext): any { + if (this._parts.length == 0) { + return undefined; + } + else if (this._parts.length == 1) { + if (typeof this._parts[0] === "string") { + return this._parts[0]; + } + else { + return this.evalExpression(this._parts[0], context); + } + } + else { + let s = ""; + + for (let part of this._parts) { + if (typeof part === "string") { + s += part; + } + else { + s += this.evalExpression(part, context); + } + } + + return s; + } + } + + evaluate(context: EvaluationContext): any { + this._shouldDropOwner = false; + + return this.internalEvaluate(context); + } + + get shouldDropOwner(): boolean { + return this._shouldDropOwner; + } +} + +export class Template { + private static prepare(node: any): any { + if (typeof node === "string") { + return TemplatizedString.parse(node); + } + else if (typeof node === "object" && node != null) { + if (Array.isArray(node)) { + let result: any[] = []; + + for (let item of node) { + result.push(Template.prepare(item)); + } + + return result; + } + else { + let keys = Object.keys(node); + let result = {}; + + for (let key of keys) { + result[key] = Template.prepare(node[key]); + } + + return result; + } + } + else { + return node; + } + } + + private _context: EvaluationContext; + + private expandSingleObject(node: object): any { + let result = {}; + let keys = Object.keys(node); + + for (let key of keys) { + if (!this._context.isReservedField(key)) { + let value = this.internalExpand(node[key]); + + if (value != undefined) { + result[key] = value; + } + } + } + + return result; + } + + private internalExpand(node: any): any { + let result: any; + + this._context.saveState(); + + if (Array.isArray(node)) { + let itemArray: any[] = []; + + for (let item of node) { + let expandedItem = this.internalExpand(item); + + if (expandedItem != null) { + if (Array.isArray(expandedItem)) { + itemArray = itemArray.concat(expandedItem); + } + else { + itemArray.push(expandedItem); + } + } + } + + result = itemArray; + } + else if (node instanceof TemplatizedString) { + result = node.evaluate(this._context); + + if (node.shouldDropOwner) { + result = null; + } + } + else if (typeof node === "object" && node != null) { + let dropObject = false; + let when = node["$when"]; + + if (when instanceof TemplatizedString) { + let whenValue = when.evaluate(this._context); + + if (typeof whenValue === "boolean") { + dropObject = !whenValue; + } + } + + if (!dropObject) { + let dataContext = node["$data"]; + + if (dataContext != undefined) { + if (dataContext instanceof TemplatizedString) { + dataContext = dataContext.evaluate(this._context); + } + + if (Array.isArray(dataContext)) { + result = []; + + for (let i = 0; i < dataContext.length; i++) { + this._context.$data = dataContext[i]; + this._context.$index = i; + + let expandedObject = this.expandSingleObject(node); + + if (expandedObject != null) { + result.push(expandedObject); + } + } + } + else { + this._context.$data = dataContext; + + result = this.expandSingleObject(node); + } + } + else { + result = this.expandSingleObject(node); + } + } + else { + result = null; + } + } + else { + result = node; + } + + this._context.restoreLastState(); + + return result; + } + + preparedPayload: any; + + constructor(payload: any) { + this.preparedPayload = Template.prepare(payload); + } + + expand(context: EvaluationContext): any { + this._context = context; + + return this.internalExpand(this.preparedPayload); + } +} \ No newline at end of file diff --git a/source/nodejs/adaptivecards-templating/tsconfig.debug.json b/source/nodejs/adaptivecards-templating/tsconfig.debug.json new file mode 100644 index 0000000000..5b837b4b6c --- /dev/null +++ b/source/nodejs/adaptivecards-templating/tsconfig.debug.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./build" + }, + "include": [ + "./src/**/*.ts" + ] +} diff --git a/source/nodejs/adaptivecards-templating/tsconfig.json b/source/nodejs/adaptivecards-templating/tsconfig.json new file mode 100644 index 0000000000..10c2b37ac3 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "./lib" + }, + "files": ["./src/adaptivecards-templating.ts"] +} diff --git a/source/nodejs/adaptivecards-templating/tsconfig.release.json b/source/nodejs/adaptivecards-templating/tsconfig.release.json new file mode 100644 index 0000000000..14c8fcc11d --- /dev/null +++ b/source/nodejs/adaptivecards-templating/tsconfig.release.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "inlineSourceMap": false, + "outDir": "../output/dist", + "removeComments": true + }, + "include": [ + "../src/**/*.ts" + ], + "exclude": [ + "../src/**/*.spec.ts" + ] +} diff --git a/source/nodejs/adaptivecards-templating/tslint.json b/source/nodejs/adaptivecards-templating/tslint.json new file mode 100644 index 0000000000..8848e2da2c --- /dev/null +++ b/source/nodejs/adaptivecards-templating/tslint.json @@ -0,0 +1,75 @@ +{ + "rules": { + "class-name": true, + "comment-format": [true, "check-space"], + "curly": true, + "eofline": true, + "forin": true, + "indent": [true, "spaces"], + "label-position": true, + "label-undefined": true, + "max-line-length": [true, 140], + "member-access": true, + "member-ordering": [true, + "public-before-private", + "static-before-instance", + "variables-before-functions" + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": true, + "no-eval": true, + "no-inferrable-types": true, + "no-shadowed-variable": true, + "no-string-literal": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-unused-variable": true, + "no-unreachable": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": true, + "one-line": [true, + "check-open-brace", + "check-catch", + "check-else", + "check-finally", + "check-whitespace" + ], + "quotemark": [true, "double", "avoid-escape"], + "radix": true, + "semicolon": [true, "always"], + "trailing-comma": [true, { + "singleline": "never", + "multiline": "always" + }], + "triple-equals": [true, "allow-null-check"], + "typedef-whitespace": [true, { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }], + "variable-name": false, + "whitespace": [true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} diff --git a/source/nodejs/adaptivecards-templating/webpack.config.js b/source/nodejs/adaptivecards-templating/webpack.config.js new file mode 100644 index 0000000000..74d42063d4 --- /dev/null +++ b/source/nodejs/adaptivecards-templating/webpack.config.js @@ -0,0 +1,36 @@ +const path = require("path"); + +module.exports = (env, argv) => { + const mode = argv.mode || 'development'; + const devMode = mode === "development"; + + console.info('running webpack with mode:', mode); + + return { + mode: mode, + entry: { + "adaptivecards-templating": "./src/adaptivecards-templating.ts" + }, + output: { + path: path.resolve(__dirname, "./dist"), + filename: devMode ? "[name].js" : "[name].min.js", + libraryTarget: "umd", + library: "ACData" + }, + devtool: devMode ? "inline-source-map" : "source-map", + devServer: { + contentBase: './dist' + }, + resolve: { + extensions: [".ts", ".tsx", ".js"] + }, + module: { + rules: [{ + test: /\.ts$/, + loader: "ts-loader", + exclude: /(node_modules|__tests__)/ + } + ] + } + }; +} diff --git a/source/nodejs/adaptivecards-visualizer/css/outlook.css b/source/nodejs/adaptivecards-visualizer/css/outlook.css index a9fd5226c5..081d544169 100644 --- a/source/nodejs/adaptivecards-visualizer/css/outlook.css +++ b/source/nodejs/adaptivecards-visualizer/css/outlook.css @@ -104,6 +104,30 @@ a.ac-anchor:visited:active { border: 1px solid #464B93; } +.ac-pushButton.sentiment-positive { + background-color: #0078D7; + color: white; + border: 1px solid #0078D7; +} + +.ac-pushButton.sentiment-positive:hover, +.ac-pushButton.sentiment-positive:active { + background-color: #006ABC; + border: 1px solid #006ABC; +} + +.ac-pushButton.sentiment-destructive { + background-color: #E50000; + color: white; + border: 1px solid #E50000; +} + +.ac-pushButton.sentiment-destructive:hover, +.ac-pushButton.sentiment-destructive:active { + background-color: #BF0000; + border: 1px solid #BF0000; +} + .ac-pushButton.subdued { color: #666666; border: 1px solid #EEEEEE; diff --git a/source/nodejs/adaptivecards-visualizer/css/webchat.css b/source/nodejs/adaptivecards-visualizer/css/webchat.css index 22b134d1d6..f01510e3c5 100644 --- a/source/nodejs/adaptivecards-visualizer/css/webchat.css +++ b/source/nodejs/adaptivecards-visualizer/css/webchat.css @@ -86,10 +86,30 @@ a.ac-anchor:visited:active { .ac-pushButton:hover { background-color: #CCCCCC; } - + .ac-pushButton:active { background-color: #BABABA; } + +.ac-pushButton.sentiment-positive { + background-color: #0078D7; + color: white; +} + +.ac-pushButton.sentiment-positive:hover, +.ac-pushButton.sentiment-positive:active { + background-color: #006ABC; +} + +.ac-pushButton.sentiment-destructive { + background-color: #E50000; + color: white; +} + +.ac-pushButton.sentiment-destructive:hover, +.ac-pushButton.sentiment-destructive:active { + background-color: #BF0000; +} .ac-input-container { display: flex; diff --git a/source/nodejs/adaptivecards-visualizer/package-lock.json b/source/nodejs/adaptivecards-visualizer/package-lock.json index e5928a513c..099373d497 100644 --- a/source/nodejs/adaptivecards-visualizer/package-lock.json +++ b/source/nodejs/adaptivecards-visualizer/package-lock.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-visualizer", - "version": "1.2.0", + "version": "1.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -214,9 +214,10 @@ } }, "adaptivecards": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.2.0.tgz", - "integrity": "sha512-rfB3dr2/yNMgJHiGCFH247RtLXkKcNwhGbI1GrXSITfyqfo12esTWDLkRLe62b0oGZxPKJZo5187BY9xORZYsg==" + "version": "1.3.0-alpha1", + "resolved": "https://registry.npmjs.org/adaptivecards/-/adaptivecards-1.3.0-alpha1.tgz", + "integrity": "sha512-V6dOox+Kzpu0NUb14FErW5JGBDLtxL3JimdA9D2scIP5O2g9t5eO/auD2RTFaag2pzBLGKBKbe06koeh1ml9RA==", + "dev": true }, "ajv": { "version": "6.6.2", @@ -289,6 +290,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -302,7 +304,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "arr-union": { @@ -351,7 +353,7 @@ }, "assert": { "version": "1.4.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/assert/-/assert-1.4.1.tgz", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", "dev": true, "requires": { @@ -366,7 +368,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -474,7 +476,7 @@ }, "big.js": { "version": "3.2.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/big.js/-/big.js-3.2.0.tgz", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, @@ -492,7 +494,7 @@ }, "bn.js": { "version": "4.11.8", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/bn.js/-/bn.js-4.11.8.tgz", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, @@ -569,13 +571,13 @@ }, "brorand": { "version": "1.1.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/brorand/-/brorand-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { @@ -612,7 +614,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -622,7 +624,7 @@ }, "browserify-sign": { "version": "4.0.4", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/browserify-sign/-/browserify-sign-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { @@ -637,7 +639,7 @@ }, "browserify-zlib": { "version": "0.2.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { @@ -646,7 +648,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -669,13 +671,13 @@ }, "buffer-xor": { "version": "1.0.3", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/buffer-xor/-/buffer-xor-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, "builtin-status-codes": { "version": "3.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, @@ -779,7 +781,7 @@ }, "cipher-base": { "version": "1.0.4", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/cipher-base/-/cipher-base-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { @@ -920,7 +922,7 @@ }, "console-browserify": { "version": "1.1.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/console-browserify/-/console-browserify-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { @@ -929,7 +931,7 @@ }, "constants-browserify": { "version": "1.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/constants-browserify/-/constants-browserify-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, @@ -995,7 +997,7 @@ }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1008,7 +1010,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1035,7 +1037,7 @@ }, "crypto-browserify": { "version": "3.12.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { @@ -1060,7 +1062,7 @@ }, "date-now": { "version": "0.1.4", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/date-now/-/date-now-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, @@ -1164,7 +1166,7 @@ }, "des.js": { "version": "1.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/des.js/-/des.js-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { @@ -1186,7 +1188,7 @@ }, "diffie-hellman": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { @@ -1261,7 +1263,7 @@ }, "emojis-list": { "version": "2.1.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/emojis-list/-/emojis-list-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, @@ -1294,7 +1296,8 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true }, "errno": { "version": "0.1.7", @@ -1338,7 +1341,7 @@ }, "estraverse": { "version": "4.2.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/estraverse/-/estraverse-4.2.0.tgz", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, @@ -1356,7 +1359,7 @@ }, "events": { "version": "1.1.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/events/-/events-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, @@ -1371,7 +1374,7 @@ }, "evp_bytestokey": { "version": "1.0.3", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { @@ -1569,7 +1572,7 @@ }, "fast-json-stable-stringify": { "version": "2.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, @@ -1782,12 +1785,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1800,17 +1805,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1925,7 +1933,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1937,6 +1946,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1951,6 +1961,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2061,7 +2072,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2073,6 +2085,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2193,6 +2206,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2256,7 +2270,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, @@ -2400,7 +2414,7 @@ }, "hmac-drbg": { "version": "1.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { @@ -2476,7 +2490,7 @@ }, "https-browserify": { "version": "1.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/https-browserify/-/https-browserify-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, @@ -2519,7 +2533,7 @@ }, "indexof": { "version": "0.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/indexof/-/indexof-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, @@ -2551,7 +2565,7 @@ }, "interpret": { "version": "1.1.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/interpret/-/interpret-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, @@ -2581,7 +2595,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -2616,7 +2630,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -2789,7 +2803,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/json5/-/json5-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -2818,6 +2832,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", + "dev": true, "requires": { "uc.micro": "^1.0.1" } @@ -2830,7 +2845,7 @@ }, "loader-utils": { "version": "1.1.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/loader-utils/-/loader-utils-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { @@ -2914,6 +2929,7 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, "requires": { "argparse": "^1.0.7", "entities": "~1.1.1", @@ -2925,7 +2941,8 @@ "uc.micro": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==" + "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", + "dev": true } } }, @@ -2943,7 +2960,8 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true }, "media-typer": { "version": "0.3.0", @@ -2964,7 +2982,7 @@ }, "memory-fs": { "version": "0.4.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/memory-fs/-/memory-fs-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { @@ -3007,7 +3025,7 @@ }, "miller-rabin": { "version": "4.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/miller-rabin/-/miller-rabin-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { @@ -3050,14 +3068,14 @@ }, "minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "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": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -3074,6 +3092,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3083,7 +3102,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "dev": true, + "optional": true } } }, @@ -3138,7 +3158,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -3148,7 +3168,8 @@ "monaco-editor": { "version": "0.15.6", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.15.6.tgz", - "integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg==" + "integrity": "sha512-JoU9V9k6KqT9R9Tiw1RTU8ohZ+Xnf9DMg6Ktqqw5hILumwmq7xqa/KLXw513uTUsWbhtnHoSJYYR++u3pkyxJg==", + "dev": true }, "move-concurrently": { "version": "1.0.1", @@ -3238,7 +3259,7 @@ }, "node-libs-browser": { "version": "2.1.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { @@ -3404,7 +3425,7 @@ }, "os-browserify": { "version": "0.3.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/os-browserify/-/os-browserify-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, @@ -3486,7 +3507,7 @@ }, "parse-asn1": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { @@ -3511,7 +3532,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -3529,7 +3550,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -3613,7 +3634,7 @@ }, "process": { "version": "0.11.10", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/process/-/process-0.11.10.tgz", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, @@ -3641,7 +3662,7 @@ }, "prr": { "version": "1.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/prr/-/prr-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, @@ -3712,13 +3733,13 @@ }, "querystring": { "version": "0.2.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/querystring/-/querystring-0.2.0.tgz", + "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://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/querystring-es3/-/querystring-es3-0.2.1.tgz", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, @@ -3730,7 +3751,7 @@ }, "randombytes": { "version": "2.0.6", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/randombytes/-/randombytes-2.0.6.tgz", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { @@ -3900,7 +3921,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -4029,7 +4050,7 @@ }, "setimmediate": { "version": "1.0.5", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/setimmediate/-/setimmediate-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, @@ -4041,7 +4062,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -4360,7 +4381,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "6.0.1", @@ -4400,7 +4422,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { @@ -4467,7 +4489,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -4592,7 +4614,7 @@ }, "to-arraybuffer": { "version": "1.0.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, @@ -4646,7 +4668,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -4667,15 +4689,16 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "uc.micro": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.3.tgz", - "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=" + "integrity": "sha1-ftUNXg+an7ClczeSWfKndFjVAZI=", + "dev": true }, "union-value": { "version": "1.0.0", @@ -4799,7 +4822,7 @@ }, "url": { "version": "0.11.0", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/url/-/url-0.11.0.tgz", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { @@ -4809,7 +4832,7 @@ "dependencies": { "punycode": { "version": "1.3.2", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/punycode/-/punycode-1.3.2.tgz", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true } @@ -4873,11 +4896,12 @@ "vkbeautify": { "version": "0.99.3", "resolved": "https://registry.npmjs.org/vkbeautify/-/vkbeautify-0.99.3.tgz", - "integrity": "sha512-2ozZEFfmVvQcHWoHLNuiKlUfDKlhh4KGsy54U0UrlLMR1SO+XKAIDqBxtBwHgNrekurlJwE8A9K6L49T78ZQ9Q==" + "integrity": "sha512-2ozZEFfmVvQcHWoHLNuiKlUfDKlhh4KGsy54U0UrlLMR1SO+XKAIDqBxtBwHgNrekurlJwE8A9K6L49T78ZQ9Q==", + "dev": true }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -5121,7 +5145,7 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://microsoft.pkgs.visualstudio.com/_packaging/AdaptiveCards/npm/registry/source-map/-/source-map-0.6.1.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } @@ -5169,7 +5193,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/source/nodejs/adaptivecards-visualizer/package.json b/source/nodejs/adaptivecards-visualizer/package.json index 055a26ebd1..26f2979be7 100644 --- a/source/nodejs/adaptivecards-visualizer/package.json +++ b/source/nodejs/adaptivecards-visualizer/package.json @@ -1,6 +1,6 @@ { "name": "adaptivecards-visualizer", - "version": "1.2.0", + "version": "1.2.2", "description": "Adaptive Card Visualizer for HTML renderer", "author": "AdaptiveCards", "license": "MIT", @@ -16,15 +16,13 @@ "start": "webpack-dev-server --open", "release": "npm run clean && npm run build && webpack --mode=production" }, - "dependencies": { - "adaptivecards": "^1.2.0", + "devDependencies": { + "adaptivecards": "^1.3.0-alpha1", "markdown-it": "^8.4.0", "monaco-editor": "^0.15.6", - "vkbeautify": "^0.99.3" - }, - "devDependencies": { "rimraf": "^2.6.2", "typescript": "^3.2.2", + "vkbeautify": "^0.99.3", "webpack": "^4.27.1", "webpack-cli": "^3.1.2", "webpack-dev-server": "^3.1.14" diff --git a/source/nodejs/adaptivecards/example.html b/source/nodejs/adaptivecards/example.html index 4ada6bebd1..a8c290226d 100644 --- a/source/nodejs/adaptivecards/example.html +++ b/source/nodejs/adaptivecards/example.html @@ -53,7 +53,7 @@ adaptiveCard.hostConfig = new AdaptiveCards.HostConfig({ fontFamily: "Segoe UI, Helvetica Neue, sans-serif" // More host config options - // You can find example configs here: https://github.com/microsoft/AdaptiveCards/tree/master/samples/HostConfig + // You can find example configs here: https://github.com/microsoft/AdaptiveCards/tree/master/samples/HostConfig }); // Set the adaptive card's event handlers. onExecuteAction is invoked diff --git a/source/nodejs/adaptivecards/package-lock.json b/source/nodejs/adaptivecards/package-lock.json index f06db870fa..c93a572cff 100644 --- a/source/nodejs/adaptivecards/package-lock.json +++ b/source/nodejs/adaptivecards/package-lock.json @@ -1,6 +1,6 @@ { "name": "adaptivecards", - "version": "1.2.0", + "version": "1.3.0-alpha1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1289,7 +1289,7 @@ }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { @@ -1332,7 +1332,7 @@ }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { @@ -2277,7 +2277,7 @@ }, "events": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "dev": true }, @@ -2783,12 +2783,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2801,17 +2803,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2926,7 +2931,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2938,6 +2944,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2952,6 +2959,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3062,7 +3070,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3074,6 +3083,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3194,6 +3204,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3263,7 +3274,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, @@ -3368,26 +3379,6 @@ "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, - "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", - "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "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 - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -3695,7 +3686,7 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { @@ -3751,7 +3742,7 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { @@ -4062,6 +4053,15 @@ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, "istanbul-lib-instrument": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", @@ -4077,6 +4077,17 @@ "semver": "^6.0.0" } }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + } + }, "istanbul-lib-source-maps": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", @@ -4090,6 +4101,22 @@ "source-map": "^0.6.1" }, "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -4098,6 +4125,16 @@ } } }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -4142,6 +4179,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -4151,15 +4197,6 @@ "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", "dev": true }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, "istanbul-lib-instrument": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", @@ -4175,50 +4212,6 @@ "semver": "^5.5.0" } }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "istanbul-lib-source-maps": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz", @@ -4262,6 +4255,26 @@ "dev": true, "requires": { "handlebars": "^4.1.2" + }, + "dependencies": { + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "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 + } } }, "jest": { @@ -4732,16 +4745,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -4820,7 +4823,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -5149,7 +5152,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -5158,6 +5161,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5167,7 +5171,8 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "dev": true, + "optional": true } } }, @@ -5222,7 +5227,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -5795,7 +5800,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -5813,7 +5818,7 @@ }, "path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -6156,7 +6161,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { @@ -6379,7 +6384,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -7023,7 +7028,7 @@ }, "stream-browserify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { @@ -7082,7 +7087,7 @@ }, "string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -7106,7 +7111,7 @@ }, "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, @@ -7346,7 +7351,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -7391,9 +7396,9 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "uglify-js": { @@ -7649,7 +7654,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -8019,7 +8024,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -8044,7 +8049,7 @@ }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { diff --git a/source/nodejs/adaptivecards/package.json b/source/nodejs/adaptivecards/package.json index 416c2aa1b1..ea4327ee7f 100644 --- a/source/nodejs/adaptivecards/package.json +++ b/source/nodejs/adaptivecards/package.json @@ -1,6 +1,6 @@ { "name": "adaptivecards", - "version": "1.2.0", + "version": "1.3.0-alpha1", "description": "Adaptive Cards Javascript library for HTML Clients", "author": "AdaptiveCards", "license": "MIT", diff --git a/source/nodejs/adaptivecards/src/card-elements.ts b/source/nodejs/adaptivecards/src/card-elements.ts index b841fa3e0b..589dd00f11 100644 --- a/source/nodejs/adaptivecards/src/card-elements.ts +++ b/source/nodejs/adaptivecards/src/card-elements.ts @@ -42,7 +42,7 @@ function createCardObjectInstance( if (json && typeof json === "object") { let tryToFallback = false; - let typeName = Utils.getStringValue(json["type"]); + let typeName = Utils.getStringValue(json["type"]); if (forbiddenTypeNames && forbiddenTypeNames.indexOf(typeName) >= 0) { raiseParseError(createValidationErrorCallback(typeName, InstanceCreationErrorType.ForbiddenType), errors); @@ -166,7 +166,14 @@ export abstract class SerializableObject { } setCustomProperty(name: string, value: any) { - this._rawProperties[name] = value; + let shouldDeleteProperty = (typeof value === "string" && Utils.isNullOrEmpty(value)) || value === undefined || value === null; + + if (shouldDeleteProperty) { + delete this._rawProperties[name]; + } + else { + this._rawProperties[name] = value; + } } getCustomProperty(name: string): any { @@ -286,7 +293,19 @@ export abstract class CardElement extends CardObject { }, this.separatorOrientation); - return renderedSeparator; + if (AdaptiveCard.alwaysBleedSeparators && renderedSeparator && this.separatorOrientation == Enums.Orientation.Horizontal) { + // Adjust separator's margins if the option to always bleed separators is turned on + let parentContainer = this.getParentContainer(); + + if (parentContainer && parentContainer.getEffectivePadding()) { + let parentPhysicalPadding = this.hostConfig.paddingDefinitionToSpacingDefinition(parentContainer.getEffectivePadding()); + + renderedSeparator.style.marginLeft = "-" + parentPhysicalPadding.left + "px"; + renderedSeparator.style.marginRight = "-" + parentPhysicalPadding.right + "px"; + } + } + + return renderedSeparator; } private updateRenderedElementVisibility() { @@ -478,8 +497,8 @@ export abstract class CardElement extends CardObject { return false; } - toJSON() { - let result = super.toJSON(); + toJSON(): any { + let result = super.toJSON(); Utils.setProperty(result, "isVisible", this.isVisible, true); @@ -491,8 +510,8 @@ export abstract class CardElement extends CardObject { Utils.setProperty(result, "separator", this.separator, false); Utils.setProperty(result, "height", this.height, "auto"); - if (this.minPixelHeight) { - Utils.setProperty(result, "minHeight", this.minPixelHeight + "px"); + if (this.supportsMinHeight) { + Utils.setProperty(result, "minHeight", typeof this.minPixelHeight === "number" && !isNaN(this.minPixelHeight) ? this.minPixelHeight + "px" : undefined); } return result; @@ -570,7 +589,7 @@ export abstract class CardElement extends CardObject { } parse(json: any, errors?: Array) { - super.parse(json, errors); + super.parse(json, errors); raiseParseElementEvent(this, json, errors); @@ -642,6 +661,9 @@ export abstract class CardElement extends CardObject { } } } + else { + this.minPixelHeight = null; + } } getActionCount(): number { @@ -1310,7 +1332,7 @@ export class TextBlock extends BaseTextBlock { maxLines: number; useMarkdown: boolean = true; - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "wrap", this.wrap, false); @@ -1655,22 +1677,31 @@ export class RichTextBlock extends CardElement { } } -export class Fact { +export class Fact extends SerializableObject { name: string; value: string; constructor(name: string = undefined, value: string = undefined) { + super(); + this.name = name; this.value = value; } parse(json: any) { + super.parse(json); + this.name = Utils.getStringValue(json["title"]); this.value = Utils.getStringValue(json["value"]); } toJSON() { - return { title: this.name, value: this.value }; + let result = super.toJSON(); + + Utils.setProperty(result, "title", this.name); + Utils.setProperty(result, "value", this.value); + + return result; } } @@ -1761,16 +1792,22 @@ export class FactSet extends CardElement { return "FactSet"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); - let facts = [] + Utils.setArrayProperty(result, "facts", this.facts); - for (let fact of this.facts) { - facts.push(fact.toJSON()); - } + /* + let facts = []; + + if (this.facts) { + for (let fact of this.facts) { + facts.push(fact.toJSON()); + } + } Utils.setProperty(result, "facts", facts); + */ return result; } @@ -1780,18 +1817,16 @@ export class FactSet extends CardElement { this.facts = []; - if (json["facts"] != null) { - var jsonFacts = json["facts"] as Array; + let jsonFacts = json["facts"]; - this.facts = []; + if (Array.isArray(jsonFacts)) { + for (let jsonFact of jsonFacts) { + let fact = new Fact(); + fact.parse(jsonFact); - for (var i = 0; i < jsonFacts.length; i++) { - let fact = new Fact(); - fact.parse(jsonFacts[i]); - - this.facts.push(fact); - } - } + this.facts.push(fact); + } + } } } @@ -1968,7 +2003,7 @@ export class Image extends CardElement { pixelHeight?: number = null; altText: string = ""; - toJSON() { + toJSON(): any { let result = super.toJSON(); if (this._selectAction) { @@ -2031,7 +2066,7 @@ export class Image extends CardElement { } this.size = Utils.getEnumValue(Enums.Size, json["size"], this.size); - this.altText = json["altText"]; + this.altText = Utils.getStringValue(json["altText"]); // pixelWidth and pixelHeight are only parsed for backwards compatibility. // Payloads should use the width and height proerties instead. @@ -2164,6 +2199,8 @@ export abstract class CardElementContainer extends CardElement { abstract getLastVisibleRenderedItem(): CardElement; abstract removeItem(item: CardElement): boolean; + allowVerticalOverflow: boolean = false; + parse(json: any, errors?: Array) { super.parse(json, errors); @@ -2177,7 +2214,7 @@ export abstract class CardElementContainer extends CardElement { } } - toJSON() { + toJSON(): any { let result = super.toJSON(); if (this._selectAction && this.isSelectable) { @@ -2223,6 +2260,11 @@ export abstract class CardElementContainer extends CardElement { let element = super.render(); let hostConfig = this.hostConfig; + if (this.allowVerticalOverflow) { + element.style.overflowX = "hidden"; + element.style.overflowY = "auto"; + } + if (element && this.isSelectable && this._selectAction && hostConfig.supportsInteractivity) { element.classList.add(hostConfig.makeCssClassName("ac-selectable")); element.tabIndex = 0; @@ -2367,7 +2409,7 @@ export class ImageSet extends CardElementContainer { return "ImageSet"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setEnumProperty(Enums.Size, result, "imageSize", this.imageSize, Enums.Size.Medium); @@ -2420,25 +2462,31 @@ export class ImageSet extends CardElementContainer { } } -export class MediaSource { +export class MediaSource extends SerializableObject { mimeType: string; url: string; constructor(url: string = undefined, mimeType: string = undefined) { + super(); + this.url = url; this.mimeType = mimeType; } parse(json: any, errors?: Array) { - this.mimeType = Utils.getStringValue(json["mimeType"]); - this.url = Utils.getStringValue(json["url"]); - } + super.parse(json, errors); - toJSON() { - return { - mimeType: this.mimeType, - url: this.url - } + this.mimeType = Utils.getStringValue(json["mimeType"]); + this.url = Utils.getStringValue(json["url"]); + } + + toJSON(): any { + let result = super.toJSON(); + + Utils.setProperty(result, "mimeType", this.mimeType); + Utils.setProperty(result, "url", this.url); + + return result; } } @@ -2457,7 +2505,7 @@ export class Media extends CardElement { this._selectedMediaType = undefined; for (let source of this.sources) { - let mimeComponents = source.mimeType.split('/'); + let mimeComponents = source.mimeType ? source.mimeType.split('/') : []; if (mimeComponents.length == 2) { if (!this._selectedMediaType) { @@ -2623,29 +2671,28 @@ export class Media extends CardElement { parse(json: any, errors?: Array) { super.parse(json, errors); - this.poster = Utils.getStringValue(json["poster"]); - this.altText = Utils.getStringValue(json["altText"]); - - if (json["sources"] != null) { - let jsonSources = json["sources"] as Array; + this.poster = Utils.getStringValue(json["poster"]); + this.altText = Utils.getStringValue(json["altText"]); - this.sources = []; + this.sources = []; - for (let i = 0; i < jsonSources.length; i++) { + if (Array.isArray(json["sources"])) { + for (let jsonSource of json["sources"]) { let source = new MediaSource(); - source.parse(jsonSources[i], errors); + source.parse(jsonSource, errors); this.sources.push(source); } } } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "poster", this.poster); Utils.setProperty(result, "altText", this.altText); + /* if (this.sources.length > 0) { let serializedSources = []; @@ -2655,6 +2702,9 @@ export class Media extends CardElement { Utils.setProperty(result, "sources", serializedSources); } + */ + + Utils.setArrayProperty(result, "sources", this.sources); return result; } @@ -2686,18 +2736,20 @@ export class Media extends CardElement { } } -export class InputValidationOptions { +export class InputValidationOptions extends SerializableObject { necessity: Enums.InputValidationNecessity = Enums.InputValidationNecessity.Optional; errorMessage: string = undefined; parse(json: any) { + super.parse(json); + this.necessity = Utils.getEnumValue(Enums.InputValidationNecessity, json["necessity"], this.necessity); this.errorMessage = Utils.getStringValue(json["errorMessage"]); } toJSON() { if (this.necessity != Enums.InputValidationNecessity.Optional || !Utils.isNullOrEmpty(this.errorMessage)) { - let result = {} + let result = super.toJSON(); Utils.setEnumProperty(Enums.InputValidationNecessity, result, "necessity", this.necessity, Enums.InputValidationNecessity.Optional); Utils.setProperty(result, "errorMessage", this.errorMessage); @@ -2798,7 +2850,7 @@ export abstract class Input extends CardElement implements Shared.IInput { title: string; - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "title", this.title); @@ -3013,7 +3065,7 @@ export class TextInput extends Input { return result; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "placeholder", this.placeholder); @@ -3135,7 +3187,7 @@ export class ToggleInput extends Input { return "Input.Toggle"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "valueOn", this.valueOn, "true"); @@ -3164,22 +3216,31 @@ export class ToggleInput extends Input { } } -export class Choice { +export class Choice extends SerializableObject { title: string; value: string; constructor(title: string = undefined, value: string = undefined) { + super(); + this.title = title; this.value = value; } parse(json: any) { - this.title = Utils.getStringValue(json["title"]); - this.value = Utils.getStringValue(json["value"]); + super.parse(json); + + this.title = Utils.getStringValue(json["title"], ""); + this.value = Utils.getStringValue(json["value"], ""); } - toJSON() { - return { title: this.title, value: this.value }; + toJSON(): any { + let result = super.toJSON(); + + Utils.setProperty(result, "title", this.title); + Utils.setProperty(result, "value", this.value); + + return result; } } @@ -3368,25 +3429,26 @@ export class ChoiceSetInput extends Input { return "Input.ChoiceSet"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "placeholder", this.placeholder); - if (this.choices.length > 0) { - var choices = []; + /* + let choices = []; + if (this.choices) { for (let choice of this.choices) { choices.push(choice.toJSON()); } - - Utils.setProperty(result, "choices", choices); } - if (!this.isCompact) { - Utils.setProperty(result, "style", "expanded", false); - } + Utils.setProperty(result, "choices", choices); + */ + Utils.setArrayProperty(result, "choices", this.choices); + + Utils.setProperty(result, "style", this.isCompact ? null : "expanded"); Utils.setProperty(result, "isMultiSelect", this.isMultiSelect, false); Utils.setProperty(result, "wrap", this.wrap, false); @@ -3426,12 +3488,10 @@ export class ChoiceSetInput extends Input { this.choices = []; - if (json["choices"] != undefined) { - let choiceArray = json["choices"] as Array; - - for (let i = 0; i < choiceArray.length; i++) { + if (Array.isArray(json["choices"])) { + for (let jsonChoice of json["choices"]) { let choice = new Choice(); - choice.parse(choiceArray[i]); + choice.parse(jsonChoice); this.choices.push(choice); } @@ -3519,7 +3579,7 @@ export class NumberInput extends Input { return "Input.Number"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "placeholder", this.placeholder); @@ -3828,8 +3888,8 @@ export abstract class Action extends CardObject { return ""; } - toJSON() { - let result = super.toJSON(); + toJSON(): any { + let result = super.toJSON(); Utils.setProperty(result, "type", this.getJsonTypeName()); Utils.setProperty(result, "title", this.title); @@ -3927,7 +3987,7 @@ export abstract class Action extends CardObject { }; parse(json: any, errors?: Array) { - super.parse(json, errors); + super.parse(json, errors); raiseParseActionEvent(this, json, errors); @@ -4099,7 +4159,7 @@ export class OpenUrlAction extends Action { return OpenUrlAction.JsonTypeName; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "url", this.url); @@ -4211,23 +4271,32 @@ export class ToggleVisibilityAction extends Action { } } -export class HttpHeader { +export class HttpHeader extends SerializableObject { private _value = new Shared.StringWithSubstitutions(); name: string; constructor(name: string = "", value: string = "") { + super(); + this.name = name; this.value = value; } parse(json: any) { + super.parse(json); + this.name = Utils.getStringValue(json["name"]); this.value = Utils.getStringValue(json["value"]); } - toJSON() { - return { name: this.name, value: this._value.getOriginal() }; + toJSON(): any { + let result = super.toJSON(); + + Utils.setProperty(result, "name", this.name); + Utils.setProperty(result, "value", this._value.getOriginal()); + + return result; } getReferencedInputs(inputs: Array, referencedInputs: Shared.Dictionary) { @@ -4291,7 +4360,7 @@ export class HttpAction extends Action { return HttpAction.JsonTypeName; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "method", this.method); @@ -4299,16 +4368,18 @@ export class HttpAction extends Action { Utils.setProperty(result, "body", this._body.getOriginal()); Utils.setProperty(result, "ignoreInputValidation", this.ignoreInputValidation, false); - if (this._headers.length > 0) { - let headers = []; - - for (let header of this._headers) { - headers.push(header.toJSON()); - } + /* + let headers = []; - Utils.setProperty(result, "headers", headers); + for (let header of this.headers) { + headers.push(header.toJSON()); } + Utils.setProperty(result, "headers", headers); + */ + + Utils.setArrayProperty(result, "headers", this.headers); + return result; } @@ -4348,12 +4419,10 @@ export class HttpAction extends Action { this._headers = []; - if (json["headers"] != null) { - var jsonHeaders = json["headers"] as Array; - - for (var i = 0; i < jsonHeaders.length; i++) { + if (Array.isArray(json["headers"])) { + for (let jsonHeader of json["headers"]) { let httpHeader = new HttpHeader(); - httpHeader.parse(jsonHeaders[i]); + httpHeader.parse(jsonHeader); this.headers.push(httpHeader); } @@ -4408,7 +4477,7 @@ export class ShowCardAction extends Action { return ShowCardAction.JsonTypeName; } - toJSON() { + toJSON(): any { let result = super.toJSON(); if (this.card) { @@ -4640,7 +4709,7 @@ class ActionCollection { } } - toJSON() { + toJSON(): any { if (this.items.length > 0) { let result = []; @@ -4946,7 +5015,7 @@ export class ActionSet extends CardElement { this._actionCollection = new ActionCollection(this); } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setEnumProperty(Enums.Orientation, result, "orientation", this.orientation); @@ -5141,10 +5210,10 @@ export abstract class StylableCardElementContainer extends CardElementContainer } isBleeding(): boolean { - return this.getHasBackground() && this.getBleed(); + return (this.getHasBackground() || this.hostConfig.alwaysAllowBleed) && this.getBleed(); } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "style", this.style); @@ -5206,7 +5275,7 @@ export abstract class StylableCardElementContainer extends CardElementContainer } } -export class BackgroundImage { +export class BackgroundImage extends SerializableObject { private static readonly defaultFillMode = Enums.FillMode.Cover; private static readonly defaultHorizontalAlignment = Enums.HorizontalAlignment.Left; private static readonly defaultVerticalAlignment = Enums.VerticalAlignment.Top; @@ -5224,13 +5293,15 @@ export class BackgroundImage { } parse(json: any, errors?: Array) { + super.parse(json, errors); + this.url = Utils.getStringValue(json["url"]); this.fillMode = Utils.getEnumValue(Enums.FillMode, json["fillMode"], this.fillMode); this.horizontalAlignment = Utils.getEnumValue(Enums.HorizontalAlignment, json["horizontalAlignment"], this.horizontalAlignment); this.verticalAlignment = Utils.getEnumValue(Enums.VerticalAlignment, json["verticalAlignment"], this.verticalAlignment); } - toJSON() { + toJSON(): any { if (!this.isValid()) { return null; } @@ -5238,10 +5309,11 @@ export class BackgroundImage { if (this.fillMode == BackgroundImage.defaultFillMode && this.horizontalAlignment == BackgroundImage.defaultHorizontalAlignment && this.verticalAlignment == BackgroundImage.defaultVerticalAlignment) { + return this.url; } else { - let result = {}; + let result = super.toJSON(); Utils.setProperty(result, "url", this.url); Utils.setEnumProperty(Enums.FillMode, result, "fillMode", this.fillMode, BackgroundImage.defaultFillMode); @@ -5469,7 +5541,7 @@ export class Container extends StylableCardElementContainer { verticalContentAlignment: Enums.VerticalAlignment = Enums.VerticalAlignment.Top; rtl?: boolean = null; - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "backgroundImage", this.backgroundImage.toJSON()); @@ -5767,7 +5839,7 @@ export class Column extends Container { return "Column"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); if (this.width instanceof Shared.SizeAndUnit) { @@ -5804,28 +5876,30 @@ export class Column extends Container { } } - var invalidWidth = false; + if (jsonWidth) { + var invalidWidth = false; - try { - this.width = Shared.SizeAndUnit.parse(jsonWidth); - } - catch (e) { - if (typeof jsonWidth === "string" && (jsonWidth === "auto" || jsonWidth === "stretch")) { - this.width = jsonWidth; + try { + this.width = Shared.SizeAndUnit.parse(jsonWidth); } - else { - invalidWidth = true; + catch (e) { + if (typeof jsonWidth === "string" && (jsonWidth === "auto" || jsonWidth === "stretch")) { + this.width = jsonWidth; + } + else { + invalidWidth = true; + } } - } - if (invalidWidth) { - raiseParseError( - { - error: Enums.ValidationError.InvalidPropertyValue, - message: "Invalid column width:" + jsonWidth + " - defaulting to \"auto\"" - }, - errors - ); + if (invalidWidth) { + raiseParseError( + { + error: Enums.ValidationError.InvalidPropertyValue, + message: "Invalid column width:" + jsonWidth + " - defaulting to \"auto\"" + }, + errors + ); + } } } @@ -5957,7 +6031,7 @@ export class ColumnSet extends StylableCardElementContainer { return true; } - toJSON() { + toJSON(): any { let result = super.toJSON(); if (this._columns.length > 0) { @@ -6335,7 +6409,7 @@ export abstract class ContainerWithActions extends Container { this._actionCollection = new ActionCollection(this); } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "actions", this._actionCollection.toJSON()); @@ -6655,7 +6729,7 @@ export class AdaptiveCard extends ContainerWithActions { return "AdaptiveCard"; } - toJSON() { + toJSON(): any { let result = super.toJSON(); Utils.setProperty(result, "$schema", "http://adaptivecards.io/schemas/adaptive-card.json"); @@ -6707,7 +6781,7 @@ export class AdaptiveCard extends ContainerWithActions { this._cardTypeName = Utils.getStringValue(json["type"]); this.speak = Utils.getStringValue(json["speak"]); - let langId = json["lang"]; + var langId = Utils.getStringValue(json["lang"]); if (langId && typeof langId === "string") { try { @@ -7117,4 +7191,4 @@ const defaultHostConfig: HostConfig.HostConfig = new HostConfig.HostConfig( }, spacing: 10 } - }); + }); \ No newline at end of file diff --git a/source/nodejs/adaptivecards/src/host-config.ts b/source/nodejs/adaptivecards/src/host-config.ts index fb216992cf..3142d278e2 100644 --- a/source/nodejs/adaptivecards/src/host-config.ts +++ b/source/nodejs/adaptivecards/src/host-config.ts @@ -394,10 +394,12 @@ export class Version { private _major: number; private _minor: number; private _isValid: boolean = true; + private _label: string; - constructor(major: number = 1, minor: number = 1) { + constructor(major: number = 1, minor: number = 1, label?: string) { this._major = major; this._minor = minor; + this._label = label; } static parse(versionString: string, errors?: Array): Version { @@ -456,6 +458,10 @@ export class Version { return 0; } + get label(): string { + return this._label ? this._label : this.toString(); + } + get major(): number { return this._major; } @@ -648,6 +654,7 @@ export class HostConfig { readonly factSet: FactSetConfig = new FactSetConfig(); cssClassNamePrefix: string = null; + alwaysAllowBleed: boolean = false; constructor(obj?: any) { if (obj) { diff --git a/source/nodejs/adaptivecards/src/utils.ts b/source/nodejs/adaptivecards/src/utils.ts index 8354f7478a..da13469184 100644 --- a/source/nodejs/adaptivecards/src/utils.ts +++ b/source/nodejs/adaptivecards/src/utils.ts @@ -26,7 +26,7 @@ export function appendChild(node: Node, child: Node) { } } -export function setProperty(target: any, propertyName: string, propertyValue: any, defaultValue: any = undefined) { +export function setProperty(target: object, propertyName: string, propertyValue: any, defaultValue: any = undefined) { if (propertyValue === null || propertyValue === undefined || propertyValue === defaultValue) { delete target[propertyName]; } @@ -35,7 +35,7 @@ export function setProperty(target: any, propertyName: string, propertyValue: an } } -export function setEnumProperty(enumType: { [s: number]: string }, target: any, propertyName: string, propertyValue: number, defaultValue: number = undefined) { +export function setEnumProperty(enumType: { [s: number]: string }, target: object, propertyName: string, propertyValue: number, defaultValue: number = undefined) { let targetValue = target[propertyName]; let canDeleteTarget = targetValue == undefined ? true : enumType[targetValue] !== undefined; @@ -57,6 +57,25 @@ export function setEnumProperty(enumType: { [s: number]: string }, target: any, } } +export function setArrayProperty(target: object, propertyName: string, propertyValue: any[]) { + let items = []; + + if (propertyValue) { + for (let item of propertyValue) { + items.push(item.toJSON()); + } + } + + if (items.length == 0) { + if (target.hasOwnProperty(propertyName) && Array.isArray(target[propertyName])) { + delete target[propertyName]; + } + } + else { + setProperty(target, propertyName, items); + } +} + export function getBoolValue(value: any, defaultValue: boolean): boolean { if (typeof value === "boolean") { return value; diff --git a/source/nodejs/package-lock.json b/source/nodejs/package-lock.json index d2b56dca5e..06435c7039 100644 --- a/source/nodejs/package-lock.json +++ b/source/nodejs/package-lock.json @@ -815,14 +815,14 @@ "dev": true }, "@octokit/endpoint": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-4.2.2.tgz", - "integrity": "sha512-5IZjkUNhx5q0IRN7Juwf5A+Lu2qAso7ULST7C1P2mbGHePuCOk936Stcl/5GdJpB3ovD8M6/Lv3xra6Mn0IKNQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.2.0.tgz", + "integrity": "sha512-g4r1MKr8GJ8qubJQp3HP3JrxDY+ZeVqjYBTgtu1lPEDLhfQDY6rOhyZOoHKOw+gaIF6aAcmuvPPNZUro2OwmOg==", "dev": true, "requires": { - "deepmerge": "3.2.0", + "deepmerge": "3.3.0", "is-plain-object": "^3.0.0", - "universal-user-agent": "^2.0.1", + "universal-user-agent": "^2.1.0", "url-template": "^2.0.8" }, "dependencies": { @@ -850,19 +850,26 @@ "dev": true }, "@octokit/request": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-3.0.1.tgz", - "integrity": "sha512-aH61OVkMKMofGW/go2x4mJ44X4U/JF8xsiFFictwkZYtz0psE8OPKpsP2TZBZaJoCg2wmeTyEgqGfY+veg0hGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-4.1.0.tgz", + "integrity": "sha512-RvpQAba4i+BNH0z8i0gPRc1ShlHidj4puQjI/Tno6s+Q3/Mzb0XRSHJiOhpeFrZ22V7Mwjq1E7QS27P5CgpWYA==", "dev": true, "requires": { - "@octokit/endpoint": "^4.0.0", - "deprecation": "^1.0.1", + "@octokit/endpoint": "^5.1.0", + "@octokit/request-error": "^1.0.1", + "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", "once": "^1.4.0", - "universal-user-agent": "^2.0.1" + "universal-user-agent": "^2.1.0" }, "dependencies": { + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, "is-plain-object": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", @@ -880,17 +887,71 @@ } } }, + "@octokit/request-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.0.2.tgz", + "integrity": "sha512-T9swMS/Vc4QlfWrvyeSyp/GjhXtYaBzCcibjGywV4k4D2qVrQKfEMPy8OxMDEj7zkIIdpHwqdpVbKCvnUPqkXw==", + "dev": true, + "requires": { + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "dependencies": { + "@octokit/endpoint": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-4.2.2.tgz", + "integrity": "sha512-5IZjkUNhx5q0IRN7Juwf5A+Lu2qAso7ULST7C1P2mbGHePuCOk936Stcl/5GdJpB3ovD8M6/Lv3xra6Mn0IKNQ==", + "requires": { + "is-plain-object": "^3.0.0", + "universal-user-agent": "^2.0.1", + "url-template": "^2.0.8" + } + }, + "@octokit/request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-3.0.1.tgz", + "integrity": "sha512-aH61OVkMKMofGW/go2x4mJ44X4U/JF8xsiFFictwkZYtz0psE8OPKpsP2TZBZaJoCg2wmeTyEgqGfY+veg0hGQ==", + "requires": { + "@octokit/endpoint": "^4.0.0", + "is-plain-object": "^3.0.0", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^2.0.1" + } + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + } + } + }, "@octokit/rest": { - "version": "16.25.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.25.1.tgz", - "integrity": "sha512-a1Byzjj07OMQNUQDP5Ng/rChaI7aq6TNMY1ZFf8+zCVEEtYzCgcmrFG9BDerFbLPPKGQ5TAeRRFyLujUUN1HIg==", + "version": "16.28.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.28.2.tgz", + "integrity": "sha512-csuYiHvJ1P/GFDadVn0QhwO83R1+YREjcwCY7ZIezB6aJTRIEidJZj+R7gAkUhT687cqYb4cXTZsDVu9F+Fmug==", "dev": true, "requires": { - "@octokit/request": "3.0.1", + "@octokit/request": "^4.0.1", + "@octokit/request-error": "^1.0.2", "atob-lite": "^2.0.0", "before-after-hook": "^1.4.0", "btoa-lite": "^1.0.0", - "deprecation": "^1.0.1", + "deprecation": "^2.0.0", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "lodash.uniq": "^4.5.0", @@ -1514,7 +1575,7 @@ }, "array-equal": { "version": "1.0.0", - "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, @@ -3007,14 +3068,14 @@ "dev": true }, "cosmiconfig": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", - "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.13.0", + "js-yaml": "^3.13.1", "parse-json": "^4.0.0" } }, @@ -3059,7 +3120,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -3289,9 +3349,9 @@ "dev": true }, "deepmerge": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", - "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", "dev": true }, "default-gateway": { @@ -3415,9 +3475,9 @@ "dev": true }, "deprecation": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-1.0.1.tgz", - "integrity": "sha512-ccVHpE72+tcIKaGMql33x5MAjKQIZrk+3x2GbJ7TeraUCZWHoT+KSZpoC+JQFsUBlSTXUrBaGiF0j6zVTepPLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.0.0.tgz", + "integrity": "sha512-lbQN037mB3VfA2JFuguM5GCJ+zPinMeCrFe+AfSZ6eqrnJA/Fs+EYMnd6Nb2mn9lf2jO9xwEd9o9lic+D4vkcw==", "dev": true }, "des.js": { @@ -3937,7 +3997,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -4992,6 +5051,16 @@ "map-obj": "^1.0.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.0.0", + "pinkie-promise": "^2.0.0" + } + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -5001,6 +5070,19 @@ "repeating": "^2.0.0" } }, + "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.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -5025,6 +5107,62 @@ "trim-newlines": "^1.0.0" } }, + "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.2.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.0" + } + }, + "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.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.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.0.0", + "read-pkg": "^1.0.0" + } + }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -5035,6 +5173,15 @@ "strip-indent": "^1.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.0" + } + }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", @@ -5068,7 +5215,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -9442,8 +9588,7 @@ "macos-release": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", - "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", - "dev": true + "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==" }, "make-dir": { "version": "1.3.0", @@ -9905,8 +10050,7 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { "version": "2.3.2", @@ -9918,10 +10062,9 @@ } }, "node-fetch": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.5.0.tgz", - "integrity": "sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw==", - "dev": true + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, "node-fetch-npm": { "version": "2.0.2", @@ -10415,7 +10558,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", - "dev": true, "requires": { "macos-release": "^2.2.0", "windows-release": "^3.1.0" @@ -11182,96 +11324,6 @@ "path-type": "^3.0.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.0.0", - "read-pkg": "^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.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "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.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "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.2.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.0" - } - }, - "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.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "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.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.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.0" - } - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -13094,10 +13146,9 @@ } }, "universal-user-agent": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.3.tgz", - "integrity": "sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", + "integrity": "sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q==", "requires": { "os-name": "^3.0.0" } @@ -13215,8 +13266,7 @@ "url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=" }, "use": { "version": "3.1.1", @@ -13889,7 +13939,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", - "dev": true, "requires": { "execa": "^1.0.0" } @@ -13924,9 +13973,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", diff --git a/source/nodejs/spec-generator/package-lock.json b/source/nodejs/spec-generator/package-lock.json index babd12a471..20460addc4 100644 --- a/source/nodejs/spec-generator/package-lock.json +++ b/source/nodejs/spec-generator/package-lock.json @@ -1,6 +1,6 @@ { "name": "spec-generator", - "version": "0.5.0", + "version": "0.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -274,6 +274,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -361,7 +362,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base": { "version": "0.11.2", @@ -452,6 +454,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -634,7 +637,8 @@ "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true }, "camelcase": { "version": "5.3.1", @@ -766,7 +770,8 @@ "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -783,7 +788,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -835,7 +841,8 @@ "core-js": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -928,6 +935,7 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, "requires": { "ms": "^2.1.1" } @@ -1083,7 +1091,8 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", @@ -1104,7 +1113,8 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esrecurse": { "version": "4.2.1", @@ -1400,7 +1410,8 @@ "format-util": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.3.tgz", - "integrity": "sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU=" + "integrity": "sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU=", + "dev": true }, "fragment-cache": { "version": "0.2.1", @@ -1424,7 +1435,8 @@ "fs": { "version": "0.0.1-security", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", + "dev": true }, "fs-write-stream-atomic": { "version": "1.0.10", @@ -1441,7 +1453,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "1.2.9", @@ -2016,6 +2029,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2192,6 +2206,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -2200,7 +2215,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "1.3.5", @@ -2390,6 +2406,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2405,6 +2422,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-3.3.1.tgz", "integrity": "sha512-stQTMhec2R/p2L9dH4XXRlpNCP0mY8QrLd/9Kl+8SHJQmwHtE1nDfXH4wbsSM+GkJMl8t92yZbI0OIol432CIQ==", + "dev": true, "requires": { "call-me-maybe": "^1.0.1", "debug": "^3.0.0", @@ -2474,12 +2492,14 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true }, "lru-cache": { "version": "5.1.1", @@ -2534,6 +2554,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/marked-schema/-/marked-schema-0.1.4.tgz", "integrity": "sha512-E+QWRGGHJiH+WSphMC1FS5Yyhy/l6UHpPN+NdEF4vaPJGegr05uQtXaxsE66Y44LlvEPV9WZpdHLddrplufn4w==", + "dev": true, "requires": { "fs": "0.0.1-security", "glob": "^7.1.2", @@ -2629,6 +2650,7 @@ "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.7" } @@ -2636,7 +2658,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true }, "mississippi": { "version": "3.0.0", @@ -2711,7 +2734,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "nan": { "version": "2.14.0", @@ -2809,6 +2833,7 @@ "version": "6.9.0", "resolved": "https://registry.npmjs.org/npm/-/npm-6.9.0.tgz", "integrity": "sha512-91V+zB5hDxO+Jyp2sUKS7juHlIM95dGQxTeQtmZI1nAI/7kjWXFipPrtwwKjhyKmV4GsS2LzJhrxRjGWsU9z/w==", + "dev": true, "requires": { "JSONStream": "^1.3.5", "abbrev": "~1.1.1", @@ -2937,6 +2962,7 @@ "JSONStream": { "version": "1.3.5", "bundled": true, + "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -2944,11 +2970,13 @@ }, "abbrev": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "agent-base": { "version": "4.2.1", "bundled": true, + "dev": true, "requires": { "es6-promisify": "^5.0.0" } @@ -2956,6 +2984,7 @@ "agentkeepalive": { "version": "3.4.1", "bundled": true, + "dev": true, "requires": { "humanize-ms": "^1.2.1" } @@ -2963,6 +2992,7 @@ "ajv": { "version": "5.5.2", "bundled": true, + "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -2973,40 +3003,48 @@ "ansi-align": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "string-width": "^2.0.0" } }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "ansi-styles": { "version": "3.2.1", "bundled": true, + "dev": true, "requires": { "color-convert": "^1.9.0" } }, "ansicolors": { "version": "0.3.2", - "bundled": true + "bundled": true, + "dev": true }, "ansistyles": { "version": "0.1.3", - "bundled": true + "bundled": true, + "dev": true }, "aproba": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "archy": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, + "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -3015,6 +3053,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3028,6 +3067,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3036,38 +3076,46 @@ }, "asap": { "version": "2.0.6", - "bundled": true + "bundled": true, + "dev": true }, "asn1": { "version": "0.2.4", "bundled": true, + "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "assert-plus": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "asynckit": { "version": "0.4.0", - "bundled": true + "bundled": true, + "dev": true }, "aws-sign2": { "version": "0.7.0", - "bundled": true + "bundled": true, + "dev": true }, "aws4": { "version": "1.8.0", - "bundled": true + "bundled": true, + "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "bundled": true, + "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -3076,6 +3124,7 @@ "bin-links": { "version": "1.1.2", "bundled": true, + "dev": true, "requires": { "bluebird": "^3.5.0", "cmd-shim": "^2.0.2", @@ -3087,17 +3136,20 @@ "block-stream": { "version": "0.0.9", "bundled": true, + "dev": true, "requires": { "inherits": "~2.0.0" } }, "bluebird": { "version": "3.5.3", - "bundled": true + "bundled": true, + "dev": true }, "boxen": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "ansi-align": "^2.0.0", "camelcase": "^4.0.0", @@ -3111,6 +3163,7 @@ "brace-expansion": { "version": "1.1.11", "bundled": true, + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3118,23 +3171,28 @@ }, "buffer-from": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "builtins": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true }, "byline": { "version": "5.0.0", - "bundled": true + "bundled": true, + "dev": true }, "byte-size": { "version": "5.0.1", - "bundled": true + "bundled": true, + "dev": true }, "cacache": { "version": "11.3.2", "bundled": true, + "dev": true, "requires": { "bluebird": "^3.5.3", "chownr": "^1.1.1", @@ -3154,11 +3212,13 @@ "dependencies": { "chownr": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "lru-cache": { "version": "5.1.1", "bundled": true, + "dev": true, "requires": { "yallist": "^3.0.2" } @@ -3166,35 +3226,42 @@ "unique-filename": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "unique-slug": "^2.0.0" } }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, "call-limit": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "camelcase": { "version": "4.1.0", - "bundled": true + "bundled": true, + "dev": true }, "capture-stack-trace": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "caseless": { "version": "0.12.0", - "bundled": true + "bundled": true, + "dev": true }, "chalk": { "version": "2.4.1", "bundled": true, + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3203,26 +3270,31 @@ }, "chownr": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "ci-info": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "cidr-regex": { "version": "2.0.10", "bundled": true, + "dev": true, "requires": { "ip-regex": "^2.1.0" } }, "cli-boxes": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "cli-columns": { "version": "3.1.2", "bundled": true, + "dev": true, "requires": { "string-width": "^2.0.0", "strip-ansi": "^3.0.1" @@ -3231,6 +3303,7 @@ "cli-table3": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "colors": "^1.1.2", "object-assign": "^4.1.0", @@ -3240,6 +3313,7 @@ "cliui": { "version": "4.1.0", "bundled": true, + "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -3248,11 +3322,13 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -3261,11 +3337,13 @@ }, "clone": { "version": "1.0.4", - "bundled": true + "bundled": true, + "dev": true }, "cmd-shim": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "mkdirp": "~0.5.0" @@ -3273,31 +3351,37 @@ }, "co": { "version": "4.6.0", - "bundled": true + "bundled": true, + "dev": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "color-convert": { "version": "1.9.1", "bundled": true, + "dev": true, "requires": { "color-name": "^1.1.1" } }, "color-name": { "version": "1.1.3", - "bundled": true + "bundled": true, + "dev": true }, "colors": { "version": "1.3.3", "bundled": true, + "dev": true, "optional": true }, "columnify": { "version": "1.5.4", "bundled": true, + "dev": true, "requires": { "strip-ansi": "^3.0.0", "wcwidth": "^1.0.0" @@ -3306,17 +3390,20 @@ "combined-stream": { "version": "1.0.6", "bundled": true, + "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "concat-stream": { "version": "1.6.2", "bundled": true, + "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -3327,6 +3414,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3340,6 +3428,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3349,6 +3438,7 @@ "config-chain": { "version": "1.1.12", "bundled": true, + "dev": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -3357,6 +3447,7 @@ "configstore": { "version": "3.1.2", "bundled": true, + "dev": true, "requires": { "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", @@ -3368,11 +3459,13 @@ }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "copy-concurrently": { "version": "1.0.5", "bundled": true, + "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -3384,21 +3477,25 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "iferr": { "version": "0.1.5", - "bundled": true + "bundled": true, + "dev": true } } }, "core-util-is": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "create-error-class": { "version": "3.0.2", "bundled": true, + "dev": true, "requires": { "capture-stack-trace": "^1.0.0" } @@ -3406,6 +3503,7 @@ "cross-spawn": { "version": "5.1.0", "bundled": true, + "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -3414,15 +3512,18 @@ }, "crypto-random-string": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "cyclist": { "version": "0.2.2", - "bundled": true + "bundled": true, + "dev": true }, "dashdash": { "version": "1.14.1", "bundled": true, + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -3430,58 +3531,70 @@ "debug": { "version": "3.1.0", "bundled": true, + "dev": true, "requires": { "ms": "2.0.0" }, "dependencies": { "ms": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "debuglog": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "decamelize": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true + "bundled": true, + "dev": true }, "deep-extend": { "version": "0.5.1", - "bundled": true + "bundled": true, + "dev": true }, "defaults": { "version": "1.0.3", "bundled": true, + "dev": true, "requires": { "clone": "^1.0.2" } }, "delayed-stream": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "detect-indent": { "version": "5.0.0", - "bundled": true + "bundled": true, + "dev": true }, "detect-newline": { "version": "2.1.0", - "bundled": true + "bundled": true, + "dev": true }, "dezalgo": { "version": "1.0.3", "bundled": true, + "dev": true, "requires": { "asap": "^2.0.0", "wrappy": "1" @@ -3490,21 +3603,25 @@ "dot-prop": { "version": "4.2.0", "bundled": true, + "dev": true, "requires": { "is-obj": "^1.0.0" } }, "dotenv": { "version": "5.0.1", - "bundled": true + "bundled": true, + "dev": true }, "duplexer3": { "version": "0.1.4", - "bundled": true + "bundled": true, + "dev": true }, "duplexify": { "version": "3.6.0", "bundled": true, + "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -3515,6 +3632,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3528,6 +3646,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3537,6 +3656,7 @@ "ecc-jsbn": { "version": "0.1.2", "bundled": true, + "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0", @@ -3545,11 +3665,13 @@ }, "editor": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "encoding": { "version": "0.1.12", "bundled": true, + "dev": true, "requires": { "iconv-lite": "~0.4.13" } @@ -3557,39 +3679,46 @@ "end-of-stream": { "version": "1.4.1", "bundled": true, + "dev": true, "requires": { "once": "^1.4.0" } }, "err-code": { "version": "1.1.2", - "bundled": true + "bundled": true, + "dev": true }, "errno": { "version": "0.1.7", "bundled": true, + "dev": true, "requires": { "prr": "~1.0.1" } }, "es6-promise": { "version": "4.2.6", - "bundled": true + "bundled": true, + "dev": true }, "es6-promisify": { "version": "5.0.0", "bundled": true, + "dev": true, "requires": { "es6-promise": "^4.0.3" } }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true + "bundled": true, + "dev": true }, "execa": { "version": "0.7.0", "bundled": true, + "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -3602,37 +3731,45 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "extend": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true }, "extsprintf": { "version": "1.3.0", - "bundled": true + "bundled": true, + "dev": true }, "fast-deep-equal": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "figgy-pudding": { "version": "3.5.1", - "bundled": true + "bundled": true, + "dev": true }, "find-npm-prefix": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "find-up": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "locate-path": "^2.0.0" } @@ -3640,6 +3777,7 @@ "flush-write-stream": { "version": "1.0.3", "bundled": true, + "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.4" @@ -3648,6 +3786,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3661,6 +3800,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3669,11 +3809,13 @@ }, "forever-agent": { "version": "0.6.1", - "bundled": true + "bundled": true, + "dev": true }, "form-data": { "version": "2.3.2", "bundled": true, + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -3683,6 +3825,7 @@ "from2": { "version": "2.3.0", "bundled": true, + "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -3691,6 +3834,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3704,6 +3848,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3713,6 +3858,7 @@ "fs-minipass": { "version": "1.2.5", "bundled": true, + "dev": true, "requires": { "minipass": "^2.2.1" } @@ -3720,6 +3866,7 @@ "fs-vacuum": { "version": "1.2.10", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "path-is-inside": "^1.0.1", @@ -3729,6 +3876,7 @@ "fs-write-stream-atomic": { "version": "1.0.10", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -3738,11 +3886,13 @@ "dependencies": { "iferr": { "version": "0.1.5", - "bundled": true + "bundled": true, + "dev": true }, "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3756,6 +3906,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3764,11 +3915,13 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "fstream": { "version": "1.0.11", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -3779,6 +3932,7 @@ "gauge": { "version": "2.7.4", "bundled": true, + "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -3792,11 +3946,13 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3807,11 +3963,13 @@ }, "genfun": { "version": "5.0.0", - "bundled": true + "bundled": true, + "dev": true }, "gentle-fs": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "aproba": "^1.1.2", "fs-vacuum": "^1.2.10", @@ -3825,21 +3983,25 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "iferr": { "version": "0.1.5", - "bundled": true + "bundled": true, + "dev": true } } }, "get-caller-file": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "get-stream": { "version": "4.1.0", "bundled": true, + "dev": true, "requires": { "pump": "^3.0.0" } @@ -3847,6 +4009,7 @@ "getpass": { "version": "0.1.7", "bundled": true, + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -3854,6 +4017,7 @@ "glob": { "version": "7.1.3", "bundled": true, + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3866,6 +4030,7 @@ "global-dirs": { "version": "0.1.1", "bundled": true, + "dev": true, "requires": { "ini": "^1.3.4" } @@ -3873,6 +4038,7 @@ "got": { "version": "6.7.1", "bundled": true, + "dev": true, "requires": { "create-error-class": "^3.0.0", "duplexer3": "^0.1.4", @@ -3889,21 +4055,25 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "graceful-fs": { "version": "4.1.15", - "bundled": true + "bundled": true, + "dev": true }, "har-schema": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "har-validator": { "version": "5.1.0", "bundled": true, + "dev": true, "requires": { "ajv": "^5.3.0", "har-schema": "^2.0.0" @@ -3911,23 +4081,28 @@ }, "has-flag": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "has-unicode": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "hosted-git-info": { "version": "2.7.1", - "bundled": true + "bundled": true, + "dev": true }, "http-cache-semantics": { "version": "3.8.1", - "bundled": true + "bundled": true, + "dev": true }, "http-proxy-agent": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "agent-base": "4", "debug": "3.1.0" @@ -3936,6 +4111,7 @@ "http-signature": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -3945,6 +4121,7 @@ "https-proxy-agent": { "version": "2.2.1", "bundled": true, + "dev": true, "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" @@ -3953,6 +4130,7 @@ "humanize-ms": { "version": "1.2.1", "bundled": true, + "dev": true, "requires": { "ms": "^2.0.0" } @@ -3960,32 +4138,38 @@ "iconv-lite": { "version": "0.4.23", "bundled": true, + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "iferr": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "ignore-walk": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "minimatch": "^3.0.4" } }, "import-lazy": { "version": "2.1.0", - "bundled": true + "bundled": true, + "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true + "bundled": true, + "dev": true }, "inflight": { "version": "1.0.6", "bundled": true, + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -3993,15 +4177,18 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "ini": { "version": "1.3.5", - "bundled": true + "bundled": true, + "dev": true }, "init-package-json": { "version": "1.10.3", "bundled": true, + "dev": true, "requires": { "glob": "^7.1.1", "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", @@ -4015,32 +4202,38 @@ }, "invert-kv": { "version": "1.0.0", - "bundled": true - }, + "bundled": true, + "dev": true + }, "ip": { "version": "1.1.5", - "bundled": true + "bundled": true, + "dev": true }, "ip-regex": { "version": "2.1.0", - "bundled": true + "bundled": true, + "dev": true }, "is-ci": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "ci-info": "^1.0.0" }, "dependencies": { "ci-info": { "version": "1.6.0", - "bundled": true + "bundled": true, + "dev": true } } }, "is-cidr": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "cidr-regex": "^2.0.10" } @@ -4048,6 +4241,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4055,6 +4249,7 @@ "is-installed-globally": { "version": "0.1.0", "bundled": true, + "dev": true, "requires": { "global-dirs": "^0.1.0", "is-path-inside": "^1.0.0" @@ -4062,75 +4257,92 @@ }, "is-npm": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-obj": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "is-path-inside": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "path-is-inside": "^1.0.1" } }, "is-redirect": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-retry-allowed": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "is-typedarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true + "bundled": true, + "dev": true }, "jsbn": { "version": "0.1.1", "bundled": true, + "dev": true, "optional": true }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "json-schema": { "version": "0.2.3", - "bundled": true + "bundled": true, + "dev": true }, "json-schema-traverse": { "version": "0.3.1", - "bundled": true + "bundled": true, + "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true + "bundled": true, + "dev": true }, "jsonparse": { "version": "1.3.1", - "bundled": true + "bundled": true, + "dev": true }, "jsprim": { "version": "1.4.1", "bundled": true, + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -4141,17 +4353,20 @@ "latest-version": { "version": "3.1.0", "bundled": true, + "dev": true, "requires": { "package-json": "^4.0.0" } }, "lazy-property": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "lcid": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "invert-kv": "^1.0.0" } @@ -4159,6 +4374,7 @@ "libcipm": { "version": "3.0.3", "bundled": true, + "dev": true, "requires": { "bin-links": "^1.1.2", "bluebird": "^3.5.1", @@ -4180,6 +4396,7 @@ "libnpm": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "bin-links": "^1.1.2", "bluebird": "^3.5.3", @@ -4206,6 +4423,7 @@ "libnpmaccess": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "aproba": "^2.0.0", "get-stream": "^4.0.0", @@ -4215,13 +4433,15 @@ "dependencies": { "aproba": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "libnpmconfig": { "version": "1.2.1", "bundled": true, + "dev": true, "requires": { "figgy-pudding": "^3.5.1", "find-up": "^3.0.0", @@ -4231,6 +4451,7 @@ "find-up": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -4238,6 +4459,7 @@ "locate-path": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -4246,6 +4468,7 @@ "p-limit": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -4253,19 +4476,22 @@ "p-locate": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "libnpmhook": { "version": "5.0.2", "bundled": true, + "dev": true, "requires": { "aproba": "^2.0.0", "figgy-pudding": "^3.4.1", @@ -4276,6 +4502,7 @@ "libnpmorg": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "aproba": "^2.0.0", "figgy-pudding": "^3.4.1", @@ -4285,13 +4512,15 @@ "dependencies": { "aproba": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "libnpmpublish": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "aproba": "^2.0.0", "figgy-pudding": "^3.5.1", @@ -4307,6 +4536,7 @@ "libnpmsearch": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "figgy-pudding": "^3.5.1", "get-stream": "^4.0.0", @@ -4316,6 +4546,7 @@ "libnpmteam": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "aproba": "^2.0.0", "figgy-pudding": "^3.4.1", @@ -4325,13 +4556,15 @@ "dependencies": { "aproba": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true } } }, "libnpx": { "version": "10.2.0", "bundled": true, + "dev": true, "requires": { "dotenv": "^5.0.1", "npm-package-arg": "^6.0.0", @@ -4346,6 +4579,7 @@ "locate-path": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -4354,6 +4588,7 @@ "lock-verify": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "npm-package-arg": "^6.1.0", "semver": "^5.4.1" @@ -4362,17 +4597,20 @@ "lockfile": { "version": "1.0.4", "bundled": true, + "dev": true, "requires": { "signal-exit": "^3.0.2" } }, "lodash._baseindexof": { "version": "3.1.0", - "bundled": true + "bundled": true, + "dev": true }, "lodash._baseuniq": { "version": "4.6.0", "bundled": true, + "dev": true, "requires": { "lodash._createset": "~4.0.0", "lodash._root": "~3.0.0" @@ -4380,58 +4618,71 @@ }, "lodash._bindcallback": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true }, "lodash._cacheindexof": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true }, "lodash._createcache": { "version": "3.1.2", "bundled": true, + "dev": true, "requires": { "lodash._getnative": "^3.0.0" } }, "lodash._createset": { "version": "4.0.3", - "bundled": true + "bundled": true, + "dev": true }, "lodash._getnative": { "version": "3.9.1", - "bundled": true + "bundled": true, + "dev": true }, "lodash._root": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true }, "lodash.clonedeep": { "version": "4.5.0", - "bundled": true + "bundled": true, + "dev": true }, "lodash.restparam": { "version": "3.6.1", - "bundled": true + "bundled": true, + "dev": true }, "lodash.union": { "version": "4.6.0", - "bundled": true + "bundled": true, + "dev": true }, "lodash.uniq": { "version": "4.5.0", - "bundled": true + "bundled": true, + "dev": true }, "lodash.without": { "version": "4.4.0", - "bundled": true + "bundled": true, + "dev": true }, "lowercase-keys": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "lru-cache": { "version": "4.1.5", "bundled": true, + "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -4440,6 +4691,7 @@ "make-dir": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "pify": "^3.0.0" } @@ -4447,6 +4699,7 @@ "make-fetch-happen": { "version": "4.0.1", "bundled": true, + "dev": true, "requires": { "agentkeepalive": "^3.4.1", "cacache": "^11.0.1", @@ -4463,44 +4716,52 @@ }, "meant": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "mem": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "mimic-fn": "^1.0.0" } }, "mime-db": { "version": "1.35.0", - "bundled": true + "bundled": true, + "dev": true }, "mime-types": { "version": "2.1.19", "bundled": true, + "dev": true, "requires": { "mime-db": "~1.35.0" } }, "mimic-fn": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true }, "minimatch": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true }, "minipass": { "version": "2.3.3", "bundled": true, + "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4508,13 +4769,15 @@ "dependencies": { "yallist": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true } } }, "minizlib": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "minipass": "^2.2.1" } @@ -4522,6 +4785,7 @@ "mississippi": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -4538,6 +4802,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" } @@ -4545,6 +4810,7 @@ "move-concurrently": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -4556,21 +4822,25 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true } } }, "ms": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "mute-stream": { "version": "0.0.7", - "bundled": true + "bundled": true, + "dev": true }, "node-fetch-npm": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "encoding": "^0.1.11", "json-parse-better-errors": "^1.0.0", @@ -4580,6 +4850,7 @@ "node-gyp": { "version": "3.8.0", "bundled": true, + "dev": true, "requires": { "fstream": "^1.0.0", "glob": "^7.0.3", @@ -4598,17 +4869,20 @@ "nopt": { "version": "3.0.6", "bundled": true, + "dev": true, "requires": { "abbrev": "1" } }, "semver": { "version": "5.3.0", - "bundled": true + "bundled": true, + "dev": true }, "tar": { "version": "2.2.1", "bundled": true, + "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -4620,6 +4894,7 @@ "nopt": { "version": "4.0.1", "bundled": true, + "dev": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -4628,6 +4903,7 @@ "normalize-package-data": { "version": "2.5.0", "bundled": true, + "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -4638,6 +4914,7 @@ "resolve": { "version": "1.10.0", "bundled": true, + "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -4647,6 +4924,7 @@ "npm-audit-report": { "version": "1.3.2", "bundled": true, + "dev": true, "requires": { "cli-table3": "^0.5.0", "console-control-strings": "^1.1.0" @@ -4654,15 +4932,18 @@ }, "npm-bundled": { "version": "1.0.6", - "bundled": true + "bundled": true, + "dev": true }, "npm-cache-filename": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "npm-install-checks": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" } @@ -4670,6 +4951,7 @@ "npm-lifecycle": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "byline": "^5.0.0", "graceful-fs": "^4.1.11", @@ -4683,11 +4965,13 @@ }, "npm-logical-tree": { "version": "1.2.1", - "bundled": true + "bundled": true, + "dev": true }, "npm-package-arg": { "version": "6.1.0", "bundled": true, + "dev": true, "requires": { "hosted-git-info": "^2.6.0", "osenv": "^0.1.5", @@ -4698,6 +4982,7 @@ "npm-packlist": { "version": "1.4.1", "bundled": true, + "dev": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -4706,6 +4991,7 @@ "npm-pick-manifest": { "version": "2.2.3", "bundled": true, + "dev": true, "requires": { "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", @@ -4715,6 +5001,7 @@ "npm-profile": { "version": "4.0.1", "bundled": true, + "dev": true, "requires": { "aproba": "^1.1.2 || 2", "figgy-pudding": "^3.4.1", @@ -4724,6 +5011,7 @@ "npm-registry-fetch": { "version": "3.9.0", "bundled": true, + "dev": true, "requires": { "JSONStream": "^1.3.4", "bluebird": "^3.5.1", @@ -4736,17 +5024,20 @@ "npm-run-path": { "version": "2.0.2", "bundled": true, + "dev": true, "requires": { "path-key": "^2.0.0" } }, "npm-user-validate": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "npmlog": { "version": "4.1.2", "bundled": true, + "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -4756,34 +5047,41 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "oauth-sign": { "version": "0.9.0", - "bundled": true + "bundled": true, + "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true }, "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { "wrappy": "1" } }, "opener": { "version": "1.5.1", - "bundled": true + "bundled": true, + "dev": true }, "os-homedir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "os-locale": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "execa": "^0.7.0", "lcid": "^1.0.0", @@ -4792,11 +5090,13 @@ }, "os-tmpdir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "osenv": { "version": "0.1.5", "bundled": true, + "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -4804,11 +5104,13 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "p-limit": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "p-try": "^1.0.0" } @@ -4816,17 +5118,20 @@ "p-locate": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "package-json": { "version": "4.0.1", "bundled": true, + "dev": true, "requires": { "got": "^6.7.1", "registry-auth-token": "^3.0.1", @@ -4837,6 +5142,7 @@ "pacote": { "version": "9.5.0", "bundled": true, + "dev": true, "requires": { "bluebird": "^3.5.3", "cacache": "^11.3.2", @@ -4870,6 +5176,7 @@ "lru-cache": { "version": "5.1.1", "bundled": true, + "dev": true, "requires": { "yallist": "^3.0.2" } @@ -4877,6 +5184,7 @@ "minipass": { "version": "2.3.5", "bundled": true, + "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4884,13 +5192,15 @@ }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, "parallel-transform": { "version": "1.1.0", "bundled": true, + "dev": true, "requires": { "cyclist": "~0.2.2", "inherits": "^2.0.3", @@ -4900,6 +5210,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -4913,6 +5224,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -4921,47 +5233,58 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "path-is-inside": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "path-parse": { "version": "1.0.6", - "bundled": true + "bundled": true, + "dev": true }, "performance-now": { "version": "2.1.0", - "bundled": true + "bundled": true, + "dev": true }, "pify": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "prepend-http": { "version": "1.0.4", - "bundled": true + "bundled": true, + "dev": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "promise-inflight": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "promise-retry": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "err-code": "^1.0.0", "retry": "^0.10.0" @@ -4969,43 +5292,51 @@ "dependencies": { "retry": { "version": "0.10.1", - "bundled": true + "bundled": true, + "dev": true } } }, "promzard": { "version": "0.3.0", "bundled": true, + "dev": true, "requires": { "read": "1" } }, "proto-list": { "version": "1.2.4", - "bundled": true + "bundled": true, + "dev": true }, "protoduck": { "version": "5.0.1", "bundled": true, + "dev": true, "requires": { "genfun": "^5.0.0" } }, "prr": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "pseudomap": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "psl": { "version": "1.1.29", - "bundled": true + "bundled": true, + "dev": true }, "pump": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5014,6 +5345,7 @@ "pumpify": { "version": "1.5.1", "bundled": true, + "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -5023,6 +5355,7 @@ "pump": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -5032,19 +5365,23 @@ }, "punycode": { "version": "1.4.1", - "bundled": true + "bundled": true, + "dev": true }, "qrcode-terminal": { "version": "0.12.0", - "bundled": true + "bundled": true, + "dev": true }, "qs": { "version": "6.5.2", - "bundled": true + "bundled": true, + "dev": true }, "query-string": { "version": "6.2.0", "bundled": true, + "dev": true, "requires": { "decode-uri-component": "^0.2.0", "strict-uri-encode": "^2.0.0" @@ -5052,11 +5389,13 @@ }, "qw": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "rc": { "version": "1.2.7", "bundled": true, + "dev": true, "requires": { "deep-extend": "^0.5.1", "ini": "~1.3.0", @@ -5066,13 +5405,15 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true } } }, "read": { "version": "1.0.7", "bundled": true, + "dev": true, "requires": { "mute-stream": "~0.0.4" } @@ -5080,6 +5421,7 @@ "read-cmd-shim": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2" } @@ -5087,6 +5429,7 @@ "read-installed": { "version": "4.0.3", "bundled": true, + "dev": true, "requires": { "debuglog": "^1.0.1", "graceful-fs": "^4.1.2", @@ -5100,6 +5443,7 @@ "read-package-json": { "version": "2.0.13", "bundled": true, + "dev": true, "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", @@ -5111,6 +5455,7 @@ "read-package-tree": { "version": "5.2.2", "bundled": true, + "dev": true, "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -5122,6 +5467,7 @@ "readable-stream": { "version": "3.1.1", "bundled": true, + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5131,6 +5477,7 @@ "readdir-scoped-modules": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -5141,6 +5488,7 @@ "registry-auth-token": { "version": "3.3.2", "bundled": true, + "dev": true, "requires": { "rc": "^1.1.6", "safe-buffer": "^5.0.1" @@ -5149,6 +5497,7 @@ "registry-url": { "version": "3.1.0", "bundled": true, + "dev": true, "requires": { "rc": "^1.0.1" } @@ -5156,6 +5505,7 @@ "request": { "version": "2.88.0", "bundled": true, + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -5181,23 +5531,28 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "require-main-filename": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "resolve-from": { "version": "4.0.0", - "bundled": true + "bundled": true, + "dev": true }, "retry": { "version": "0.12.0", - "bundled": true + "bundled": true, + "dev": true }, "rimraf": { "version": "2.6.3", "bundled": true, + "dev": true, "requires": { "glob": "^7.1.3" } @@ -5205,42 +5560,50 @@ "run-queue": { "version": "1.0.3", "bundled": true, + "dev": true, "requires": { "aproba": "^1.1.1" }, "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true } } }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true + "bundled": true, + "dev": true }, "semver": { "version": "5.6.0", - "bundled": true + "bundled": true, + "dev": true }, "semver-diff": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "semver": "^5.0.3" } }, "set-blocking": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "sha": { "version": "2.0.1", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.2", "readable-stream": "^2.0.2" @@ -5249,6 +5612,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5262,6 +5626,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -5271,33 +5636,40 @@ "shebang-command": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true }, "slash": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "slide": { "version": "1.1.6", - "bundled": true + "bundled": true, + "dev": true }, "smart-buffer": { "version": "4.0.1", - "bundled": true + "bundled": true, + "dev": true }, "socks": { "version": "2.2.0", "bundled": true, + "dev": true, "requires": { "ip": "^1.1.5", "smart-buffer": "^4.0.1" @@ -5306,6 +5678,7 @@ "socks-proxy-agent": { "version": "4.0.1", "bundled": true, + "dev": true, "requires": { "agent-base": "~4.2.0", "socks": "~2.2.0" @@ -5313,11 +5686,13 @@ }, "sorted-object": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "sorted-union-stream": { "version": "2.1.3", "bundled": true, + "dev": true, "requires": { "from2": "^1.3.0", "stream-iterate": "^1.1.0" @@ -5326,6 +5701,7 @@ "from2": { "version": "1.3.0", "bundled": true, + "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "~1.1.10" @@ -5333,11 +5709,13 @@ }, "isarray": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "readable-stream": { "version": "1.1.14", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -5347,13 +5725,15 @@ }, "string_decoder": { "version": "0.10.31", - "bundled": true + "bundled": true, + "dev": true } } }, "spdx-correct": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -5361,11 +5741,13 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true + "bundled": true, + "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -5373,11 +5755,13 @@ }, "spdx-license-ids": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true }, "sshpk": { "version": "1.14.2", "bundled": true, + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -5393,6 +5777,7 @@ "ssri": { "version": "6.0.1", "bundled": true, + "dev": true, "requires": { "figgy-pudding": "^3.5.1" } @@ -5400,6 +5785,7 @@ "stream-each": { "version": "1.2.2", "bundled": true, + "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -5408,6 +5794,7 @@ "stream-iterate": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "readable-stream": "^2.1.5", "stream-shift": "^1.0.0" @@ -5416,6 +5803,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5429,6 +5817,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -5437,15 +5826,18 @@ }, "stream-shift": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strict-uri-encode": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "string-width": { "version": "2.1.1", "bundled": true, + "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -5453,15 +5845,18 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-ansi": { "version": "4.0.0", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -5471,32 +5866,38 @@ "string_decoder": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, "stringify-package": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-ansi": { "version": "3.0.1", "bundled": true, + "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-eof": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "strip-json-comments": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "supports-color": { "version": "5.4.0", "bundled": true, + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -5504,6 +5905,7 @@ "tar": { "version": "4.4.8", "bundled": true, + "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -5516,11 +5918,13 @@ "dependencies": { "chownr": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, + "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5528,28 +5932,33 @@ }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, "term-size": { "version": "1.2.0", "bundled": true, + "dev": true, "requires": { "execa": "^0.7.0" } }, "text-table": { "version": "0.2.0", - "bundled": true + "bundled": true, + "dev": true }, "through": { "version": "2.3.8", - "bundled": true + "bundled": true, + "dev": true }, "through2": { "version": "2.0.3", "bundled": true, + "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -5558,6 +5967,7 @@ "readable-stream": { "version": "2.3.6", "bundled": true, + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5571,6 +5981,7 @@ "string_decoder": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -5579,15 +5990,18 @@ }, "timed-out": { "version": "4.0.1", - "bundled": true + "bundled": true, + "dev": true }, "tiny-relative-date": { "version": "1.3.0", - "bundled": true + "bundled": true, + "dev": true }, "tough-cookie": { "version": "2.4.3", "bundled": true, + "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -5596,6 +6010,7 @@ "tunnel-agent": { "version": "0.6.0", "bundled": true, + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -5603,23 +6018,28 @@ "tweetnacl": { "version": "0.14.5", "bundled": true, + "dev": true, "optional": true }, "typedarray": { "version": "0.0.6", - "bundled": true + "bundled": true, + "dev": true }, "uid-number": { "version": "0.0.6", - "bundled": true + "bundled": true, + "dev": true }, "umask": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "unique-filename": { "version": "1.1.1", "bundled": true, + "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -5627,6 +6047,7 @@ "unique-slug": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "imurmurhash": "^0.1.4" } @@ -5634,21 +6055,25 @@ "unique-string": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "crypto-random-string": "^1.0.0" } }, "unpipe": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "unzip-response": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true }, "update-notifier": { "version": "2.5.0", "bundled": true, + "dev": true, "requires": { "boxen": "^1.2.1", "chalk": "^2.0.1", @@ -5665,25 +6090,30 @@ "url-parse-lax": { "version": "1.0.0", "bundled": true, + "dev": true, "requires": { "prepend-http": "^1.0.1" } }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "util-extend": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true }, "uuid": { "version": "3.3.2", - "bundled": true + "bundled": true, + "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -5692,6 +6122,7 @@ "validate-npm-package-name": { "version": "3.0.0", "bundled": true, + "dev": true, "requires": { "builtins": "^1.0.3" } @@ -5699,6 +6130,7 @@ "verror": { "version": "1.10.0", "bundled": true, + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -5708,6 +6140,7 @@ "wcwidth": { "version": "1.0.1", "bundled": true, + "dev": true, "requires": { "defaults": "^1.0.3" } @@ -5715,17 +6148,20 @@ "which": { "version": "1.3.1", "bundled": true, + "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true }, "wide-align": { "version": "1.1.2", "bundled": true, + "dev": true, "requires": { "string-width": "^1.0.2" }, @@ -5733,6 +6169,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5744,6 +6181,7 @@ "widest-line": { "version": "2.0.0", "bundled": true, + "dev": true, "requires": { "string-width": "^2.1.1" } @@ -5751,6 +6189,7 @@ "worker-farm": { "version": "1.6.0", "bundled": true, + "dev": true, "requires": { "errno": "~0.1.7" } @@ -5758,6 +6197,7 @@ "wrap-ansi": { "version": "2.1.0", "bundled": true, + "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -5766,6 +6206,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5776,11 +6217,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "write-file-atomic": { "version": "2.4.2", "bundled": true, + "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -5789,23 +6232,28 @@ }, "xdg-basedir": { "version": "3.0.0", - "bundled": true + "bundled": true, + "dev": true }, "xtend": { "version": "4.0.1", - "bundled": true + "bundled": true, + "dev": true }, "y18n": { "version": "4.0.0", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "2.1.2", - "bundled": true + "bundled": true, + "dev": true }, "yargs": { "version": "11.0.0", "bundled": true, + "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.1.1", @@ -5823,13 +6271,15 @@ "dependencies": { "y18n": { "version": "3.2.1", - "bundled": true + "bundled": true, + "dev": true } } }, "yargs-parser": { "version": "9.0.2", "bundled": true, + "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -5910,6 +6360,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -5918,6 +6369,7 @@ "version": "4.0.11", "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "dev": true, "requires": { "format-util": "^1.0.3" } @@ -5960,7 +6412,8 @@ "p-iteration": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/p-iteration/-/p-iteration-1.1.8.tgz", - "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==" + "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==", + "dev": true }, "p-limit": { "version": "2.2.0", @@ -6033,6 +6486,7 @@ "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "dev": true, "requires": { "process": "^0.11.1", "util": "^0.10.3" @@ -6059,7 +6513,8 @@ "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=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "2.0.1", @@ -6110,7 +6565,8 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true }, "process-nextick-args": { "version": "2.0.0", @@ -6632,7 +7088,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "ssri": { "version": "6.0.1", @@ -6883,9 +7340,9 @@ "dev": true }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "union-value": { @@ -7030,6 +7487,7 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, "requires": { "inherits": "2.0.3" } @@ -7049,7 +7507,8 @@ "validator": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "dev": true }, "vm-browserify": { "version": "1.1.0", @@ -7212,7 +7671,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "xtend": { "version": "4.0.1", @@ -7266,6 +7726,7 @@ "version": "3.25.1", "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.25.1.tgz", "integrity": "sha512-7tDlwhrBG+oYFdXNOjILSurpfQyuVgkRe3hB2q8TEssamDHB7BbLWYkYO98nTn0FibfdFroFKDjndbgufAgS/Q==", + "dev": true, "requires": { "commander": "^2.7.1", "core-js": "^2.5.7", diff --git a/source/nodejs/spec-generator/package.json b/source/nodejs/spec-generator/package.json index 5fac6c84a3..50f267d164 100644 --- a/source/nodejs/spec-generator/package.json +++ b/source/nodejs/spec-generator/package.json @@ -1,6 +1,6 @@ { "name": "spec-generator", - "version": "0.5.0", + "version": "0.5.1", "description": "Generates the element/property tables for our specs based on the schema file.", "author": "AdaptiveCards", "license": "MIT", @@ -20,15 +20,13 @@ "build-all": "cd ../typed-schema && npm run build && cd ../spec-generator && npm run build", "build-all-and-run": "npm run build-all && npm run run" }, - "dependencies": { - "marked-schema": "^0.1.4", - "typed-schema": "0.5.0", - "p-iteration": "^1.1.8" - }, "devDependencies": { + "marked-schema": "^0.1.4", + "p-iteration": "^1.1.8", + "typed-schema": "^0.5.1", "rimraf": "^2.6.2", "typescript": "^3.2.2", "webpack": "^4.27.1", "webpack-cli": "^3.1.2" } -} \ No newline at end of file +} diff --git a/source/nodejs/template-engine/package-lock.json b/source/nodejs/template-engine/package-lock.json deleted file mode 100644 index a9d93e9b48..0000000000 --- a/source/nodejs/template-engine/package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "template-engine", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", - "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", - "dev": true - } - } -} diff --git a/source/nodejs/template-engine/package.json b/source/nodejs/template-engine/package.json deleted file mode 100644 index 57530e496f..0000000000 --- a/source/nodejs/template-engine/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "template-engine", - "version": "1.0.0", - "description": "", - "main": "app.js", - "scripts": { - "build": "tsc", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "devDependencies": { - "typescript": "^3.2.4" - } -} diff --git a/source/nodejs/typed-schema/package-lock.json b/source/nodejs/typed-schema/package-lock.json index d0bfef0e0b..80dfcd3292 100644 --- a/source/nodejs/typed-schema/package-lock.json +++ b/source/nodejs/typed-schema/package-lock.json @@ -1,6 +1,6 @@ { "name": "typed-schema", - "version": "0.5.0", + "version": "0.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -29,6 +29,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -36,12 +37,14 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -116,7 +119,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "cross-spawn": { "version": "6.0.5", @@ -210,7 +214,8 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "execa": { "version": "1.0.0", @@ -248,7 +253,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "function-bind": { "version": "1.1.1", @@ -275,6 +281,7 @@ "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -321,6 +328,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -329,7 +337,8 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "invert-kv": { "version": "2.0.0", @@ -395,6 +404,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -446,7 +456,8 @@ "markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true }, "mem": { "version": "4.3.0", @@ -469,6 +480,7 @@ "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.7" } @@ -604,6 +616,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -640,7 +653,8 @@ "p-iteration": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/p-iteration/-/p-iteration-1.1.8.tgz", - "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==" + "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==", + "dev": true }, "p-limit": { "version": "2.2.0", @@ -675,7 +689,8 @@ "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=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "2.0.1", @@ -750,7 +765,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "string-width": { "version": "2.1.1", @@ -793,9 +809,9 @@ } }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz", + "integrity": "sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA==", "dev": true }, "which": { @@ -872,7 +888,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "y18n": { "version": "4.0.0", diff --git a/source/nodejs/typed-schema/package.json b/source/nodejs/typed-schema/package.json index 10c9680490..9a416dd445 100644 --- a/source/nodejs/typed-schema/package.json +++ b/source/nodejs/typed-schema/package.json @@ -1,6 +1,6 @@ { "name": "typed-schema", - "version": "0.5.0", + "version": "0.5.1", "description": "Generates the element/property tables for our specs based on the schema file.", "author": "AdaptiveCards", "license": "MIT", @@ -21,14 +21,12 @@ "generate-schema": "node ./lib/command-line.js ./schema/src Class,Enum Class classType > ./schema/lib/Type.json", "generate-adaptive-schema": "node ./lib/command-line.js ../../../schemas/src AdaptiveCard > ../../../schemas/adaptive-card.json" }, - "dependencies": { + "devDependencies": { "glob": "^7.1.4", "js-yaml": "^3.13.1", "markdown-table": "^1.1.3", - "p-iteration": "^1.1.8" - }, - "devDependencies": { "mocha": "^6.1.4", + "p-iteration": "^1.1.8", "rimraf": "^2.6.2", "typescript": "^3.2.2" }