Selaa lähdekoodia

Further changes for AOT compatibility. Adding metadata rectivity

Richard Knight 6 vuotta sitten
vanhempi
commit
54f114b336
23 muutettua tiedostoa jossa 318 lisäystä ja 411 poistoa
  1. 133 341
      package-lock.json
  2. 16 16
      package.json
  3. 16 5
      src/app/dynaform/components/_abstract/group-input.component.ts
  4. 20 5
      src/app/dynaform/components/_abstract/native-input.component.ts
  5. 3 1
      src/app/dynaform/components/custom/checkbutton/checkbutton.component.ts
  6. 3 2
      src/app/dynaform/components/custom/dropdown-modified-input/dropdown-modified-input.component.ts
  7. 4 2
      src/app/dynaform/components/custom/multiline/multiline.component.ts
  8. 7 5
      src/app/dynaform/components/group/checkbutton-group/checkbutton-group.component.ts
  9. 2 0
      src/app/dynaform/components/kendo/datepicker/datepicker.component.ts
  10. 2 0
      src/app/dynaform/components/kendo/timepicker/timepicker.component.ts
  11. 2 0
      src/app/dynaform/components/native/hidden/hidden.component.ts
  12. 2 0
      src/app/dynaform/components/native/password/password.component.ts
  13. 2 0
      src/app/dynaform/components/native/radio/radio.component.ts
  14. 3 1
      src/app/dynaform/components/native/select/select.component.ts
  15. 3 1
      src/app/dynaform/components/native/text/text.component.ts
  16. 2 0
      src/app/dynaform/components/native/textarea/textarea.component.ts
  17. 5 3
      src/app/dynaform/components/nocontrol/button-group/button-group.component.ts
  18. 5 3
      src/app/dynaform/components/nocontrol/display/display.component.ts
  19. 5 3
      src/app/dynaform/components/nocontrol/heading/heading.component.ts
  20. 54 14
      src/app/dynaform/directives/dynafield.directive.ts
  21. 14 7
      src/app/dynaform/dynaform.component.ts
  22. 2 2
      src/app/dynaform/models/field.model.ts
  23. 13 0
      src/app/dynaform/services/dynaform.service.ts

+ 133 - 341
package-lock.json

@@ -5,12 +5,12 @@
   "requires": true,
   "dependencies": {
     "@angular-devkit/architect": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.0.tgz",
-      "integrity": "sha512-oDBrWlfKh/0t2ag4T8gz9xzPMItxfctinlsHxhw7dPQ+etq1mIcWgQkiKiDrz4l46YiGipBRlC55j+6f37omAA==",
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.1.tgz",
+      "integrity": "sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.3.0",
+        "@angular-devkit/core": "7.3.1",
         "rxjs": "6.3.3"
       },
       "dependencies": {
@@ -26,16 +26,16 @@
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.13.0.tgz",
-      "integrity": "sha512-JjoSXbmwOsuDJxngyChr6aOSZ2qsrvSL1MHwqgXhZswmC/KghBF0aZ7y8Wzr27zDCQ174Axts7+IAk6b+aWIqw==",
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.13.1.tgz",
+      "integrity": "sha512-vkKwMVQ+NNCcVR3HFMffS+Mq4b2afXeUjI+02N38hBuFTppnC83uivUB6Uu2NUk5NTSQA4BnJlG5CbMs6N4QYg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.13.0",
-        "@angular-devkit/build-optimizer": "0.13.0",
-        "@angular-devkit/build-webpack": "0.13.0",
-        "@angular-devkit/core": "7.3.0",
-        "@ngtools/webpack": "7.3.0",
+        "@angular-devkit/architect": "0.13.1",
+        "@angular-devkit/build-optimizer": "0.13.1",
+        "@angular-devkit/build-webpack": "0.13.1",
+        "@angular-devkit/core": "7.3.1",
+        "@ngtools/webpack": "7.3.1",
         "ajv": "6.7.0",
         "autoprefixer": "9.4.6",
         "circular-dependency-plugin": "5.0.2",
@@ -43,7 +43,6 @@
         "copy-webpack-plugin": "4.6.0",
         "file-loader": "3.0.1",
         "glob": "7.1.3",
-        "istanbul": "0.4.5",
         "istanbul-instrumenter-loader": "3.0.1",
         "karma-source-map-support": "1.3.0",
         "less": "3.9.0",
@@ -69,7 +68,7 @@
         "style-loader": "0.23.1",
         "stylus": "0.54.5",
         "stylus-loader": "3.0.2",
-        "terser-webpack-plugin": "1.2.1",
+        "terser-webpack-plugin": "1.2.2",
         "tree-kill": "1.2.1",
         "webpack": "4.29.0",
         "webpack-dev-middleware": "3.5.1",
@@ -139,9 +138,9 @@
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.13.0.tgz",
-      "integrity": "sha512-fhWuzbMVV/UNYE7rHSKutrWTCZle34N5cdtFz6qhK1k/wn7Vmtg9cFOwzx0SPdIlOEn576NB4DS/4UG3B5WCUQ==",
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.13.1.tgz",
+      "integrity": "sha512-LmvHiI3H451aVWY5Ac6Fqz0i1eX/mUfWN+uJvo8NaL6Jc0HKYX2o3l4ODr8UUECWWctUC9AMD522ZMwAvnvsKQ==",
       "dev": true,
       "requires": {
         "loader-utils": "1.2.3",
@@ -155,23 +154,17 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
           "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
           "dev": true
-        },
-        "typescript": {
-          "version": "3.2.4",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz",
-          "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==",
-          "dev": true
         }
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.13.0.tgz",
-      "integrity": "sha512-idtFoSbQ3Y3WqXlDlU7oTPV9TIU1kjLqce0nK1Kst+t40GTc+Q4iUJJ7KsKE3nV6TPyrL1N/IvIF7+hSJnYm8A==",
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.13.1.tgz",
+      "integrity": "sha512-OGwC7bAl3u+w7Glw+OqIrN7OD1BkDXgrWbeQSpKAmsx6VdNPCnI4NPS+JldWNp70LVlE2nQlJUhtEqMVfBMnlg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.13.0",
-        "@angular-devkit/core": "7.3.0",
+        "@angular-devkit/architect": "0.13.1",
+        "@angular-devkit/core": "7.3.1",
         "rxjs": "6.3.3"
       },
       "dependencies": {
@@ -187,9 +180,9 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz",
-      "integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.1.tgz",
+      "integrity": "sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ==",
       "dev": true,
       "requires": {
         "ajv": "6.7.0",
@@ -229,12 +222,12 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.0.tgz",
-      "integrity": "sha512-glOduymftH0LmJhITWgWUJK8QCDUltgTZ943/OyArIvLXTLL/8zCb+G6xL+3k33EQjwJicgQ3WIjonJmeTK/Ww==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.1.tgz",
+      "integrity": "sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.3.0",
+        "@angular-devkit/core": "7.3.1",
         "rxjs": "6.3.3"
       },
       "dependencies": {
@@ -250,24 +243,24 @@
       }
     },
     "@angular/animations": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.3.tgz",
-      "integrity": "sha512-5WoiDnVS2OhGgJ1oepFNF2UcfR4sJj97KRnTmLWQ0S4N4WpXX83CoOQVXvXwfotyb8uNtl4zRi2NuvN/MIuFuA==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.4.tgz",
+      "integrity": "sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/cli": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.0.tgz",
-      "integrity": "sha512-6+NoHsW1MYG7GBHUg71zaWIFeIRps/SVksCmRFCpW0RXqErCQmzf0GZuDTZZ2Yo4RzU01150sVp1R8wEvEZfZQ==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.1.tgz",
+      "integrity": "sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.13.0",
-        "@angular-devkit/core": "7.3.0",
-        "@angular-devkit/schematics": "7.3.0",
-        "@schematics/angular": "7.3.0",
-        "@schematics/update": "0.13.0",
+        "@angular-devkit/architect": "0.13.1",
+        "@angular-devkit/core": "7.3.1",
+        "@angular-devkit/schematics": "7.3.1",
+        "@schematics/angular": "7.3.1",
+        "@schematics/update": "0.13.1",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
         "inquirer": "6.2.1",
@@ -287,25 +280,25 @@
       }
     },
     "@angular/common": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.3.tgz",
-      "integrity": "sha512-VZOTZdvkitaKEhkxL6daHxPcKqAFwNJm0U4NFB4LRP9KspsFTE60QFVB63o129PTIH9iOQ2D3HRKSRl4o78ZKg==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.4.tgz",
+      "integrity": "sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/compiler": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.3.tgz",
-      "integrity": "sha512-UM6n4MyZkR5+VVjlwhLH8IfqdWBkdFcF5at4ckJXOJ/gkIUq97irbis9pGj1b0TO7MAl8uhF4b68xe5lk8b49g==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.4.tgz",
+      "integrity": "sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/compiler-cli": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.3.tgz",
-      "integrity": "sha512-31hcfTrU2GW66cvvaS629dNVPfiUrUWPncI28optvmKHBaH0mFqkdYNgabuslsXZV5AeidKMUJvR7GITjtvkQA==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz",
+      "integrity": "sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -628,55 +621,55 @@
       }
     },
     "@angular/core": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.3.tgz",
-      "integrity": "sha512-6Ql+sJJnrsxh8O0/IgIP1GgT4eLOHk+dlBs7zBbjstmLuhaQdY+awO9WKoQow+TiD1Go7FW1J3vZ2PTWXKxqjQ==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.4.tgz",
+      "integrity": "sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/forms": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.3.tgz",
-      "integrity": "sha512-mZpyonfSmRwSvM6efvwFwkLJkK6wHQrm7X4OhVVu3s9i7BI253eLDY7WIRXFvoxJ/5jWIIarVnd/9UA7GINZGw==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.4.tgz",
+      "integrity": "sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/http": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.3.tgz",
-      "integrity": "sha512-wzvBKbO/TcSR3U8AQbsGftH8x1OdAgVGHlfXQPmZL1KjIDHrM1VpnkSvgqIt8coG+4OPfWcNklUCrTdEGwqMqw==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.4.tgz",
+      "integrity": "sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/language-service": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.2.3.tgz",
-      "integrity": "sha512-9FBVYbKaNx4Ap+Suz/2ZFBPca1voinZMOCN8LjXRYnfS2MHLQASQlTlK4qeZcomyRfy0FxWmO9R02S7YJ06cnw==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.2.4.tgz",
+      "integrity": "sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw==",
       "dev": true
     },
     "@angular/platform-browser": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.3.tgz",
-      "integrity": "sha512-DH0Y2lgEgcrP1I/DUQB/krL7Ob7yL685fu4sRapW17SndTQa2pqSFMBVf+mN3FupTXp7nJHSvlIktzedIk04+g==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.4.tgz",
+      "integrity": "sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.3.tgz",
-      "integrity": "sha512-M8Kiz5FUhnFybJuk/mgOhBjVbRgKDC4bGWKWH9Z9SXBR2dS/FL3QOJsLIthQcWlHOzSoJdEoPBRhn0R4pyLBSw==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz",
+      "integrity": "sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/router": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.3.tgz",
-      "integrity": "sha512-SH7H2I9WTj1puei4m4g5n0/Cp28HS14q4r8lOgW0gLWuT6Ls7MqH/nDjOMiW924iRR6zjQQs7G+WbhL1jmZc2A==",
+      "version": "7.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.4.tgz",
+      "integrity": "sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -819,20 +812,20 @@
       }
     },
     "@ng-bootstrap/ng-bootstrap": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.0.2.tgz",
-      "integrity": "sha512-SBsN8ORvj/WXpZGSyR2+CRkg6GCtax5+fsLKt9ImHKUVWwePVqRxiGlnxXqwNPHQ46vOdd7nDN9cwE7dfbGaAQ==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.0.3.tgz",
+      "integrity": "sha512-6lTwR9iaNvZLtMDnk9gerV96K8Nk8i2Gu2FeHw/aUK8VPsl6LakXBAn9eBwcWCtpPLQ7m6Amnsa57RufP4ZzSg==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@ngtools/webpack": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.3.0.tgz",
-      "integrity": "sha512-U/By0Jlwy7nYwrGNtFirTg1aAsEHBL/9DhfFxPI0iu27FWiMttROuN6hmKbbnOmpbiYAVl5qTy3WXPXUIJjG1A==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.3.1.tgz",
+      "integrity": "sha512-EGQRjgDf5XP+Fm1MdZNRFiPd9e1vhl11BhjkwqkAsewic4eoz6fqXfj/Osz1hQy8xU+2dPPf/byQ/+nY3E02Zg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.3.0",
+        "@angular-devkit/core": "7.3.1",
         "enhanced-resolve": "4.1.0",
         "rxjs": "6.3.3",
         "tree-kill": "1.2.1",
@@ -920,32 +913,24 @@
       "integrity": "sha512-whHKx5m5sJYji+cy5ENqhf8EGWfZfYr1RuI5uJ9XWpp1Dd7BA9DuuKQcI1AyQOwg2MxqQv8AKElqvRa2jF4HzA=="
     },
     "@schematics/angular": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.0.tgz",
-      "integrity": "sha512-fOjP/3Rz+Nqrgc+YVaiN88uhPX0FZgUjmMKgMp06lc3xmoc1ScGxoz8AF1fV50Zkvh0Etykzy1LTUczzEUJQqw==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.1.tgz",
+      "integrity": "sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.3.0",
-        "@angular-devkit/schematics": "7.3.0",
-        "typescript": "3.2.2"
-      },
-      "dependencies": {
-        "typescript": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
-          "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==",
-          "dev": true
-        }
+        "@angular-devkit/core": "7.3.1",
+        "@angular-devkit/schematics": "7.3.1",
+        "typescript": "3.2.4"
       }
     },
     "@schematics/update": {
-      "version": "0.13.0",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.0.tgz",
-      "integrity": "sha512-HGpZdIL/0w46UyaxpnIAg6SBwzKfaRixHIEihmgJUqA0DG8GZUixRPr1L0YIWC1EZ81cQ+yWL85XhkKBYR+wQg==",
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.1.tgz",
+      "integrity": "sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "7.3.0",
-        "@angular-devkit/schematics": "7.3.0",
+        "@angular-devkit/core": "7.3.1",
+        "@angular-devkit/schematics": "7.3.1",
         "@yarnpkg/lockfile": "1.1.0",
         "ini": "1.3.5",
         "pacote": "9.4.0",
@@ -998,9 +983,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "10.12.21",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz",
-      "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==",
+      "version": "11.9.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-11.9.3.tgz",
+      "integrity": "sha512-DMiqG51GwES/c4ScBY0u5bDlH44+oY8AeYHjY1SGCWidD7h08o1dfHue/TGK7REmif2KiJzaUskO+Q0eaeZ2fQ==",
       "dev": true
     },
     "@types/q": {
@@ -1241,10 +1226,11 @@
       }
     },
     "abbrev": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
-      "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
-      "dev": true
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true,
+      "optional": true
     },
     "accepts": {
       "version": "1.3.5",
@@ -1257,9 +1243,9 @@
       }
     },
     "acorn": {
-      "version": "6.0.7",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.7.tgz",
-      "integrity": "sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.0.tgz",
+      "integrity": "sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==",
       "dev": true
     },
     "acorn-dynamic-import": {
@@ -1317,9 +1303,9 @@
       "dev": true
     },
     "ajv-keywords": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.3.0.tgz",
-      "integrity": "sha512-CMzN9S62ZOO4sA/mJZIO4S++ZM7KFWzH3PPWkveLhy4OZ9i1/VatgwWMD46w/XbGCBy7Ye0gCk+Za6mmyfKK7g==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz",
+      "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==",
       "dev": true
     },
     "amdefine": {
@@ -2247,9 +2233,9 @@
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30000935",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz",
-      "integrity": "sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==",
+      "version": "1.0.30000936",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000936.tgz",
+      "integrity": "sha512-orX4IdpbFhdNO7bTBhSbahp1EBpqzBc+qrvTRVUFfZgA4zta7TdM6PN5ZxkEUgDnz36m+PfWGcdX7AVfFWItJw==",
       "dev": true
     },
     "canonical-path": {
@@ -2717,9 +2703,9 @@
       }
     },
     "core-js": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz",
-      "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ=="
+      "version": "2.6.4",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz",
+      "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A=="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -2920,12 +2906,6 @@
       "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
       "dev": true
     },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
     "default-gateway": {
       "version": "2.7.2",
       "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
@@ -3369,37 +3349,6 @@
       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true
     },
-    "escodegen": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
-      "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
-      "dev": true,
-      "requires": {
-        "esprima": "^2.7.1",
-        "estraverse": "^1.9.1",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.2.0"
-      },
-      "dependencies": {
-        "esprima": {
-          "version": "2.7.3",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
-          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.2.0",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
-          "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
     "eslint-scope": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
@@ -3408,14 +3357,6 @@
       "requires": {
         "esrecurse": "^4.1.0",
         "estraverse": "^4.1.1"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
       }
     },
     "esprima": {
@@ -3431,20 +3372,12 @@
       "dev": true,
       "requires": {
         "estraverse": "^4.1.0"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-          "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-          "dev": true
-        }
       }
     },
     "estraverse": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
-      "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
       "dev": true
     },
     "esutils": {
@@ -3840,12 +3773,6 @@
       "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
       "dev": true
     },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
     "fastparse": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
@@ -3967,26 +3894,13 @@
       "dev": true
     },
     "flush-write-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz",
-      "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==",
+      "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": "^3.1.1"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
-          "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
-          "dev": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
+        "readable-stream": "^2.3.6"
       }
     },
     "follow-redirects": {
@@ -5491,15 +5405,6 @@
       "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
       "dev": true
     },
-    "is-builtin-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
-      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
-      "dev": true,
-      "requires": {
-        "builtin-modules": "^1.0.0"
-      }
-    },
     "is-data-descriptor": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -5734,76 +5639,6 @@
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
       "dev": true
     },
-    "istanbul": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
-      "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
-      "dev": true,
-      "requires": {
-        "abbrev": "1.0.x",
-        "async": "1.x",
-        "escodegen": "1.8.x",
-        "esprima": "2.7.x",
-        "glob": "^5.0.15",
-        "handlebars": "^4.0.1",
-        "js-yaml": "3.x",
-        "mkdirp": "0.5.x",
-        "nopt": "3.x",
-        "once": "1.x",
-        "resolve": "1.1.x",
-        "supports-color": "^3.1.0",
-        "which": "^1.1.1",
-        "wordwrap": "^1.0.0"
-      },
-      "dependencies": {
-        "async": {
-          "version": "1.5.2",
-          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-          "dev": true
-        },
-        "esprima": {
-          "version": "2.7.3",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
-          "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
-          "dev": true
-        },
-        "glob": {
-          "version": "5.0.15",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
-          "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
-          "dev": true,
-          "requires": {
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "2 || 3",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
-          "dev": true
-        },
-        "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
-          "dev": true,
-          "requires": {
-            "has-flag": "^1.0.0"
-          }
-        },
-        "wordwrap": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-          "dev": true
-        }
-      }
-    },
     "istanbul-api": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.0.6.tgz",
@@ -6320,16 +6155,6 @@
         "pify": "^3.0.0"
       }
     },
-    "levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      }
-    },
     "license-webpack-plugin": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.0.tgz",
@@ -7203,18 +7028,19 @@
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
       "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
       "dev": true,
+      "optional": true,
       "requires": {
         "abbrev": "1"
       }
     },
     "normalize-package-data": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.2.tgz",
-      "integrity": "sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
       "dev": true,
       "requires": {
         "hosted-git-info": "^2.1.4",
-        "is-builtin-module": "^1.0.0",
+        "resolve": "^1.10.0",
         "semver": "2 || 3 || 4 || 5",
         "validate-npm-package-license": "^3.0.1"
       }
@@ -7253,9 +7079,9 @@
       }
     },
     "npm-packlist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz",
-      "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.3.0.tgz",
+      "integrity": "sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA==",
       "dev": true,
       "requires": {
         "ignore-walk": "^3.0.1",
@@ -7481,28 +7307,6 @@
         }
       }
     },
-    "optionator": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
-      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
-      "dev": true,
-      "requires": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.4",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "wordwrap": "~1.0.0"
-      },
-      "dependencies": {
-        "wordwrap": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
-          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
-          "dev": true
-        }
-      }
-    },
     "original": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
@@ -8057,12 +7861,6 @@
       "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
       "dev": true
     },
-    "prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
-      "dev": true
-    },
     "preserve": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
@@ -8704,10 +8502,13 @@
       "dev": true
     },
     "resolve": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-      "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-      "dev": true
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
+      "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+      "dev": true,
+      "requires": {
+        "path-parse": "^1.0.6"
+      }
     },
     "resolve-cwd": {
       "version": "2.0.0",
@@ -9941,9 +9742,9 @@
       }
     },
     "terser-webpack-plugin": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz",
-      "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz",
+      "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==",
       "dev": true,
       "requires": {
         "cacache": "^11.0.2",
@@ -9951,7 +9752,7 @@
         "schema-utils": "^1.0.0",
         "serialize-javascript": "^1.4.0",
         "source-map": "^0.6.1",
-        "terser": "^3.8.1",
+        "terser": "^3.16.1",
         "webpack-sources": "^1.1.0",
         "worker-farm": "^1.5.2"
       },
@@ -10341,15 +10142,6 @@
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       "dev": true
     },
-    "type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "~1.1.2"
-      }
-    },
     "type-is": {
       "version": "1.6.16",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",

+ 16 - 16
package.json

@@ -12,22 +12,22 @@
 	},
 	"private": true,
 	"dependencies": {
-		"@angular/animations": "^7.2.3",
-		"@angular/common": "^7.2.3",
-		"@angular/compiler": "^7.2.3",
-		"@angular/core": "^7.2.3",
-		"@angular/forms": "^7.2.3",
-		"@angular/http": "^7.2.3",
-		"@angular/platform-browser": "^7.2.3",
-		"@angular/platform-browser-dynamic": "^7.2.3",
-		"@angular/router": "^7.2.3",
-		"@ng-bootstrap/ng-bootstrap": "^4.0.2",
+		"@angular/animations": "^7.2.4",
+		"@angular/common": "^7.2.4",
+		"@angular/compiler": "^7.2.4",
+		"@angular/core": "^7.2.4",
+		"@angular/forms": "^7.2.4",
+		"@angular/http": "^7.2.4",
+		"@angular/platform-browser": "^7.2.4",
+		"@angular/platform-browser-dynamic": "^7.2.4",
+		"@angular/router": "^7.2.4",
+		"@ng-bootstrap/ng-bootstrap": "^4.0.3",
 		"@progress/kendo-angular-dateinputs": "^3.5.4",
 		"@progress/kendo-angular-intl": "^1.6.1",
 		"@progress/kendo-angular-l10n": "^1.3.0",
 		"@progress/kendo-theme-bootstrap": "^3.2.0",
 		"angular-super-validator": "^2.0.0",
-		"core-js": "^2.6.3",
+		"core-js": "^2.6.4",
 		"json-formatter-js": "^2.2.1",
 		"lodash": "^4.17.11",
 		"rxjs": "^6.4.0",
@@ -35,14 +35,14 @@
 		"zone.js": "^0.8.29"
 	},
 	"devDependencies": {
-		"@angular-devkit/build-angular": "~0.13.0",
-		"@angular/cli": "~7.3.0",
-		"@angular/compiler-cli": "^7.2.3",
-		"@angular/language-service": "^7.2.3",
+		"@angular-devkit/build-angular": "~0.13.1",
+		"@angular/cli": "~7.3.1",
+		"@angular/compiler-cli": "^7.2.4",
+		"@angular/language-service": "^7.2.4",
 		"@types/jasmine": "~3.3.8",
 		"@types/jasminewd2": "~2.0.6",
 		"@types/lodash": "^4.14.120",
-		"@types/node": "~10.12.21",
+		"@types/node": "~11.9.3",
 		"codelyzer": "^4.5.0",
 		"jasmine-core": "~3.3.0",
 		"jasmine-spec-reporter": "~4.2.1",

+ 16 - 5
src/app/dynaform/components/_abstract/group-input.component.ts

@@ -7,22 +7,33 @@ export abstract class GroupInputComponent implements OnInit {
 	control: FormGroup | FormArray;
 
 	@Input()
-	meta;
+	set meta(meta: StringMap<any>) {
+		this._meta = meta;
+		this.exposeForTemplate();
+	};
 
 	formGroup: FormGroup;
 	childMetaArray: Array<StringMap<any>>;
 	controlNames: Array<string>;
 
+	readonly componentName: string;
 	exposeMetaInTemplate: string[] = [];
+	_meta: StringMap<any>
 
 	ngOnInit() {
-		// Move meta variables up a level, for direct access in templates
-		this.exposeMetaInTemplate.map(p => this[p] = this.meta[p] !== undefined ? this.meta[p] : this[p]);
-
 		// Get the FormGroup, and information about the controls inside it
 		this.formGroup = this.control as FormGroup;
-		this.childMetaArray = Object.values(this.meta.meta); // Metadata array of all controls in group
+		this.childMetaArray = Object.values(this._meta.meta); // Metadata array of all controls in group
 		this.controlNames = Object.keys(this.formGroup.controls);
 	}
 
+	exposeForTemplate() {
+		// Move meta variables up a level, for direct access in templates
+		this.exposeMetaInTemplate.map(p => this[p] = this._meta[p] !== undefined ? this._meta[p] : this[p]);
+	}
+
+	getName(): string {
+		return this.componentName;
+	}
+
 }

+ 20 - 5
src/app/dynaform/components/_abstract/native-input.component.ts

@@ -1,26 +1,41 @@
-import { Input, Output, EventEmitter, OnInit } from '@angular/core';
+import { Input, Output, EventEmitter } from '@angular/core';
 import { FormControl } from '@angular/forms';
 
-export abstract class NativeInputComponent implements OnInit {
+export abstract class NativeInputComponent {
 
 	@Input()
 	control: FormControl;
 
 	@Input()
-	meta;
+	set meta(meta: StringMap<any>) {
+		this._meta = meta;
+		this.exposeForTemplate();
+	};
 
 	@Output()
 	call: EventEmitter<string> = new EventEmitter<string>();
 
+	readonly componentName: string;
 	exposeMetaInTemplate: string[] = [];
+	_meta: StringMap<any>;
 
-	ngOnInit() {
+	exposeForTemplate() {
 		// Move meta variables up a level, for direct access in templates
-		this.exposeMetaInTemplate.map(p => this[p] = this.meta[p] !== undefined ? this.meta[p] : this[p]);
+		this.exposeMetaInTemplate.map(p => this[p] = this._meta[p] !== undefined ? this._meta[p] : this[p]);
 	}
 
 	handle(fnId: string, val: any): void {
 		this.call.emit(fnId);
 	}
 
+	handleChange(): void {
+		if (this._meta.change) {
+			this.handle(this._meta.change, this.control.value);
+		}
+	}
+
+	getName(): string {
+		return this.componentName;
+	}
+
 }

+ 3 - 1
src/app/dynaform/components/custom/checkbutton/checkbutton.component.ts

@@ -26,12 +26,14 @@ export class CheckbuttonComponent extends CustomInputComponent implements OnChan
 	checkedValue: string | number | boolean = true;
 	onChange: (val) => void;
 
+	readonly componentName = 'CheckbuttonComponent'; // For AOT compatibility, as class names don't survice minification
+
 	constructor(private _cdr: ChangeDetectorRef) {
 		super();
 	}
 
 	ngOnChanges() {
-		this.disabled = this.meta.disabled;
+		this.disabled = this._meta.disabled;
 	}
 
 	toggleChecked(e?: MouseEvent): void {

+ 3 - 2
src/app/dynaform/components/custom/dropdown-modified-input/dropdown-modified-input.component.ts

@@ -27,11 +27,12 @@ export class DropdownModifiedInputComponent extends CustomInputComponent impleme
 	extraClass;
 	selectedModifier: string;
 	displayedValue: string;
-	
+
 	private _controlValue: string;
 
+	readonly componentName = 'DropdownModifiedInputComponent'; // For AOT compatibility, as class names don't survice minification
+
 	ngOnInit() {
-		super.ngOnInit();
 		this.controlValue = this.control.value;
 	}
 

+ 4 - 2
src/app/dynaform/components/custom/multiline/multiline.component.ts

@@ -17,14 +17,16 @@ import { CustomInputComponent } from './../../_abstract/custom-input.component';
 export class MultilineComponent extends CustomInputComponent {
 
 	exposeMetaInTemplate: string[] = ['maxLineLength'];
-	
+
 	linesArr: string[];
 	value: string;
 	maxLineLength: number;
 
+	readonly componentName = 'MultilineComponent'; // For AOT compatibility, as class names don't survice minification
+
 	writeValue(value: any): void {
 		this.value = value;
-		this.splitIntoLines(value, this.meta.lines || 5);
+		this.splitIntoLines(value, this._meta.lines || 5);
 	}
 
 	trackByFn(index: any, item: any) {

+ 7 - 5
src/app/dynaform/components/group/checkbutton-group/checkbutton-group.component.ts

@@ -11,6 +11,8 @@ export class CheckbuttonGroupComponent extends GroupInputComponent implements On
 
 	firstControl: FormControl;
 
+	readonly componentName = 'CheckbuttonGroupComponent'; // For AOT compatibility, as class names don't survice minification
+
 	constructor(
 		@Attribute('firstEnablesRest') private firstEnablesRest,
 		@Attribute('allOrNone') public showAllOrNone
@@ -22,11 +24,11 @@ export class CheckbuttonGroupComponent extends GroupInputComponent implements On
 
 	ngOnInit() {
 		super.ngOnInit();
-		if (this.meta.firstEnablesRest) {
-			this.firstEnablesRest = this.meta.firstEnablesRest;
+		if (this._meta.firstEnablesRest) {
+			this.firstEnablesRest = this._meta.firstEnablesRest;
 		}
-		if (this.meta.showAllOrNone) {
-			this.showAllOrNone = this.meta.showAllOrNone;
+		if (this._meta.showAllOrNone) {
+			this.showAllOrNone = this._meta.showAllOrNone;
 		}
 		if (this.firstEnablesRest) {
 			this.firstControl = this.formGroup.controls[this.controlNames[0]] as FormControl;
@@ -48,7 +50,7 @@ export class CheckbuttonGroupComponent extends GroupInputComponent implements On
 	}
 
 	selectAll(e: MouseEvent): false {
-		this.controlNames.forEach(c => this.formGroup.get(c).setValue(this.meta.meta[c].value));
+		this.controlNames.forEach(c => this.formGroup.get(c).setValue(this._meta.meta[c].value));
 		(e.target as HTMLLinkElement).blur();
 		return false;
 	}

+ 2 - 0
src/app/dynaform/components/kendo/datepicker/datepicker.component.ts

@@ -12,4 +12,6 @@ export class DatepickerComponent extends NativeInputComponent {
 
 	placeholder: string;
 
+	readonly componentName = 'DatepickerComponent'; // For AOT compatibility, as class names don't survice minification
+
 }

+ 2 - 0
src/app/dynaform/components/kendo/timepicker/timepicker.component.ts

@@ -14,4 +14,6 @@ export class TimepickerComponent extends NativeInputComponent {
 	steps: number;
 	placeholder: string;
 
+	readonly componentName = 'TimepickerComponent'; // For AOT compatibility, as class names don't survice minification
+
 }

+ 2 - 0
src/app/dynaform/components/native/hidden/hidden.component.ts

@@ -8,4 +8,6 @@ import { NativeInputComponent } from '../../_abstract/native-input.component';
 })
 export class HiddenComponent extends NativeInputComponent {
 
+	readonly componentName = 'HiddenComponent'; // For AOT compatibility, as class names don't survice minification
+
 }

+ 2 - 0
src/app/dynaform/components/native/password/password.component.ts

@@ -12,4 +12,6 @@ export class PasswordComponent extends NativeInputComponent {
 
 	placeholder: string;
 
+	readonly componentName = 'PasswordComponent'; // For AOT compatibility, as class names don't survice minification
+
 }

+ 2 - 0
src/app/dynaform/components/native/radio/radio.component.ts

@@ -17,6 +17,8 @@ export class RadioComponent extends NativeInputComponent {
 	
 	prefix: string;
 
+	readonly componentName = 'RadioComponent'; // For AOT compatibility, as class names don't survice minification
+
 	constructor() {
 		super();
 		this.prefix = 'radio_u_' + Math.floor((Math.random() * 10000)).toString();

+ 3 - 1
src/app/dynaform/components/native/select/select.component.ts

@@ -15,12 +15,14 @@ export class SelectComponent extends NativeInputComponent {
 	options: IOption[];
 	link: ILink;
 	
+	readonly componentName = 'SelectComponent'; // For AOT compatibility, as class names don't survice minification
+
 	constructor(private router: Router, private route: ActivatedRoute) {
 		super();
 	}
 	
 	navigate(field: HTMLSelectElement) {
-		const base = Array.isArray(this.meta.link.route) ? this.meta.link.route : [this.meta.link.route];
+		const base = Array.isArray(this._meta.link.route) ? this._meta.link.route : [this._meta.link.route];
 		const destination = [...base, field.options[field.selectedIndex].value];
 		this.router.navigate(destination, { relativeTo: this.route });
 	}

+ 3 - 1
src/app/dynaform/components/native/text/text.component.ts

@@ -13,5 +13,7 @@ export class TextComponent extends NativeInputComponent {
 
 	placeholder: string;
 	link: ILink;
-	
+
+	readonly componentName = 'TextComponent'; // For AOT compatibility, as class names don't survice minification
+
 }

+ 2 - 0
src/app/dynaform/components/native/textarea/textarea.component.ts

@@ -12,4 +12,6 @@ export class TextareaComponent extends NativeInputComponent {
 
 	placeholder: string;
 
+	readonly componentName = 'TextareaComponent'; // For AOT compatibility, as class names don't survice minification
+	
 }

+ 5 - 3
src/app/dynaform/components/nocontrol/button-group/button-group.component.ts

@@ -1,11 +1,11 @@
-import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
+import { Component, Input, Output, EventEmitter, OnChanges } from '@angular/core';
 
 @Component({
 	selector: 'app-button-group',
 	templateUrl: './button-group.component.html',
 	styleUrls: ['./button-group.component.scss']
 })
-export class ButtonGroupComponent implements OnInit {
+export class ButtonGroupComponent implements OnChanges {
 
 	@Input()
 	meta: StringMap<any>;
@@ -15,7 +15,9 @@ export class ButtonGroupComponent implements OnInit {
 
 	buttons: StringMap<any>[];
 
-	ngOnInit() {
+	readonly componentName = 'ButtonGroupComponent'; // For AOT compatibility, as class names don't survice minification
+
+	ngOnChanges() {
 		this.buttons = this.meta.meta;
 	}
 

+ 5 - 3
src/app/dynaform/components/nocontrol/display/display.component.ts

@@ -1,4 +1,4 @@
-import { Component, Input, OnInit } from '@angular/core';
+import { Component, Input, OnChanges } from '@angular/core';
 import { ILink } from '../../../models/field.model';
 
 @Component({
@@ -6,7 +6,7 @@ import { ILink } from '../../../models/field.model';
 	templateUrl: './display.component.html',
 	styleUrls: ['./display.component.scss']
 })
-export class DisplayComponent implements OnInit {
+export class DisplayComponent implements OnChanges {
 
 	@Input()
 	meta: StringMap<any>;
@@ -14,7 +14,9 @@ export class DisplayComponent implements OnInit {
 	value: string;
 	link?: ILink;
 
-	ngOnInit() {
+	readonly componentName = 'DisplayComponent'; // For AOT compatibility, as class names don't survice minification
+
+	ngOnChanges() {
 		this.value = this.meta.value;
 		this.link = this.meta.link;
 	}

+ 5 - 3
src/app/dynaform/components/nocontrol/heading/heading.component.ts

@@ -1,11 +1,11 @@
-import { Component, Input, OnInit } from '@angular/core';
+import { Component, Input, OnChanges } from '@angular/core';
 
 @Component({
 	selector: 'app-heading',
 	templateUrl: './heading.component.html',
 	styleUrls: ['./heading.component.scss']
 })
-export class HeadingComponent implements OnInit {
+export class HeadingComponent implements OnChanges {
 
 	@Input()
 	meta: StringMap<any>;
@@ -13,7 +13,9 @@ export class HeadingComponent implements OnInit {
 	text: string;
 	level: number;
 
-	ngOnInit() {
+	readonly componentName = 'HeadingComponent'; // For AOT compatibility, as class names don't survice minification
+
+	ngOnChanges() {
 		this.text = this.meta.text;
 		this.level = this.meta.level || 2;
 	}

+ 54 - 14
src/app/dynaform/directives/dynafield.directive.ts

@@ -1,6 +1,6 @@
 import {
 	Directive, ComponentFactoryResolver, ComponentRef, ViewContainerRef,
-	Input, Output, EventEmitter, OnInit, OnDestroy,
+	Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy,
 	Optional, Self, SkipSelf, Inject
 } from '@angular/core';
 import {
@@ -11,7 +11,24 @@ import {
 } from '@angular/forms';
 
 import { ffcArr } from './../components';
-const formFieldComponents = ffcArr.reduce((acc, componentClass) => ({ ...acc, [componentClass.name]: componentClass }), {});
+// const formFieldComponents = ffcArr.reduce((acc, componentClass) => ({ ...acc, [componentClass.name]: componentClass }), {}); // Works with JIT, but not AOT
+const getFormFieldComponents = () => {
+	return ffcArr.reduce((acc, componentClass) => {
+		try {
+			const componentName = new (componentClass as any)({}, {}).componentName; // Work around AOT name-mangling by explicitly storing the name as a class property
+			if (!componentName) {
+				throw new Error(`All components must have an explicit component name - set componentName property in component's class`);
+			}
+			return { ...acc, [componentName]: componentClass }
+		} catch(e) {
+			console.error(`DYNAFORM: ERROR COMPILING HASH OF FORM FIELD COMPONENTS\n${e}`);
+			console.error(componentClass);
+			return acc;
+		}
+	}, {});
+}
+const formFieldComponents = getFormFieldComponents();
+
 
 interface IFFC {
 	control: FormControl; // Remember, this can be an individual FormControl or a FormGroup
@@ -28,7 +45,7 @@ const componentType = (type: string): string => type[0].toUpperCase() + type.sli
 	// tslint:disable-next-line:directive-selector
 	selector: '[dynafield]'
 })
-export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
+export class DynafieldDirective extends NgControl implements OnInit, OnChanges, OnDestroy {
 
 	@Input()
 	meta: StringMap<any>;
@@ -79,8 +96,6 @@ export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
 			const component = this.resolver.resolveComponentFactory<IFFC>(formFieldComponents[type]);
 			this.component = this.container.createComponent(component);
 			const instance = this.component.instance;
-			const el = this.component.location.nativeElement;
-			el.classList.add(type.toLowerCase().replace('component', ''));
 
 			// Support the recursive insertion of Dynaform components
 			if (type === 'DynaformComponent') {
@@ -90,6 +105,10 @@ export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
 				meta = meta.meta;
 			}
 
+			// Set id and classes
+			this.setCssId(cssId);
+			this.setCssClasses(type, cssClass);
+
 			// Check whether it's disabled, then set its FormControl and metadata
 			if (disabled) {
 				this.control.reset({ value: this.control.value, disabled: true });
@@ -102,15 +121,6 @@ export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
 				instance.call.subscribe((fnId: string) => this.call.emit(fnId));
 			}
 
-			// Add id and classes (as specified)
-			if (cssId) {
-				el.id = cssId;
-			}
-			if (cssClass) {
-				const classesToAdd = Array.isArray(cssClass) ? cssClass : [...cssClass.split(/\s+/)];
-				el.classList.add(...classesToAdd);
-			}
-
 			// Connect custom components
 			if (instance.propagateChange) {
 				// We're dealing with a custom form control which implements the ControlValueAccessor interface,
@@ -133,6 +143,19 @@ export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
 		}
 	}
 
+	ngOnChanges() {
+		// We won't support mutating components (e.g. Text --> Select) at this stage,
+		// but will support mutating an instantiated components metadata (e.g. changing a select's options, or css class).
+		// As the component is created in ngOnInt this does nothing in the onChanges run before ngOnInit,
+		// but responds to later input changes
+		if (this.component) {
+			const { type, class: cssClass, id: cssId } = this.meta;
+			this.setCssId(cssId);
+			this.setCssClasses(type, cssClass);
+			this.component.instance.meta = this.meta;
+		}
+	}
+
 	ngOnDestroy(): void {
 		if (this.formGroupDirective) {
 			this.formGroupDirective.removeControl(this);
@@ -174,5 +197,22 @@ export class DynafieldDirective extends NgControl implements OnInit, OnDestroy {
 		}
 	}
 
+	// ---------------------------------------
+	// Set id and classes on inserted component
+
+	setCssId(cssId): void {
+		const el = this.component.location.nativeElement;
+		cssId ? el.setAttribute('id', cssId) : el.removeAttribute('id');
+	}
+
+	setCssClasses(type, cssClass): void {
+		const el = this.component.location.nativeElement;
+		el.classList.add(type.toLowerCase().replace('component', ''));
+		if (cssClass) {
+			const classesToAdd = Array.isArray(cssClass) ? cssClass : [...cssClass.split(/\s+/)];
+			el.classList.add(...classesToAdd);
+		}
+	}
+
 }
 

+ 14 - 7
src/app/dynaform/dynaform.component.ts

@@ -1,4 +1,4 @@
-import { Component, Input, Output, EventEmitter, TemplateRef, Optional, OnInit, ChangeDetectionStrategy } from '@angular/core';
+import { Component, Input, Output, EventEmitter, TemplateRef, Optional, OnInit, OnChanges, ChangeDetectionStrategy } from '@angular/core';
 import { FormBuilder, FormControl, FormGroup, FormArray, FormGroupName, AbstractControl, ControlContainer } from '@angular/forms';
 import { SuperForm } from 'angular-super-validator';
 import { buildFormGroupFunctionFactory } from './services/_formdata-utils';
@@ -15,7 +15,7 @@ export interface DynarowContext {
 	styleUrls: ['./dynaform.component.scss'],
 	changeDetection: ChangeDetectionStrategy.Default // or ChangeDetectionStrategy.OnPush - might be more efficient. Experiment later.
 })
-export class DynaformComponent implements OnInit {
+export class DynaformComponent implements OnInit, OnChanges {
 
 	/*
 	 * DynaformComponent: <app-dynaform>
@@ -43,7 +43,9 @@ export class DynaformComponent implements OnInit {
 
 	@Input()
 	set meta(data) {
-		this.formMetaData = this.formMetaData || data;
+		// console.log('Dynaform Set Meta');
+		// this.formMetaData = this.formMetaData || data; // WHY? WHY? WHY? - leave in for now, just in case
+		this.formMetaData = data;
 	}
 
 	@Input()
@@ -65,10 +67,16 @@ export class DynaformComponent implements OnInit {
 	conGreen = 'color: white; background-color: green; font-weight: bold;';
 
 	constructor(
-		@Optional() private cc: ControlContainer,
+		@Optional() private cc: ControlContainer
 	) {}
 
 	ngOnInit() {
+		// console.log('Dyanaform ngOnInit');
+	}
+
+	ngOnChanges() {
+		// Triggered when inputs change
+		// console.log('Dynaform ngOnChanges');
 		// Get the formGroup from the formGroupName if necessary
 		if (!this.formGroup && this.formGroupName) {
 			this.formGroup = this.cc.control as FormGroup; // Get theFormGroup from the injected ControlContainer
@@ -84,7 +92,6 @@ export class DynaformComponent implements OnInit {
 		if (this.debug && this.path.length < 2) {
 			this.displayDebuggingInConsole();
 		}
-
 		// If we're given a formGroupName or nested FormGroup, and the form's full (or partial but fuller) metadata tree,
 		// drill down to find *this* FormGroup's metadata
 		const path = [...this.path]; // Clone to avoid mutating this.path
@@ -128,7 +135,7 @@ export class DynaformComponent implements OnInit {
 	isField(meta: StringMap<any>): boolean {
 		return !meta.type.includes('Container');
 	}
-	
+
 	isRepeatingContainer(meta: StringMap<any>): boolean {
 		return meta.type === 'RepeatingContainer';
 	}
@@ -178,7 +185,7 @@ export class DynaformComponent implements OnInit {
 		const rcMeta = this.formMetaData[repeatingContainerName];
 		const rcFormArray = this.formGroup.get(repeatingContainerName) as FormArray;
 		rcMeta.meta = rcMeta.meta.map( (container, i) => ({ ...container, focussed: i === index }) );
-		
+
 	}
 
 	// RC = Repeating Container

+ 2 - 2
src/app/dynaform/models/field.model.ts

@@ -321,7 +321,7 @@ class RepeatingContainer {
 		if (!containerMeta.initialRepeat) {
 			this.initialRepeat = containerMeta.meta.length;
 		}
-		this.meta = containerMeta.meta.map((m, i) => new Container({ 
+		this.meta = containerMeta.meta.map((m, i) => new Container({
 			name: `${this.prefix}${i+1}`,
 			meta: m,
 			button: unCamelCase(`${this.prefix}${i+1}`),
@@ -399,7 +399,7 @@ export {
 
 // Classes
 export {
-	SimpleField,
+	SimpleField, Option,
 	TextField, TextareaField, PasswordField, SelectField, RadioField, CheckboxField, HiddenField,
 	CheckbuttonField, DropdownModifiedInputField, MultilineField,
 	CheckboxGroup, CheckbuttonGroup,

+ 13 - 0
src/app/dynaform/services/dynaform.service.ts

@@ -100,6 +100,8 @@ import {
 	buildFieldSpecificMetaInClosure, extractFieldMappings, buildFormGroupFunctionFactory, generateNewModel
 } from './_formdata-utils';
 
+import { Option } from './../models/field.model';
+
 export interface IFormAndMeta {
 	form: FormGroup;
 	meta: StringMap<any>;
@@ -242,5 +244,16 @@ export class DynaformService {
 		return autoMeta(model);
 	}
 
+	// -----------------------------------------------------------------------------------------------------------------
+	// Convenience methods
+
+	buildOptions(options): Option[] {
+		if (Array.isArray(options)) {
+			return options.reduce((acc, opt) => { acc.push(new Option(opt)); return acc; }, []);
+		} else {
+			throw new Error('Options must be supplied as an array');
+		}
+	}
+
 }